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

dbtsai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark-connect-rust.git


The following commit(s) were added to refs/heads/master by this push:
     new c36c846  [SPARK-60585][CONNECT][FOLLOWUP] Address row-sharing review 
feedback (#106)
c36c846 is described below

commit c36c846fcb4f22c9995e5de5c69c45ae76a5ad9a
Author: DB Tsai <[email protected]>
AuthorDate: Tue Oct 27 15:51:32 2026 -0700

    [SPARK-60585][CONNECT][FOLLOWUP] Address row-sharing review feedback (#106)
    
    Reserve decoder row values, document the owned/shared name representation,
    and keep tests focused on decoded values and field-name sharing.
    
    Co-authored-by: Isaac <[email protected]>
---
 crates/spark-connect/src/catalog.rs   | 52 -----------------------------------
 crates/spark-connect/src/dataframe.rs |  2 +-
 crates/spark-connect/src/row.rs       | 41 ++++-----------------------
 3 files changed, 6 insertions(+), 89 deletions(-)

diff --git a/crates/spark-connect/src/catalog.rs 
b/crates/spark-connect/src/catalog.rs
index 7ce672a..ec705fc 100644
--- a/crates/spark-connect/src/catalog.rs
+++ b/crates/spark-connect/src/catalog.rs
@@ -1082,55 +1082,3 @@ impl Catalog {
         Ok(request)
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn parse_database_preserves_metadata_and_nullable_columns() {
-        let fields = vec![
-            "name".to_string(),
-            "catalog".to_string(),
-            "description".to_string(),
-            "locationUri".to_string(),
-        ];
-        let populated = Row::new(
-            fields.clone(),
-            vec![
-                Value::String("one".to_string()),
-                Value::String("spark_catalog".to_string()),
-                Value::String("first database".to_string()),
-                Value::String("file:/one".to_string()),
-            ],
-        );
-        let nullable = Row::new(
-            fields,
-            vec![
-                Value::String("two".to_string()),
-                Value::Null,
-                Value::Null,
-                Value::String("file:/two".to_string()),
-            ],
-        );
-
-        assert_eq!(
-            parse_database(&populated),
-            Database {
-                name: "one".to_string(),
-                catalog: Some("spark_catalog".to_string()),
-                description: Some("first database".to_string()),
-                location_uri: "file:/one".to_string(),
-            }
-        );
-        assert_eq!(
-            parse_database(&nullable),
-            Database {
-                name: "two".to_string(),
-                catalog: None,
-                description: None,
-                location_uri: "file:/two".to_string(),
-            }
-        );
-    }
-}
diff --git a/crates/spark-connect/src/dataframe.rs 
b/crates/spark-connect/src/dataframe.rs
index 72dff2f..ea0e2c6 100644
--- a/crates/spark-connect/src/dataframe.rs
+++ b/crates/spark-connect/src/dataframe.rs
@@ -2092,7 +2092,7 @@ pub(crate) fn decode_arrow_batch(
             .collect::<Vec<_>>();
 
         for row_idx in 0..num_rows {
-            let mut values = vec![];
+            let mut values = Vec::with_capacity(record_batch.num_columns());
 
             for (column, layout) in 
record_batch.columns().iter().zip(&layouts) {
                 let value = arrow_value_at_with_layout(column.as_ref(), 
row_idx, layout)?;
diff --git a/crates/spark-connect/src/row.rs b/crates/spark-connect/src/row.rs
index a4b3f52..4c9cf5c 100644
--- a/crates/spark-connect/src/row.rs
+++ b/crates/spark-connect/src/row.rs
@@ -281,6 +281,7 @@ impl StructValue {
     }
 }
 
+// Keep local constructors free of Arc conversion allocations while sharing 
decoded batch names.
 #[derive(Clone)]
 enum RowFields {
     Owned(Vec<String>),
@@ -465,45 +466,13 @@ mod tests {
     }
 
     #[test]
-    fn cloned_rows_share_field_names_and_keep_values_independent() {
-        let fields: Arc<[String]> = vec!["items".to_string()].into();
-        let row = Row::with_shared_fields(
-            Arc::clone(&fields),
-            vec![Value::List(vec![Value::String("original".to_string())])],
-        );
-        let mut cloned = row.clone();
+    fn cloned_rows_share_field_names() {
+        let fields: Arc<[String]> = vec!["id".to_string()].into();
+        let row = Row::with_shared_fields(Arc::clone(&fields), 
vec![Value::Long(1)]);
+        let cloned = row.clone();
 
         assert!(std::ptr::eq(fields.as_ref(), row.fields()));
         assert!(std::ptr::eq(row.fields(), cloned.fields()));
-        let Value::List(items) = &mut cloned.values[0] else {
-            panic!("expected a list value");
-        };
-        items[0] = Value::String("changed".to_string());
-        assert_eq!(
-            row.get(0),
-            Some(&Value::List(vec![Value::String("original".to_string())]))
-        );
-        assert_ne!(row.values(), cloned.values());
-    }
-
-    #[test]
-    fn constructed_rows_clone_values_independently() {
-        let row = Row::new(
-            vec!["items".to_string()],
-            vec![Value::List(vec![Value::String("original".to_string())])],
-        );
-
-        let mut cloned = row.clone();
-        assert_eq!(row.fields(), cloned.fields());
-        let Value::List(items) = &mut cloned.values[0] else {
-            panic!("expected a list value");
-        };
-        items[0] = Value::String("changed".to_string());
-        assert_eq!(
-            row.get(0),
-            Some(&Value::List(vec![Value::String("original".to_string())]))
-        );
-        assert_ne!(row.values(), cloned.values());
     }
 
     #[test]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to