You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2024/02/02 14:58:45 UTC

(arrow-datafusion) 02/03: Fix columnar value to array

This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch alamb/array_crate
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git

commit 2d6512aa567ef1f0b9dbf7db55a704684858298c
Author: Andrew Lamb <an...@nerdnetworks.org>
AuthorDate: Fri Feb 2 09:49:41 2024 -0500

    Fix columnar value to array
---
 datafusion/core/src/execution/context/mod.rs |  1 -
 datafusion/expr/src/columnar_value.rs        | 40 +++++++++++-----------------
 2 files changed, 16 insertions(+), 25 deletions(-)

diff --git a/datafusion/core/src/execution/context/mod.rs b/datafusion/core/src/execution/context/mod.rs
index abeffa6354..3661f6973c 100644
--- a/datafusion/core/src/execution/context/mod.rs
+++ b/datafusion/core/src/execution/context/mod.rs
@@ -1353,7 +1353,6 @@ impl SessionState {
         datafusion_functions_array::register_all(&mut new_self)
             .expect("can not register array expressions");
 
-
         new_self
     }
     /// Returns new [`SessionState`] using the provided
diff --git a/datafusion/expr/src/columnar_value.rs b/datafusion/expr/src/columnar_value.rs
index 95369c2242..5f2481ebc6 100644
--- a/datafusion/expr/src/columnar_value.rs
+++ b/datafusion/expr/src/columnar_value.rs
@@ -20,7 +20,7 @@
 use arrow::array::ArrayRef;
 use arrow::array::NullArray;
 use arrow::datatypes::DataType;
-use datafusion_common::{DataFusionError, Result, ScalarValue};
+use datafusion_common::{internal_err, DataFusionError, Result, ScalarValue};
 use std::sync::Arc;
 
 /// Represents the result of evaluating an expression: either a single
@@ -86,33 +86,25 @@ impl ColumnarValue {
             return Ok(vec![]);
         }
 
-        let len = args
-            .iter()
-            .fold(Option::<usize>::None, |acc, arg| match arg {
-                ColumnarValue::Scalar(_) if acc.is_none() => Some(1),
-                ColumnarValue::Scalar(_) => {
-                    if let Some(1) = acc {
-                        acc
+        let mut array_len = None;
+        for arg in args {
+            array_len = match (arg, array_len) {
+                (ColumnarValue::Array(a), None) => Some(a.len()),
+                (ColumnarValue::Array(a), Some(array_len)) => {
+                    if array_len == a.len() {
+                        Some(array_len)
                     } else {
-                        None
+                        return internal_err!(
+                            "Arguments has mixed length. Expected length: {array_len}, found length: {}",a.len()
+                        );
                     }
                 }
-                ColumnarValue::Array(a) => {
-                    if let Some(l) = acc {
-                        if l == a.len() {
-                            acc
-                        } else {
-                            None
-                        }
-                    } else {
-                        Some(a.len())
-                    }
-                }
-            });
+                (ColumnarValue::Scalar(_), array_len) => array_len,
+            }
+        }
 
-        let inferred_length = len.ok_or(DataFusionError::Internal(
-            "Arguments has mixed length".to_string(),
-        ))?;
+        // If array_len is none, it means there are only scalars, so make a 1 element array
+        let inferred_length = array_len.unwrap_or(1);
 
         let args = args
             .iter()