You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by pa...@apache.org on 2026/07/13 18:20:09 UTC

(sedona-db) branch main updated: fix(rust/sedona-functions): Fix scalar iteration with num_iterations > 1 (#1041)

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

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git


The following commit(s) were added to refs/heads/main by this push:
     new ed5c60d7f fix(rust/sedona-functions): Fix scalar iteration with num_iterations > 1 (#1041)
ed5c60d7f is described below

commit ed5c60d7fa283d702e3a15f4654cf4ec7b8d66cc
Author: Dewey Dunnington <de...@dunnington.ca>
AuthorDate: Mon Jul 13 18:20:04 2026 +0000

    fix(rust/sedona-functions): Fix scalar iteration with num_iterations > 1 (#1041)
    
    Co-authored-by: Copilot Autofix powered by AI <17...@users.noreply.github.com>
---
 c/sedona-geos/src/st_area.rs                       |  2 +-
 c/sedona-geos/src/st_boundary.rs                   |  2 +-
 c/sedona-geos/src/st_buffer.rs                     |  2 +-
 c/sedona-geos/src/st_buildarea.rs                  |  2 +-
 c/sedona-geos/src/st_centroid.rs                   |  2 +-
 c/sedona-geos/src/st_concavehull.rs                |  2 +-
 c/sedona-geos/src/st_convexhull.rs                 |  2 +-
 c/sedona-geos/src/st_delaunaytriangles.rs          |  6 +-
 c/sedona-geos/src/st_exteriorring.rs               |  2 +-
 c/sedona-geos/src/st_isring.rs                     |  2 +-
 c/sedona-geos/src/st_issimple.rs                   |  2 +-
 c/sedona-geos/src/st_isvalid.rs                    |  2 +-
 c/sedona-geos/src/st_isvalidreason.rs              |  2 +-
 c/sedona-geos/src/st_length.rs                     |  2 +-
 c/sedona-geos/src/st_line_merge.rs                 |  2 +-
 c/sedona-geos/src/st_makevalid.rs                  |  2 +-
 c/sedona-geos/src/st_minimumclearance.rs           |  2 +-
 c/sedona-geos/src/st_minimumclearance_line.rs      |  2 +-
 c/sedona-geos/src/st_normalize.rs                  |  2 +-
 c/sedona-geos/src/st_nrings.rs                     |  2 +-
 c/sedona-geos/src/st_numinteriorrings.rs           |  2 +-
 c/sedona-geos/src/st_perimeter.rs                  |  2 +-
 c/sedona-geos/src/st_pointonsurface.rs             |  2 +-
 c/sedona-geos/src/st_polygonize.rs                 |  2 +-
 c/sedona-geos/src/st_reduce_precision.rs           |  2 +-
 c/sedona-geos/src/st_simplify.rs                   |  2 +-
 c/sedona-geos/src/st_simplifypreservetopology.rs   |  2 +-
 c/sedona-geos/src/st_unaryunion.rs                 |  2 +-
 c/sedona-proj/src/st_transform.rs                  |  6 +-
 rust/sedona-functions/src/executor.rs              | 88 +++++++++++++++++++---
 rust/sedona-functions/src/st_affine.rs             |  2 +-
 rust/sedona-functions/src/st_asewkb.rs             |  4 +-
 rust/sedona-functions/src/st_dimension.rs          |  2 +-
 rust/sedona-functions/src/st_dump.rs               |  2 +-
 rust/sedona-functions/src/st_flipcoordinates.rs    |  2 +-
 rust/sedona-functions/src/st_geometryn.rs          |  2 +-
 rust/sedona-functions/src/st_interiorringn.rs      |  2 +-
 rust/sedona-functions/src/st_isclosed.rs           |  2 +-
 rust/sedona-functions/src/st_isempty.rs            |  2 +-
 rust/sedona-functions/src/st_points.rs             |  6 +-
 rust/sedona-functions/src/st_reverse.rs            |  2 +-
 rust/sedona-functions/src/st_rotate.rs             |  2 +-
 rust/sedona-functions/src/st_scale.rs              |  2 +-
 rust/sedona-functions/src/st_segmentize.rs         |  2 +-
 rust/sedona-functions/src/st_start_point.rs        |  2 +-
 rust/sedona-functions/src/st_xyzm.rs               |  2 +-
 rust/sedona-functions/src/st_xyzm_minmax.rs        |  2 +-
 rust/sedona-geo/src/st_area.rs                     |  2 +-
 rust/sedona-geo/src/st_asgeojson.rs                |  2 +-
 rust/sedona-geo/src/st_buffer.rs                   |  2 +-
 rust/sedona-geo/src/st_centroid.rs                 |  2 +-
 rust/sedona-geo/src/st_concavehull.rs              |  2 +-
 rust/sedona-geo/src/st_intersection_agg.rs         |  2 +-
 rust/sedona-geo/src/st_length.rs                   |  2 +-
 rust/sedona-geo/src/st_line_interpolate_point.rs   |  2 +-
 rust/sedona-geo/src/st_perimeter.rs                |  2 +-
 rust/sedona-geo/src/st_union_agg.rs                |  2 +-
 rust/sedona-geo/src/to_geo.rs                      |  2 +-
 rust/sedona-geometry/src/bounds.rs                 | 14 ++--
 rust/sedona-geoparquet/src/writer.rs               |  4 +-
 rust/sedona-spatial-join/src/operand_evaluator.rs  | 36 ++++++---
 .../tests/spatial_join_integration.rs              |  2 +-
 62 files changed, 176 insertions(+), 96 deletions(-)

diff --git a/c/sedona-geos/src/st_area.rs b/c/sedona-geos/src/st_area.rs
index 7cd7bf828..7b02e65e1 100644
--- a/c/sedona-geos/src/st_area.rs
+++ b/c/sedona-geos/src/st_area.rs
@@ -57,7 +57,7 @@ impl SedonaScalarKernel for STArea {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_boundary.rs b/c/sedona-geos/src/st_boundary.rs
index 37096a56b..4c41c4574 100644
--- a/c/sedona-geos/src/st_boundary.rs
+++ b/c/sedona-geos/src/st_boundary.rs
@@ -70,7 +70,7 @@ impl SedonaScalarKernel for STBoundary {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_buffer.rs b/c/sedona-geos/src/st_buffer.rs
index 29718a72f..d79e45dc8 100644
--- a/c/sedona-geos/src/st_buffer.rs
+++ b/c/sedona-geos/src/st_buffer.rs
@@ -132,7 +132,7 @@ fn invoke_batch_impl(arg_types: &[SedonaType], args: &[ColumnarValue]) -> Result
                 if (is_left && distance < 0.0) || (is_right && distance > 0.0) {
                     distance = -distance;
                 }
-                invoke_scalar(&wkb, distance, &params, &mut builder)?;
+                invoke_scalar(wkb, distance, &params, &mut builder)?;
                 builder.append_value([]);
             }
             _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_buildarea.rs b/c/sedona-geos/src/st_buildarea.rs
index 091738747..b3c441a40 100644
--- a/c/sedona-geos/src/st_buildarea.rs
+++ b/c/sedona-geos/src/st_buildarea.rs
@@ -64,7 +64,7 @@ impl SedonaScalarKernel for STBuildArea {
         executor.execute_wkb_void(|maybe_geom| {
             match maybe_geom {
                 Some(geom) => {
-                    if invoke_scalar(&geom, &mut builder)? {
+                    if invoke_scalar(geom, &mut builder)? {
                         builder.append_value([]);
                     } else {
                         builder.append_null();
diff --git a/c/sedona-geos/src/st_centroid.rs b/c/sedona-geos/src/st_centroid.rs
index 793b0215b..f1cc2d216 100644
--- a/c/sedona-geos/src/st_centroid.rs
+++ b/c/sedona-geos/src/st_centroid.rs
@@ -61,7 +61,7 @@ impl SedonaScalarKernel for STCentroid {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_concavehull.rs b/c/sedona-geos/src/st_concavehull.rs
index 31c31d9c6..09adce667 100644
--- a/c/sedona-geos/src/st_concavehull.rs
+++ b/c/sedona-geos/src/st_concavehull.rs
@@ -121,7 +121,7 @@ fn invoke_batch_impl(arg_types: &[SedonaType], args: &[ColumnarValue]) -> Result
             allow_holes_iter.next().unwrap(),
         ) {
             (Some(wkb), Some(pct_convex), Some(allow_holes)) => {
-                invoke_scalar(&wkb, pct_convex, allow_holes, &mut builder)?;
+                invoke_scalar(wkb, pct_convex, allow_holes, &mut builder)?;
                 builder.append_value([]);
             }
             _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_convexhull.rs b/c/sedona-geos/src/st_convexhull.rs
index a034ead12..84d987a7b 100644
--- a/c/sedona-geos/src/st_convexhull.rs
+++ b/c/sedona-geos/src/st_convexhull.rs
@@ -61,7 +61,7 @@ impl SedonaScalarKernel for STConvexHull {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_delaunaytriangles.rs b/c/sedona-geos/src/st_delaunaytriangles.rs
index 352aef1ce..6305c965f 100644
--- a/c/sedona-geos/src/st_delaunaytriangles.rs
+++ b/c/sedona-geos/src/st_delaunaytriangles.rs
@@ -78,7 +78,7 @@ impl SedonaScalarKernel for STDelaunayTriangles {
         executor.execute_wkb_void(|maybe_geom| {
             match maybe_geom {
                 Some(geom) => {
-                    invoke_scalar(&geom, 0.0, false, &mut builder)?;
+                    invoke_scalar(geom, 0.0, false, &mut builder)?;
                     builder.append_value([]);
                 }
                 None => builder.append_null(),
@@ -125,7 +125,7 @@ impl SedonaScalarKernel for STDelaunayTrianglesWithTolerance {
         executor.execute_wkb_void(|maybe_geom| {
             match (maybe_geom, tol_iter.next().unwrap()) {
                 (Some(geom), Some(tol)) => {
-                    invoke_scalar(&geom, tol, false, &mut builder)?;
+                    invoke_scalar(geom, tol, false, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
@@ -197,7 +197,7 @@ impl SedonaScalarKernel for STDelaunayTrianglesWithFlags {
                             ))
                         }
                     };
-                    invoke_scalar(&geom, tol, only_edges, &mut builder)?;
+                    invoke_scalar(geom, tol, only_edges, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_exteriorring.rs b/c/sedona-geos/src/st_exteriorring.rs
index 35e9dd383..0b8aff799 100644
--- a/c/sedona-geos/src/st_exteriorring.rs
+++ b/c/sedona-geos/src/st_exteriorring.rs
@@ -71,7 +71,7 @@ impl SedonaScalarKernel for STExteriorRing {
         executor.execute_wkb_void(|maybe_geom| {
             match maybe_geom {
                 Some(geom) => {
-                    if invoke_scalar(&geom, &mut builder)? {
+                    if invoke_scalar(geom, &mut builder)? {
                         builder.append_value([]);
                     } else {
                         builder.append_null();
diff --git a/c/sedona-geos/src/st_isring.rs b/c/sedona-geos/src/st_isring.rs
index 4f3697ee3..f80bdb390 100644
--- a/c/sedona-geos/src/st_isring.rs
+++ b/c/sedona-geos/src/st_isring.rs
@@ -59,7 +59,7 @@ impl SedonaScalarKernel for STIsRing {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_issimple.rs b/c/sedona-geos/src/st_issimple.rs
index f7a52faec..ba9e160e9 100644
--- a/c/sedona-geos/src/st_issimple.rs
+++ b/c/sedona-geos/src/st_issimple.rs
@@ -58,7 +58,7 @@ impl SedonaScalarKernel for STIsSimple {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_isvalid.rs b/c/sedona-geos/src/st_isvalid.rs
index cb1839479..97ce3bfe0 100644
--- a/c/sedona-geos/src/st_isvalid.rs
+++ b/c/sedona-geos/src/st_isvalid.rs
@@ -57,7 +57,7 @@ impl SedonaScalarKernel for STIsValid {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_isvalidreason.rs b/c/sedona-geos/src/st_isvalidreason.rs
index 527c520b1..f2ba8f92e 100644
--- a/c/sedona-geos/src/st_isvalidreason.rs
+++ b/c/sedona-geos/src/st_isvalidreason.rs
@@ -61,7 +61,7 @@ impl SedonaScalarKernel for STIsValidReason {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_length.rs b/c/sedona-geos/src/st_length.rs
index d196c27d2..c9daedc8f 100644
--- a/c/sedona-geos/src/st_length.rs
+++ b/c/sedona-geos/src/st_length.rs
@@ -60,7 +60,7 @@ impl SedonaScalarKernel for STLength {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb).map_err(|e| {
+                    builder.append_value(invoke_scalar(wkb).map_err(|e| {
                         DataFusionError::Execution(format!("Failed to calculate length: {e}"))
                     })?);
                 }
diff --git a/c/sedona-geos/src/st_line_merge.rs b/c/sedona-geos/src/st_line_merge.rs
index 148b59806..3dbcac27c 100644
--- a/c/sedona-geos/src/st_line_merge.rs
+++ b/c/sedona-geos/src/st_line_merge.rs
@@ -89,7 +89,7 @@ impl SedonaScalarKernel for STLineMerge {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder, directed)?;
+                    invoke_scalar(wkb, &mut builder, directed)?;
                     builder.append_value([]);
                 }
                 None => builder.append_null(),
diff --git a/c/sedona-geos/src/st_makevalid.rs b/c/sedona-geos/src/st_makevalid.rs
index cefc7b747..3ad204d56 100644
--- a/c/sedona-geos/src/st_makevalid.rs
+++ b/c/sedona-geos/src/st_makevalid.rs
@@ -63,7 +63,7 @@ impl SedonaScalarKernel for STMakeValid {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_minimumclearance.rs b/c/sedona-geos/src/st_minimumclearance.rs
index bdf8c6eed..7749449e0 100644
--- a/c/sedona-geos/src/st_minimumclearance.rs
+++ b/c/sedona-geos/src/st_minimumclearance.rs
@@ -58,7 +58,7 @@ impl SedonaScalarKernel for STMinimumClearance {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/c/sedona-geos/src/st_minimumclearance_line.rs b/c/sedona-geos/src/st_minimumclearance_line.rs
index 947cce48e..196a85a34 100644
--- a/c/sedona-geos/src/st_minimumclearance_line.rs
+++ b/c/sedona-geos/src/st_minimumclearance_line.rs
@@ -63,7 +63,7 @@ impl SedonaScalarKernel for STMinimumClearanceLine {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_normalize.rs b/c/sedona-geos/src/st_normalize.rs
index c66cf2c7f..fc4d069dc 100644
--- a/c/sedona-geos/src/st_normalize.rs
+++ b/c/sedona-geos/src/st_normalize.rs
@@ -67,7 +67,7 @@ impl SedonaScalarKernel for STNormalize {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_nrings.rs b/c/sedona-geos/src/st_nrings.rs
index d810624f1..b42b3b0df 100644
--- a/c/sedona-geos/src/st_nrings.rs
+++ b/c/sedona-geos/src/st_nrings.rs
@@ -56,7 +56,7 @@ impl SedonaScalarKernel for STNRings {
             match maybe_geom {
                 None => builder.append_null(),
                 Some(geom) => {
-                    let val = invoke_scalar(&geom)?;
+                    let val = invoke_scalar(geom)?;
                     builder.append_value(val);
                 }
             }
diff --git a/c/sedona-geos/src/st_numinteriorrings.rs b/c/sedona-geos/src/st_numinteriorrings.rs
index 6c2586b08..30d461866 100644
--- a/c/sedona-geos/src/st_numinteriorrings.rs
+++ b/c/sedona-geos/src/st_numinteriorrings.rs
@@ -57,7 +57,7 @@ impl SedonaScalarKernel for STNumInteriorRings {
             match maybe_geom {
                 None => builder.append_null(),
                 Some(geom) => {
-                    let res = invoke_scalar(&geom)?;
+                    let res = invoke_scalar(geom)?;
                     match res {
                         Some(n) => builder.append_value(n),
                         None => builder.append_null(),
diff --git a/c/sedona-geos/src/st_perimeter.rs b/c/sedona-geos/src/st_perimeter.rs
index 592a74611..4d9fb41cd 100644
--- a/c/sedona-geos/src/st_perimeter.rs
+++ b/c/sedona-geos/src/st_perimeter.rs
@@ -59,7 +59,7 @@ impl SedonaScalarKernel for STPerimeter {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb).map_err(|e| {
+                    builder.append_value(invoke_scalar(wkb).map_err(|e| {
                         DataFusionError::Execution(format!("Failed to calculate perimeter: {e}"))
                     })?);
                 }
diff --git a/c/sedona-geos/src/st_pointonsurface.rs b/c/sedona-geos/src/st_pointonsurface.rs
index cbbf6f5b6..5895ac1de 100644
--- a/c/sedona-geos/src/st_pointonsurface.rs
+++ b/c/sedona-geos/src/st_pointonsurface.rs
@@ -64,7 +64,7 @@ impl SedonaScalarKernel for STPointOnSurface {
         executor.execute_wkb_void(|maybe_geom| {
             match maybe_geom {
                 Some(geom) => {
-                    invoke_scalar(&geom, &mut builder)?;
+                    invoke_scalar(geom, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_polygonize.rs b/c/sedona-geos/src/st_polygonize.rs
index 3d7a280cc..675cc2c4b 100644
--- a/c/sedona-geos/src/st_polygonize.rs
+++ b/c/sedona-geos/src/st_polygonize.rs
@@ -61,7 +61,7 @@ impl SedonaScalarKernel for STPolygonize {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_reduce_precision.rs b/c/sedona-geos/src/st_reduce_precision.rs
index 48cf577cc..79eb98350 100644
--- a/c/sedona-geos/src/st_reduce_precision.rs
+++ b/c/sedona-geos/src/st_reduce_precision.rs
@@ -73,7 +73,7 @@ impl SedonaScalarKernel for STReducePrecision {
         executor.execute_wkb_void(|wkb| {
             match (wkb, grid_size_iter.next().unwrap()) {
                 (Some(wkb), Some(grid_size)) => {
-                    invoke_scalar(&wkb, grid_size, &mut builder)?;
+                    invoke_scalar(wkb, grid_size, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_simplify.rs b/c/sedona-geos/src/st_simplify.rs
index 0217533c2..43b5e3763 100644
--- a/c/sedona-geos/src/st_simplify.rs
+++ b/c/sedona-geos/src/st_simplify.rs
@@ -74,7 +74,7 @@ impl SedonaScalarKernel for STSimplify {
         executor.execute_wkb_void(|wkb| {
             match (wkb, tolerance_iter.next().unwrap()) {
                 (Some(wkb), Some(tolerance)) => {
-                    invoke_scalar(&wkb, tolerance, &mut builder)?;
+                    invoke_scalar(wkb, tolerance, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_simplifypreservetopology.rs b/c/sedona-geos/src/st_simplifypreservetopology.rs
index 748e01fbd..df178d785 100644
--- a/c/sedona-geos/src/st_simplifypreservetopology.rs
+++ b/c/sedona-geos/src/st_simplifypreservetopology.rs
@@ -76,7 +76,7 @@ impl SedonaScalarKernel for STSimplifyPreserveTopology {
         executor.execute_wkb_void(|wkb| {
             match (wkb, tolerance_iter.next().unwrap()) {
                 (Some(wkb), Some(tolerance)) => {
-                    invoke_scalar(&wkb, tolerance, &mut builder)?;
+                    invoke_scalar(wkb, tolerance, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-geos/src/st_unaryunion.rs b/c/sedona-geos/src/st_unaryunion.rs
index ba08f0bf1..00b1436ed 100644
--- a/c/sedona-geos/src/st_unaryunion.rs
+++ b/c/sedona-geos/src/st_unaryunion.rs
@@ -59,7 +59,7 @@ impl SedonaScalarKernel for STUnaryUnion {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)?;
+                    invoke_scalar(wkb, &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/c/sedona-proj/src/st_transform.rs b/c/sedona-proj/src/st_transform.rs
index 5420a99c3..539e04dc9 100644
--- a/c/sedona-proj/src/st_transform.rs
+++ b/c/sedona-proj/src/st_transform.rs
@@ -177,7 +177,7 @@ impl SedonaScalarKernel for STTransform {
                     executor.execute_wkb_void(|maybe_wkb| {
                         match maybe_wkb {
                             Some(wkb) => {
-                                invoke_scalar(&wkb, crs_transform.as_ref(), &mut builder)?;
+                                invoke_scalar(wkb, crs_transform.as_ref(), &mut builder)?;
                                 builder.append_value([]);
                             }
                             None => builder.append_null(),
@@ -226,7 +226,7 @@ impl SedonaScalarKernel for STTransform {
                         }
 
                         if maybe_from_crs == maybe_to_crs {
-                            invoke_noop(&wkb, &mut builder)?;
+                            invoke_noop(wkb, &mut builder)?;
                             builder.append_value([]);
                             return Ok(());
                         }
@@ -242,7 +242,7 @@ impl SedonaScalarKernel for STTransform {
                             )
                         };
 
-                        invoke_scalar(&wkb, crs_transform.as_ref(), &mut builder)?;
+                        invoke_scalar(wkb, crs_transform.as_ref(), &mut builder)?;
                         builder.append_value([]);
                     }
                     _ => {
diff --git a/rust/sedona-functions/src/executor.rs b/rust/sedona-functions/src/executor.rs
index f3b6f75f4..7b8284f93 100644
--- a/rust/sedona-functions/src/executor.rs
+++ b/rust/sedona-functions/src/executor.rs
@@ -104,7 +104,7 @@ impl<'a, 'b, Factory0: GeometryFactory, Factory1: GeometryFactory>
     /// a [Wkb] scalar. For [SedonaType::Wkb] and [SedonaType::WkbView] arrays, this
     /// is the conversion that would normally happen. For other future supported geometry
     /// array types, this may incur a cast of item-wise conversion overhead.
-    pub fn execute_wkb_void<F: FnMut(Option<Factory0::Geom<'b>>) -> Result<()>>(
+    pub fn execute_wkb_void<F: FnMut(Option<&Factory0::Geom<'b>>) -> Result<()>>(
         &self,
         mut func: F,
     ) -> Result<()> {
@@ -115,7 +115,10 @@ impl<'a, 'b, Factory0: GeometryFactory, Factory1: GeometryFactory>
             }
             ColumnarValue::Scalar(scalar_value) => {
                 let wkb0 = scalar_value.scalar_from_factory(&self.factory0)?;
-                func(wkb0)
+                for _ in 0..self.num_iterations {
+                    func(wkb0.as_ref())?;
+                }
+                Ok(())
             }
         }
     }
@@ -147,7 +150,7 @@ impl<'a, 'b, Factory0: GeometryFactory, Factory1: GeometryFactory>
                     &self.factory0,
                     &self.arg_types[0],
                     self.num_iterations(),
-                    |wkb0| func(wkb0.as_ref(), wkb1.as_ref()),
+                    |wkb0| func(wkb0, wkb1.as_ref()),
                 )
             }
             (ColumnarValue::Scalar(scalar_value), ColumnarValue::Array(array)) => {
@@ -156,13 +159,16 @@ impl<'a, 'b, Factory0: GeometryFactory, Factory1: GeometryFactory>
                     &self.factory1,
                     &self.arg_types[1],
                     self.num_iterations(),
-                    |wkb1| func(wkb0.as_ref(), wkb1.as_ref()),
+                    |wkb1| func(wkb0.as_ref(), wkb1),
                 )
             }
             (ColumnarValue::Scalar(scalar_value0), ColumnarValue::Scalar(scalar_value1)) => {
                 let wkb0 = scalar_value0.scalar_from_factory(&self.factory0)?;
                 let wkb1 = scalar_value1.scalar_from_factory(&self.factory1)?;
-                func(wkb0.as_ref(), wkb1.as_ref())
+                for _ in 0..self.num_iterations {
+                    func(wkb0.as_ref(), wkb1.as_ref())?;
+                }
+                Ok(())
             }
         }
     }
@@ -331,7 +337,7 @@ pub trait IterGeo {
     fn iter_with_factory<
         'a,
         Factory: GeometryFactory,
-        F: FnMut(Option<Factory::Geom<'a>>) -> Result<()>,
+        F: FnMut(Option<&Factory::Geom<'a>>) -> Result<()>,
     >(
         &'a self,
         factory: &Factory,
@@ -345,7 +351,7 @@ pub trait IterGeo {
             |maybe_bytes| match maybe_bytes {
                 Some(wkb_bytes) => {
                     let geom = factory.try_from_wkb(wkb_bytes)?;
-                    func(Some(geom))
+                    func(Some(&geom))
                 }
                 None => func(None),
             },
@@ -357,7 +363,7 @@ pub trait IterGeo {
     /// The function will always be called num_iteration types to support
     /// efficient iteration over scalar containers (e.g., so that implementations
     /// can parse the Wkb once and reuse the object).
-    fn iter_as_wkb<'a, F: FnMut(Option<Wkb<'a>>) -> Result<()>>(
+    fn iter_as_wkb<'a, F: FnMut(Option<&Wkb<'a>>) -> Result<()>>(
         &'a self,
         sedona_type: &SedonaType,
         num_iterations: usize,
@@ -598,7 +604,7 @@ mod tests {
         let mut i = 0;
         wkb_array_ref
             .iter_as_wkb(&WKB_GEOMETRY, 3, |maybe_geom| {
-                write_to_test_output(&mut wkt_out, i, maybe_geom.as_ref()).unwrap();
+                write_to_test_output(&mut wkt_out, i, maybe_geom).unwrap();
                 i += 1;
                 Ok(())
             })
@@ -624,7 +630,7 @@ mod tests {
         let mut i = 0;
         wkb_view_array_ref
             .iter_as_wkb(&WKB_VIEW_GEOMETRY, 3, |maybe_geom| {
-                write_to_test_output(&mut wkt_out, i, maybe_geom.as_ref()).unwrap();
+                write_to_test_output(&mut wkt_out, i, maybe_geom).unwrap();
                 i += 1;
                 Ok(())
             })
@@ -844,4 +850,66 @@ mod tests {
             .unwrap_err();
         assert!(err.message().contains("Can't iterate over"));
     }
+
+    #[test]
+    fn execute_wkb_void_scalar_with_num_iterations() {
+        let wkb_scalar = ColumnarValue::Scalar(ScalarValue::Binary(Some(POINT.to_vec())));
+        // A non-geometry array that drives num_iterations
+        let float_array: ArrayRef = create_array!(Float64, [1.0, 2.0, 3.0]);
+        let float_value = ColumnarValue::Array(float_array);
+
+        let arg_types = [WKB_GEOMETRY, SedonaType::Arrow(DataType::Float64)];
+        let args = [wkb_scalar, float_value];
+        let executor = WkbExecutor::new(&arg_types, &args);
+
+        assert_eq!(executor.num_iterations(), 3);
+
+        let mut count = 0;
+        executor
+            .execute_wkb_void(|maybe_geom| {
+                assert!(maybe_geom.is_some());
+                count += 1;
+                Ok(())
+            })
+            .unwrap();
+
+        assert_eq!(
+            count, 3,
+            "Scalar geometry should iterate num_iterations times"
+        );
+    }
+
+    #[test]
+    fn execute_wkb_wkb_void_scalars_with_num_iterations() {
+        let wkb_scalar0 = ColumnarValue::Scalar(ScalarValue::Binary(Some(POINT.to_vec())));
+        let wkb_scalar1 = ColumnarValue::Scalar(ScalarValue::Binary(Some(POINT.to_vec())));
+        // A non-geometry array that drives num_iterations
+        let float_array: ArrayRef = create_array!(Float64, [0.1, 0.25, 0.5, 1.0]);
+        let float_value = ColumnarValue::Array(float_array);
+
+        let arg_types = [
+            WKB_GEOMETRY,
+            WKB_GEOMETRY,
+            SedonaType::Arrow(DataType::Float64),
+        ];
+        let args = [wkb_scalar0, wkb_scalar1, float_value];
+        let executor = WkbExecutor::new(&arg_types, &args);
+
+        assert_eq!(executor.num_iterations(), 4);
+
+        let mut count = 0;
+        executor
+            .execute_wkb_wkb_void(|maybe_geom0, maybe_geom1| {
+                assert!(maybe_geom0.is_some());
+                assert!(maybe_geom1.is_some());
+                count += 1;
+                Ok(())
+            })
+            .unwrap();
+
+        assert_eq!(
+            count, 4,
+            "Two scalar geometries should iterate num_iterations times"
+        );
+    }
 }
diff --git a/rust/sedona-functions/src/st_affine.rs b/rust/sedona-functions/src/st_affine.rs
index 4b37d963e..6feb825b6 100644
--- a/rust/sedona-functions/src/st_affine.rs
+++ b/rust/sedona-functions/src/st_affine.rs
@@ -117,7 +117,7 @@ impl SedonaScalarKernel for STAffine {
             let maybe_mat = affine_iter.next().unwrap();
             match (maybe_wkb, maybe_mat) {
                 (Some(wkb), Some(mat)) => {
-                    transform(&wkb, &mat, &mut builder)
+                    transform(wkb, &mat, &mut builder)
                         .map_err(|e| DataFusionError::Execution(e.to_string()))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_asewkb.rs b/rust/sedona-functions/src/st_asewkb.rs
index 0a6fb02b3..53052cdec 100644
--- a/rust/sedona-functions/src/st_asewkb.rs
+++ b/rust/sedona-functions/src/st_asewkb.rs
@@ -82,7 +82,7 @@ impl SedonaScalarKernel for STAsEWKB {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    write_ewkb_geometry(&mut builder, &wkb, maybe_srid)
+                    write_ewkb_geometry(&mut builder, wkb, maybe_srid)
                         .map_err(|e| exec_datafusion_err!("EWKB writer error {e}"))?;
                     builder.append_value([]);
                 }
@@ -156,7 +156,7 @@ impl SedonaScalarKernel for STAsEWKBItemCrs {
             let maybe_srid = srid_iter.next().unwrap()?;
             match maybe_wkb {
                 Some(wkb) => {
-                    write_ewkb_geometry(&mut builder, &wkb, maybe_srid)
+                    write_ewkb_geometry(&mut builder, wkb, maybe_srid)
                         .map_err(|e| exec_datafusion_err!("EWKB writer error {e}"))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_dimension.rs b/rust/sedona-functions/src/st_dimension.rs
index 099bd4ac4..1caf3835b 100644
--- a/rust/sedona-functions/src/st_dimension.rs
+++ b/rust/sedona-functions/src/st_dimension.rs
@@ -62,7 +62,7 @@ impl SedonaScalarKernel for STDimension {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    builder.append_value(invoke_scalar(&item)?);
+                    builder.append_value(invoke_scalar(item)?);
                 }
                 None => builder.append_null(),
             }
diff --git a/rust/sedona-functions/src/st_dump.rs b/rust/sedona-functions/src/st_dump.rs
index 020866993..8cfedcff9 100644
--- a/rust/sedona-functions/src/st_dump.rs
+++ b/rust/sedona-functions/src/st_dump.rs
@@ -233,7 +233,7 @@ impl SedonaScalarKernel for STDump {
         let mut builder = STDumpBuilder::new(executor.num_iterations(), return_type.clone());
         executor.execute_wkb_void(|maybe_wkb| {
             if let Some(wkb) = maybe_wkb {
-                builder.append(&wkb)?;
+                builder.append(wkb)?;
             } else {
                 builder.append_null();
             }
diff --git a/rust/sedona-functions/src/st_flipcoordinates.rs b/rust/sedona-functions/src/st_flipcoordinates.rs
index 0096a956a..b44add51e 100644
--- a/rust/sedona-functions/src/st_flipcoordinates.rs
+++ b/rust/sedona-functions/src/st_flipcoordinates.rs
@@ -81,7 +81,7 @@ impl SedonaScalarKernel for STFlipCoordinates {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    invoke_scalar(&item, &mut transform, &mut builder)?;
+                    invoke_scalar(item, &mut transform, &mut builder)?;
                     builder.append_value([]);
                 }
                 None => builder.append_null(),
diff --git a/rust/sedona-functions/src/st_geometryn.rs b/rust/sedona-functions/src/st_geometryn.rs
index e80e7a122..cc11265b1 100644
--- a/rust/sedona-functions/src/st_geometryn.rs
+++ b/rust/sedona-functions/src/st_geometryn.rs
@@ -88,7 +88,7 @@ impl SedonaScalarKernel for STGeometryN {
         executor.execute_wkb_void(|maybe_wkb| {
             match (maybe_wkb, index_iter.next().unwrap()) {
                 (Some(wkb), Some(index)) => {
-                    if invoke_scalar(&wkb, (index - 1) as usize, &mut builder)? {
+                    if invoke_scalar(wkb, (index - 1) as usize, &mut builder)? {
                         builder.append_value([]);
                     } else {
                         // Unsupported Geometry Type, Invalid index encountered
diff --git a/rust/sedona-functions/src/st_interiorringn.rs b/rust/sedona-functions/src/st_interiorringn.rs
index c30c63e43..c6f14bfb4 100644
--- a/rust/sedona-functions/src/st_interiorringn.rs
+++ b/rust/sedona-functions/src/st_interiorringn.rs
@@ -89,7 +89,7 @@ impl SedonaScalarKernel for STInteriorRingN {
         executor.execute_wkb_void(|maybe_wkb| {
             match (maybe_wkb, index_iter.next().unwrap()) {
                 (Some(wkb), Some(index)) => {
-                    if invoke_scalar(&wkb, (index - 1) as usize, &mut builder)? {
+                    if invoke_scalar(wkb, (index - 1) as usize, &mut builder)? {
                         builder.append_value([]);
                     } else {
                         // Unsupported Geometry Type, Invalid index encountered
diff --git a/rust/sedona-functions/src/st_isclosed.rs b/rust/sedona-functions/src/st_isclosed.rs
index 2aac1ae73..f255d72cf 100644
--- a/rust/sedona-functions/src/st_isclosed.rs
+++ b/rust/sedona-functions/src/st_isclosed.rs
@@ -67,7 +67,7 @@ impl SedonaScalarKernel for STIsClosed {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    builder.append_value(invoke_scalar(&item)?);
+                    builder.append_value(invoke_scalar(item)?);
                 }
                 None => builder.append_null(),
             }
diff --git a/rust/sedona-functions/src/st_isempty.rs b/rust/sedona-functions/src/st_isempty.rs
index 6ca4aff53..fc72bd292 100644
--- a/rust/sedona-functions/src/st_isempty.rs
+++ b/rust/sedona-functions/src/st_isempty.rs
@@ -61,7 +61,7 @@ impl SedonaScalarKernel for STIsEmpty {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    builder.append_value(invoke_scalar(&item)?);
+                    builder.append_value(invoke_scalar(item)?);
                 }
                 None => builder.append_null(),
             }
diff --git a/rust/sedona-functions/src/st_points.rs b/rust/sedona-functions/src/st_points.rs
index ca928eabf..b3e1825ba 100644
--- a/rust/sedona-functions/src/st_points.rs
+++ b/rust/sedona-functions/src/st_points.rs
@@ -84,13 +84,13 @@ impl SedonaScalarKernel for STPoints {
         executor.execute_wkb_void(|maybe_wkb| {
             if let Some(wkb) = maybe_wkb {
                 // We need to know the number of points before actually writing the points.
-                let n_points = count_wkb_points_recursively(&wkb);
+                let n_points = count_wkb_points_recursively(wkb);
 
                 if write_wkb_multipoint_header(&mut builder, wkb.dim(), n_points).is_err() {
                     return sedona_internal_err!("Failed to write WKB point header");
                 };
 
-                if write_wkb_points_recursively(&mut builder, &wkb).is_err() {
+                if write_wkb_points_recursively(&mut builder, wkb).is_err() {
                     return sedona_internal_err!("Failed to write WKB point header");
                 };
 
@@ -141,7 +141,7 @@ impl SedonaScalarKernel for STNPoints {
 
         executor.execute_wkb_void(|maybe_wkb| {
             if let Some(wkb) = maybe_wkb {
-                builder.append_value(count_wkb_points_recursively(&wkb) as u64);
+                builder.append_value(count_wkb_points_recursively(wkb) as u64);
             } else {
                 builder.append_null();
             }
diff --git a/rust/sedona-functions/src/st_reverse.rs b/rust/sedona-functions/src/st_reverse.rs
index 31fc91524..97b83ba5d 100644
--- a/rust/sedona-functions/src/st_reverse.rs
+++ b/rust/sedona-functions/src/st_reverse.rs
@@ -88,7 +88,7 @@ impl SedonaScalarKernel for STReverse {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    invoke_scalar(&wkb, &mut builder)
+                    invoke_scalar(wkb, &mut builder)
                         .map_err(|e| exec_datafusion_err!("ST_Reverse error: {e}"))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_rotate.rs b/rust/sedona-functions/src/st_rotate.rs
index 5f1ad0a9a..ecb7a87af 100644
--- a/rust/sedona-functions/src/st_rotate.rs
+++ b/rust/sedona-functions/src/st_rotate.rs
@@ -109,7 +109,7 @@ impl SedonaScalarKernel for STRotate {
             let maybe_mat = affine_iter.next().unwrap();
             match (maybe_wkb, maybe_mat) {
                 (Some(wkb), Some(mat)) => {
-                    transform(&wkb, &mat, &mut builder)
+                    transform(wkb, &mat, &mut builder)
                         .map_err(|e| DataFusionError::Execution(e.to_string()))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_scale.rs b/rust/sedona-functions/src/st_scale.rs
index fdbb5d601..140c7f6c6 100644
--- a/rust/sedona-functions/src/st_scale.rs
+++ b/rust/sedona-functions/src/st_scale.rs
@@ -104,7 +104,7 @@ impl SedonaScalarKernel for STScale {
             let maybe_mat = affine_iter.next().unwrap();
             match (maybe_wkb, maybe_mat) {
                 (Some(wkb), Some(mat)) => {
-                    transform(&wkb, &mat, &mut builder)
+                    transform(wkb, &mat, &mut builder)
                         .map_err(|e| DataFusionError::Execution(e.to_string()))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_segmentize.rs b/rust/sedona-functions/src/st_segmentize.rs
index 68d987761..5a8f1f15a 100644
--- a/rust/sedona-functions/src/st_segmentize.rs
+++ b/rust/sedona-functions/src/st_segmentize.rs
@@ -106,7 +106,7 @@ impl SedonaScalarKernel for STSegmentize {
                         return exec_err!("max_segment_length must be finite and >= 0");
                     }
 
-                    segmentize_wkb(&wkb, max_len, &mut coords_scratch, &mut builder)
+                    segmentize_wkb(wkb, max_len, &mut coords_scratch, &mut builder)
                         .map_err(|e| exec_datafusion_err!("Segmentize error: {e}"))?;
                     builder.append_value([]);
                 }
diff --git a/rust/sedona-functions/src/st_start_point.rs b/rust/sedona-functions/src/st_start_point.rs
index 5533ab531..082b238cd 100644
--- a/rust/sedona-functions/src/st_start_point.rs
+++ b/rust/sedona-functions/src/st_start_point.rs
@@ -102,7 +102,7 @@ impl SedonaScalarKernel for STStartOrEndPoint {
 
         executor.execute_wkb_void(|maybe_wkb| {
             if let Some(wkb) = maybe_wkb {
-                if let Some(coord) = extract_start_or_end_coord(&wkb, self.from_start) {
+                if let Some(coord) = extract_start_or_end_coord(wkb, self.from_start) {
                     if write_wkb_point_from_coord(&mut builder, coord).is_err() {
                         return sedona_internal_err!("Failed to write WKB point header");
                     };
diff --git a/rust/sedona-functions/src/st_xyzm.rs b/rust/sedona-functions/src/st_xyzm.rs
index 6b526b6f4..f84e376ab 100644
--- a/rust/sedona-functions/src/st_xyzm.rs
+++ b/rust/sedona-functions/src/st_xyzm.rs
@@ -141,7 +141,7 @@ impl SedonaScalarKernel for STXyzm {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    builder.append_option(invoke_scalar(&item, dim_index)?);
+                    builder.append_option(invoke_scalar(item, dim_index)?);
                 }
                 None => builder.append_null(),
             }
diff --git a/rust/sedona-functions/src/st_xyzm_minmax.rs b/rust/sedona-functions/src/st_xyzm_minmax.rs
index 683c134e4..d1ca2dbc9 100644
--- a/rust/sedona-functions/src/st_xyzm_minmax.rs
+++ b/rust/sedona-functions/src/st_xyzm_minmax.rs
@@ -149,7 +149,7 @@ impl SedonaScalarKernel for STXyzmMinMax {
         executor.execute_wkb_void(|maybe_item| {
             match maybe_item {
                 Some(item) => {
-                    builder.append_option(invoke_scalar(&item, self.dim, self.is_max)?);
+                    builder.append_option(invoke_scalar(item, self.dim, self.is_max)?);
                 }
                 None => builder.append_null(),
             }
diff --git a/rust/sedona-geo/src/st_area.rs b/rust/sedona-geo/src/st_area.rs
index 2b2b7d4c7..7d7dd41c5 100644
--- a/rust/sedona-geo/src/st_area.rs
+++ b/rust/sedona-geo/src/st_area.rs
@@ -57,7 +57,7 @@ impl SedonaScalarKernel for STArea {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/rust/sedona-geo/src/st_asgeojson.rs b/rust/sedona-geo/src/st_asgeojson.rs
index 053368798..c87f17b0b 100644
--- a/rust/sedona-geo/src/st_asgeojson.rs
+++ b/rust/sedona-geo/src/st_asgeojson.rs
@@ -67,7 +67,7 @@ impl SedonaScalarKernel for STAsGeoJSON {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    let json_str = geom_to_geojson(&wkb)?;
+                    let json_str = geom_to_geojson(wkb)?;
                     builder.append_value(&json_str);
                 }
                 None => builder.append_null(),
diff --git a/rust/sedona-geo/src/st_buffer.rs b/rust/sedona-geo/src/st_buffer.rs
index d948f9b17..6b4db7227 100644
--- a/rust/sedona-geo/src/st_buffer.rs
+++ b/rust/sedona-geo/src/st_buffer.rs
@@ -80,7 +80,7 @@ impl SedonaScalarKernel for STBuffer {
         executor.execute_wkb_void(|maybe_wkb| {
             match (maybe_wkb, distance_iter.next().unwrap()) {
                 (Some(wkb), Some(distance)) => {
-                    invoke_scalar(&wkb, BufferStyle::new(distance), &mut builder)?;
+                    invoke_scalar(wkb, BufferStyle::new(distance), &mut builder)?;
                     builder.append_value([]);
                 }
                 _ => builder.append_null(),
diff --git a/rust/sedona-geo/src/st_centroid.rs b/rust/sedona-geo/src/st_centroid.rs
index bd97f6911..83fbb2749 100644
--- a/rust/sedona-geo/src/st_centroid.rs
+++ b/rust/sedona-geo/src/st_centroid.rs
@@ -64,7 +64,7 @@ impl SedonaScalarKernel for STCentroid {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    let centroid_wkb = invoke_scalar(&wkb)?;
+                    let centroid_wkb = invoke_scalar(wkb)?;
                     builder.append_value(&centroid_wkb);
                 }
                 _ => builder.append_null(),
diff --git a/rust/sedona-geo/src/st_concavehull.rs b/rust/sedona-geo/src/st_concavehull.rs
index 906e576db..13eb8d7ab 100644
--- a/rust/sedona-geo/src/st_concavehull.rs
+++ b/rust/sedona-geo/src/st_concavehull.rs
@@ -84,7 +84,7 @@ fn invoke_batch_impl(arg_types: &[SedonaType], args: &[ColumnarValue]) -> Result
     executor.execute_wkb_void(|maybe_wkb| {
         match (maybe_wkb, pct_convex_iter.next().unwrap()) {
             (Some(wkb), Some(pct_convex)) => {
-                invoke_scalar(&wkb, pct_convex, &mut builder)?;
+                invoke_scalar(wkb, pct_convex, &mut builder)?;
                 builder.append_value([]);
             }
             _ => builder.append_null(),
diff --git a/rust/sedona-geo/src/st_intersection_agg.rs b/rust/sedona-geo/src/st_intersection_agg.rs
index c8c4cb7f5..e08c2e8a6 100644
--- a/rust/sedona-geo/src/st_intersection_agg.rs
+++ b/rust/sedona-geo/src/st_intersection_agg.rs
@@ -155,7 +155,7 @@ impl IntersectionAccumulator {
     fn execute_update(&mut self, executor: WkbExecutor) -> Result<()> {
         executor.execute_wkb_void(|maybe_item| {
             if let Some(item) = maybe_item {
-                self.update_intersection(&item)?;
+                self.update_intersection(item)?;
             }
             Ok(())
         })?;
diff --git a/rust/sedona-geo/src/st_length.rs b/rust/sedona-geo/src/st_length.rs
index b17befe8a..fbdec40ac 100644
--- a/rust/sedona-geo/src/st_length.rs
+++ b/rust/sedona-geo/src/st_length.rs
@@ -58,7 +58,7 @@ impl SedonaScalarKernel for STLength {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/rust/sedona-geo/src/st_line_interpolate_point.rs b/rust/sedona-geo/src/st_line_interpolate_point.rs
index 1a66280c3..843219396 100644
--- a/rust/sedona-geo/src/st_line_interpolate_point.rs
+++ b/rust/sedona-geo/src/st_line_interpolate_point.rs
@@ -73,7 +73,7 @@ impl SedonaScalarKernel for STLineInterpolatePoint {
             let maybe_ratio = arg1_iter.next().unwrap();
             match (maybe_geom, maybe_ratio) {
                 (Some(geom), Some(ratio)) => {
-                    let (x, y) = invoke_scalar(&geom, ratio)?;
+                    let (x, y) = invoke_scalar(geom, ratio)?;
                     write_wkb_point(&mut builder, (x, y))
                         .map_err(|e| DataFusionError::External(Box::new(e)))?;
                     builder.append_value([]);
diff --git a/rust/sedona-geo/src/st_perimeter.rs b/rust/sedona-geo/src/st_perimeter.rs
index c5c14cd80..8e6d0d7a2 100644
--- a/rust/sedona-geo/src/st_perimeter.rs
+++ b/rust/sedona-geo/src/st_perimeter.rs
@@ -58,7 +58,7 @@ impl SedonaScalarKernel for STPerimeter {
         executor.execute_wkb_void(|maybe_wkb| {
             match maybe_wkb {
                 Some(wkb) => {
-                    builder.append_value(invoke_scalar(&wkb)?);
+                    builder.append_value(invoke_scalar(wkb)?);
                 }
                 _ => builder.append_null(),
             }
diff --git a/rust/sedona-geo/src/st_union_agg.rs b/rust/sedona-geo/src/st_union_agg.rs
index a091be8c9..7d0e01372 100644
--- a/rust/sedona-geo/src/st_union_agg.rs
+++ b/rust/sedona-geo/src/st_union_agg.rs
@@ -149,7 +149,7 @@ impl UnionAccumulator {
     fn execute_update(&mut self, executor: WkbExecutor) -> Result<()> {
         executor.execute_wkb_void(|maybe_item| {
             if let Some(item) = maybe_item {
-                self.update_union(&item)?;
+                self.update_union(item)?;
             }
             Ok(())
         })?;
diff --git a/rust/sedona-geo/src/to_geo.rs b/rust/sedona-geo/src/to_geo.rs
index a4401125a..f4c90ee6c 100644
--- a/rust/sedona-geo/src/to_geo.rs
+++ b/rust/sedona-geo/src/to_geo.rs
@@ -183,7 +183,7 @@ mod tests {
         let executor = GeoTypesExecutor::new(&[WKB_GEOMETRY], &args);
         executor
             .execute_wkb_void(|geo| {
-                actual_items.push(geo);
+                actual_items.push(geo.cloned());
                 Ok(())
             })
             .unwrap();
diff --git a/rust/sedona-geometry/src/bounds.rs b/rust/sedona-geometry/src/bounds.rs
index 252fdd9a1..4bc9ff01c 100644
--- a/rust/sedona-geometry/src/bounds.rs
+++ b/rust/sedona-geometry/src/bounds.rs
@@ -159,7 +159,7 @@ impl WkbBounder2D for WkbGeometryBounder {
     fn update_wkb_bytes(&mut self, wkb_value: &[u8]) -> Result<(), SedonaGeometryError> {
         let wkb = wkb::reader::read_wkb(wkb_value)
             .map_err(|e| SedonaGeometryError::External(Box::new(e)))?;
-        geo_traits_update_xy_bounds(wkb, &mut self.x, &mut self.y)?;
+        geo_traits_update_xy_bounds(&wkb, &mut self.x, &mut self.y)?;
         Ok(())
     }
 
@@ -211,7 +211,7 @@ pub fn geo_traits_bounds_xy(
 ) -> Result<BoundingBox, SedonaGeometryError> {
     let mut x = Interval::empty();
     let mut y = Interval::empty();
-    geo_traits_update_xy_bounds(geom, &mut x, &mut y)?;
+    geo_traits_update_xy_bounds(&geom, &mut x, &mut y)?;
     Ok(BoundingBox::xy(x, y))
 }
 
@@ -238,7 +238,7 @@ pub fn geo_traits_bounds_m(
 /// Useful for updating bounds in-place when accumulating
 /// bounds for statistics or function implementations.
 pub fn geo_traits_update_xy_bounds(
-    geom: impl GeometryTrait<T = f64>,
+    geom: &impl GeometryTrait<T = f64>,
     x: &mut Interval,
     y: &mut Interval,
 ) -> Result<(), SedonaGeometryError> {
@@ -272,22 +272,22 @@ pub fn geo_traits_update_xy_bounds(
         }
         GeometryType::MultiPoint(multi_pt) => {
             for pt in multi_pt.points() {
-                geo_traits_update_xy_bounds(pt, x, y)?;
+                geo_traits_update_xy_bounds(&pt, x, y)?;
             }
         }
         GeometryType::MultiLineString(multi_ls) => {
             for ls in multi_ls.line_strings() {
-                geo_traits_update_xy_bounds(ls, x, y)?;
+                geo_traits_update_xy_bounds(&ls, x, y)?;
             }
         }
         GeometryType::MultiPolygon(multi_pl) => {
             for pl in multi_pl.polygons() {
-                geo_traits_update_xy_bounds(pl, x, y)?;
+                geo_traits_update_xy_bounds(&pl, x, y)?;
             }
         }
         GeometryType::GeometryCollection(collection) => {
             for geom in collection.geometries() {
-                geo_traits_update_xy_bounds(geom, x, y)?;
+                geo_traits_update_xy_bounds(&geom, x, y)?;
             }
         }
         _ => {
diff --git a/rust/sedona-geoparquet/src/writer.rs b/rust/sedona-geoparquet/src/writer.rs
index c84604d4f..732d8d89a 100644
--- a/rust/sedona-geoparquet/src/writer.rs
+++ b/rust/sedona-geoparquet/src/writer.rs
@@ -503,7 +503,7 @@ impl SedonaScalarKernel for GeoParquetBbox {
             match maybe_item {
                 Some(item) => {
                     nulls.append(true);
-                    append_float_bbox(&item, &mut builders)?;
+                    append_float_bbox(item, &mut builders)?;
                 }
                 None => {
                     // If we have a null, we set the outer validity bitmap to null
@@ -550,7 +550,7 @@ fn bbox_fields() -> Fields {
 // a set of builders, ensuring the float bounds always include the double
 // bounds.
 fn append_float_bbox(
-    wkb: impl GeometryTrait<T = f64>,
+    wkb: &impl GeometryTrait<T = f64>,
     builders: &mut [Float32Builder],
 ) -> Result<()> {
     let mut x = Interval::empty();
diff --git a/rust/sedona-spatial-join/src/operand_evaluator.rs b/rust/sedona-spatial-join/src/operand_evaluator.rs
index b634c0bf1..333699795 100644
--- a/rust/sedona-spatial-join/src/operand_evaluator.rs
+++ b/rust/sedona-spatial-join/src/operand_evaluator.rs
@@ -20,7 +20,9 @@ use std::{mem::transmute, sync::Arc};
 use arrow::compute::{concat as arrow_concat, interleave as arrow_interleave};
 use arrow_array::{Array, ArrayRef, Float64Array, RecordBatch};
 use arrow_schema::DataType;
-use datafusion_common::{utils::proxy::VecAllocExt, JoinSide, Result, ScalarValue};
+use datafusion_common::{
+    exec_datafusion_err, utils::proxy::VecAllocExt, JoinSide, Result, ScalarValue,
+};
 use datafusion_expr::ColumnarValue;
 use datafusion_physical_expr::PhysicalExpr;
 use sedona_functions::executor::IterGeo;
@@ -183,22 +185,26 @@ impl EvaluatedGeometryArray {
         let mut wkbs = Vec::with_capacity(num_rows);
         let mut x = Interval::empty();
         let mut y = Interval::empty();
-        geometry_array.iter_as_wkb(sedona_type, num_rows, |wkb_opt| {
-            if let Some(wkb) = &wkb_opt {
+        geometry_array.iter_as_wkb_bytes(sedona_type, num_rows, |wkb_opt| {
+            if let Some(wkb_bytes) = &wkb_opt {
+                let wkb = wkb::reader::read_wkb(wkb_bytes)
+                    .map_err(|e| exec_datafusion_err!("WKB parse failed: {e}"))?;
                 x = Interval::empty();
                 y = Interval::empty();
-                geo_traits_update_xy_bounds(wkb, &mut x, &mut y)
+                geo_traits_update_xy_bounds(&wkb, &mut x, &mut y)
                     .map_err(|e| sedona_internal_datafusion_err!("{e}"))?;
                 rect_vec.push(Bounds2D::new(x, y));
+
+                // Safety: The wkbs must reference buffers inside the `geometry_array`. Since the `geometry_array` and
+                // `wkbs` are both owned by the `EvaluatedGeometryArray`, so they have the same lifetime. We'll never
+                // have a situation where the `EvaluatedGeometryArray` is dropped while the `wkbs` are still in use
+                // (guaranteed by the scope of the `wkbs` field and lifetime signature of the `wkbs` method).
+                wkbs.push(Some(unsafe { transmute::<Wkb<'_>, Wkb<'static>>(wkb) }));
             } else {
-                rect_vec.push(Bounds2D::empty())
+                rect_vec.push(Bounds2D::empty());
+                wkbs.push(None);
             }
 
-            // Safety: The wkbs must reference buffers inside the `geometry_array`. Since the `geometry_array` and
-            // `wkbs` are both owned by the `EvaluatedGeometryArray`, so they have the same lifetime. We'll never
-            // have a situation where the `EvaluatedGeometryArray` is dropped while the `wkbs` are still in use
-            // (guaranteed by the scope of the `wkbs` field and lifetime signature of the `wkbs` method).
-            wkbs.push(wkb_opt.map(|wkb| unsafe { transmute(wkb) }));
             Ok(())
         })?;
 
@@ -223,8 +229,14 @@ impl EvaluatedGeometryArray {
         // (guaranteed by the scope of the `wkbs` field and lifetime signature of the `wkbs` method).
         let num_rows = geometry_array.len();
         let mut wkbs = Vec::with_capacity(num_rows);
-        geometry_array.iter_as_wkb(sedona_type, num_rows, |wkb_opt| {
-            wkbs.push(wkb_opt.map(|wkb| unsafe { transmute(wkb) }));
+        geometry_array.iter_as_wkb_bytes(sedona_type, num_rows, |wkb_opt| {
+            if let Some(wkb_bytes) = wkb_opt {
+                let wkb = wkb::reader::read_wkb(wkb_bytes)
+                    .map_err(|e| exec_datafusion_err!("WKB parse failed: {e}"))?;
+                wkbs.push(Some(unsafe { transmute::<Wkb<'_>, Wkb<'static>>(wkb) }));
+            } else {
+                wkbs.push(None);
+            }
             Ok(())
         })?;
 
diff --git a/rust/sedona-spatial-join/tests/spatial_join_integration.rs b/rust/sedona-spatial-join/tests/spatial_join_integration.rs
index 10c7614f0..acd57cae7 100644
--- a/rust/sedona-spatial-join/tests/spatial_join_integration.rs
+++ b/rust/sedona-spatial-join/tests/spatial_join_integration.rs
@@ -1264,7 +1264,7 @@ fn extract_geoms_and_ids(partitions: &[Vec<RecordBatch>]) -> Vec<(i32, geo::Geom
                 .execute_wkb_void(|maybe_geom| {
                     if let Some(id_opt) = id_iter.next() {
                         if let (Some(id), Some(geom)) = (id_opt, maybe_geom) {
-                            result.push((id, geom))
+                            result.push((id, geom.clone()))
                         }
                     }
                     Ok(())