Skip to content

Commit eb72deb

Browse files
authored
Support Duration and Union types in ScalarValue::iter_to_array (#10139)
1 parent 16e3831 commit eb72deb

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

datafusion/common/src/scalar/mod.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,18 @@ impl ScalarValue {
15751575
tz
15761576
)
15771577
}
1578+
DataType::Duration(TimeUnit::Second) => {
1579+
build_array_primitive!(DurationSecondArray, DurationSecond)
1580+
}
1581+
DataType::Duration(TimeUnit::Millisecond) => {
1582+
build_array_primitive!(DurationMillisecondArray, DurationMillisecond)
1583+
}
1584+
DataType::Duration(TimeUnit::Microsecond) => {
1585+
build_array_primitive!(DurationMicrosecondArray, DurationMicrosecond)
1586+
}
1587+
DataType::Duration(TimeUnit::Nanosecond) => {
1588+
build_array_primitive!(DurationNanosecondArray, DurationNanosecond)
1589+
}
15781590
DataType::Interval(IntervalUnit::DayTime) => {
15791591
build_array_primitive!(IntervalDayTimeArray, IntervalDayTime)
15801592
}
@@ -1605,7 +1617,10 @@ impl ScalarValue {
16051617
let arrays = arrays.iter().map(|a| a.as_ref()).collect::<Vec<_>>();
16061618
arrow::compute::concat(arrays.as_slice())?
16071619
}
1608-
DataType::List(_) | DataType::LargeList(_) | DataType::Struct(_) => {
1620+
DataType::List(_)
1621+
| DataType::LargeList(_)
1622+
| DataType::Struct(_)
1623+
| DataType::Union(_, _) => {
16091624
let arrays = scalars.map(|s| s.to_array()).collect::<Result<Vec<_>>>()?;
16101625
let arrays = arrays.iter().map(|a| a.as_ref()).collect::<Vec<_>>();
16111626
arrow::compute::concat(arrays.as_slice())?
@@ -1673,8 +1688,6 @@ impl ScalarValue {
16731688
| DataType::Time32(TimeUnit::Nanosecond)
16741689
| DataType::Time64(TimeUnit::Second)
16751690
| DataType::Time64(TimeUnit::Millisecond)
1676-
| DataType::Duration(_)
1677-
| DataType::Union(_, _)
16781691
| DataType::Map(_, _)
16791692
| DataType::RunEndEncoded(_, _)
16801693
| DataType::Utf8View

datafusion/sqllogictest/test_files/aggregate.slt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1983,6 +1983,12 @@ SELECT avg(nanos), avg(micros), avg(millis), avg(secs) FROM t
19831983
statement error DataFusion error: Error during planning: No function matches the given name and argument types 'AVG\(Timestamp\(Nanosecond, None\)\)'\. You might need to add explicit type casts\.
19841984
SELECT tag, avg(nanos), avg(micros), avg(millis), avg(secs) FROM t GROUP BY tag ORDER BY tag;
19851985

1986+
# aggregate_duration_array_agg
1987+
query T?
1988+
SELECT tag, array_agg(millis - arrow_cast(secs, 'Timestamp(Millisecond, None)')) FROM t GROUP BY tag ORDER BY tag;
1989+
----
1990+
X [0 days 0 hours 0 mins 0.011 secs, 0 days 0 hours 0 mins 0.123 secs]
1991+
Y [, 0 days 0 hours 0 mins 0.432 secs]
19861992

19871993
statement ok
19881994
drop table t_source;

0 commit comments

Comments
 (0)