MCPcopy Create free account
hub / github.com/apache/datafusion / spark_concat

Function spark_concat

datafusion/spark/src/function/string/concat.rs:104–158  ·  view source on GitHub ↗

Concatenates strings, returning NULL if any input is NULL This is a Spark-specific wrapper around DataFusion's concat that returns NULL if any argument is NULL (Spark behavior), whereas DataFusion's concat ignores NULLs.

(args: ScalarFunctionArgs)

Source from the content-addressed store, hash-verified

102/// This is a Spark-specific wrapper around DataFusion's concat that returns NULL
103/// if any argument is NULL (Spark behavior), whereas DataFusion's concat ignores NULLs.
104fn spark_concat(args: ScalarFunctionArgs) -> Result<ColumnarValue> {
105 let ScalarFunctionArgs {
106 args: arg_values,
107 arg_fields,
108 number_rows,
109 return_field,
110 config_options,
111 } = args;
112
113 // Handle zero-argument case: return empty string
114 if arg_values.is_empty() {
115 let return_type = return_field.data_type();
116 return match return_type {
117 DataType::Utf8View => Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(Some(
118 String::new(),
119 )))),
120 DataType::LargeUtf8 => Ok(ColumnarValue::Scalar(ScalarValue::LargeUtf8(
121 Some(String::new()),
122 ))),
123 _ => Ok(ColumnarValue::Scalar(ScalarValue::Utf8(
124 Some(String::new()),
125 ))),
126 };
127 }
128
129 // Step 1: Check for NULL mask in incoming args
130 let null_mask = compute_null_mask(&arg_values);
131
132 // If all scalars and any is NULL, return NULL immediately
133 if matches!(null_mask, NullMaskResolution::ReturnNull) {
134 let return_type = return_field.data_type();
135 return match return_type {
136 DataType::Utf8View => Ok(ColumnarValue::Scalar(ScalarValue::Utf8View(None))),
137 DataType::LargeUtf8 => {
138 Ok(ColumnarValue::Scalar(ScalarValue::LargeUtf8(None)))
139 }
140 _ => Ok(ColumnarValue::Scalar(ScalarValue::Utf8(None))),
141 };
142 }
143
144 // Step 2: Delegate to DataFusion's concat
145 let concat_func = ConcatFunc::new();
146 let return_type = return_field.data_type().clone();
147 let func_args = ScalarFunctionArgs {
148 args: arg_values,
149 arg_fields,
150 number_rows,
151 return_field,
152 config_options,
153 };
154 let result = concat_func.invoke_with_args(func_args)?;
155
156 // Step 3: Apply NULL mask to result
157 apply_null_mask(result, null_mask, &return_type)
158}
159
160#[cfg(test)]
161mod tests {

Callers 1

invoke_with_argsMethod · 0.85

Calls 7

newFunction · 0.85
compute_null_maskFunction · 0.85
apply_null_maskFunction · 0.85
is_emptyMethod · 0.45
data_typeMethod · 0.45
cloneMethod · 0.45
invoke_with_argsMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…