From 518c00b33a24d093d0c7a3226b9db407c051a4f1 Mon Sep 17 00:00:00 2001 From: Mikhail Zabaluev Date: Mon, 3 Aug 2026 20:52:10 +0300 Subject: [PATCH 1/2] feat: re-expose string builder API for concat The builders hidden by https://github.com/apache/datafusion/pull/21695 are useful for third party UDFs that want to implement their own concat functions, e.g. one that faithfully replicates the behavior of Spark's concat. --- datafusion/functions/src/strings.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/datafusion/functions/src/strings.rs b/datafusion/functions/src/strings.rs index c788c6fb1f33f..28e955341bb36 100644 --- a/datafusion/functions/src/strings.rs +++ b/datafusion/functions/src/strings.rs @@ -39,7 +39,7 @@ use datafusion_common::cast::{ use datafusion_expr_common::columnar_value::ColumnarValue; /// Trait abstracting concatenating string and binary collections. -pub(crate) trait ConcatBuilder { +pub trait ConcatBuilder { fn write( &mut self, column: &ColumnarValueRef, @@ -61,13 +61,13 @@ pub(crate) trait ConcatBuilder { /// /// For the common "produce one `&str` per row" pattern, prefer /// `GenericStringArrayBuilder` instead. -pub(crate) struct ConcatGenericStringBuilder { +pub struct ConcatGenericStringBuilder { offsets_buffer: MutableBuffer, value_buffer: MutableBuffer, _phantom: PhantomData, } -pub(crate) type ConcatStringBuilder = ConcatGenericStringBuilder; -pub(crate) type ConcatLargeStringBuilder = ConcatGenericStringBuilder; +pub type ConcatStringBuilder = ConcatGenericStringBuilder; +pub type ConcatLargeStringBuilder = ConcatGenericStringBuilder; impl ConcatGenericStringBuilder { pub fn with_capacity(item_capacity: usize, data_capacity: usize) -> Self { @@ -187,7 +187,7 @@ impl ConcatBuilder /// /// For the common "produce one `&str` per row" pattern, prefer /// [`StringViewArrayBuilder`] instead. -pub(crate) struct ConcatStringViewBuilder { +pub struct ConcatStringViewBuilder { views: Vec, data: Vec, block: Vec, @@ -1217,7 +1217,7 @@ pub(crate) fn append_view( } #[derive(Debug)] -pub(crate) enum ColumnarValueRef<'a> { +pub enum ColumnarValueRef<'a> { Scalar(&'a [u8]), NullableArray(&'a StringArray), NonNullableArray(&'a StringArray), From b7a8ce4735fd90ce79c0870e10f9543d73eb6144 Mon Sep 17 00:00:00 2001 From: Mikhail Zabaluev Date: Tue, 4 Aug 2026 00:24:38 +0300 Subject: [PATCH 2/2] chore: fix doc comment Remove a reference to a private type from the doc comment on ConcatGenericStringBuilder, which is now public. Turn the paragraph into a plain comment with a note to add it later if StringViewArrayBuilder is made public. --- datafusion/functions/src/strings.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/datafusion/functions/src/strings.rs b/datafusion/functions/src/strings.rs index 28e955341bb36..58223e33d3815 100644 --- a/datafusion/functions/src/strings.rs +++ b/datafusion/functions/src/strings.rs @@ -184,9 +184,11 @@ impl ConcatBuilder /// fragment) followed by a single `append_offset` to commit the row /// as a single string view. The output null buffer is supplied by the caller /// at `finish` time, avoiding per-row NULL handling work. -/// -/// For the common "produce one `&str` per row" pattern, prefer -/// [`StringViewArrayBuilder`] instead. +// +// Add below to the doc comment if StringViewArrayBuilder is made public: +// +// For the common "produce one `&str` per row" pattern, prefer +// [`StringViewArrayBuilder`] instead. pub struct ConcatStringViewBuilder { views: Vec, data: Vec,