Skip to content

Commit fbf1642

Browse files
authored
Use new sedona_internal_err to avoid misleading datafusion internal err (#2)
* Add new sedona_internal_err * Use sedona_internal_err instead of internal_err in st_xyzm.rs * More replacements * Use full import path in macro to avoid needing import * Replace all uses in sedona-funcdtions * Replace with 'sedona_internal_err' in remaining packages * Update err test case in function_set.rs to use 'contains' instead of 'eq'
1 parent f44c100 commit fbf1642

34 files changed

+163
-90
lines changed

Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/sedona-common/src/error.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/// Macro to create Sedona Internal Error that avoids the misleading error message from
2+
/// DataFusionError::Internal.
3+
#[macro_export]
4+
macro_rules! sedona_internal_err {
5+
($($args:expr),*) => {{
6+
let msg = std::format!(
7+
"SedonaDB internal error: {}{}.\nThis issue was likely caused by a bug in SedonaDB's code. \
8+
Please help us to resolve this by filing a bug report in our issue tracker: \
9+
https://github.com/apache/sedona-db/issues",
10+
std::format!($($args),*),
11+
datafusion_common::DataFusionError::get_back_trace(),
12+
);
13+
// We avoid using Internal to avoid the message suggesting it's internal to DataFusion
14+
Err(datafusion_common::DataFusionError::External(msg.into()))
15+
}};
16+
}
17+
18+
#[cfg(test)]
19+
mod tests {
20+
use datafusion_common::DataFusionError;
21+
22+
#[test]
23+
fn test_sedona_internal_err() {
24+
let result: Result<(), DataFusionError> = sedona_internal_err!("Test error: {}", "details");
25+
assert!(result.is_err());
26+
let err = result.unwrap_err();
27+
let err_string = err.to_string();
28+
assert!(err_string.contains("SedonaDB internal error: Test error: details"));
29+
30+
// Ensure the message doesn't contain the 'DataFusion'-specific messages
31+
assert!(!err_string.contains("DataFusion's code"));
32+
assert!(!err_string.contains("https://github.com/apache/datafusion/issues"));
33+
}
34+
}

rust/sedona-common/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//! This crate contains shared components that are used across multiple
44
//! Sedona modules, including configuration options and common data structures.
55
6+
pub mod error;
67
pub mod option;
78

89
pub use option::*;

rust/sedona-expr/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ datafusion-common = { workspace = true }
2121
datafusion-expr = { workspace = true }
2222
datafusion-physical-expr = { workspace = true }
2323
geo-traits = { workspace = true }
24+
sedona-common = { path = "../sedona-common" }
2425
sedona-geometry = { path = "../sedona-geometry" }
2526
sedona-schema = { path = "../sedona-schema" }
2627
serde = { workspace = true }

rust/sedona-expr/src/function_set.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ use crate::{
22
aggregate_udf::{SedonaAccumulatorRef, SedonaAggregateUDF},
33
scalar_udf::{ScalarKernelRef, SedonaScalarUDF},
44
};
5-
use datafusion_common::{error::Result, internal_err};
5+
use datafusion_common::error::Result;
66
use datafusion_expr::{AggregateUDFImpl, ScalarUDFImpl};
7+
use sedona_common::sedona_internal_err;
78
use std::collections::HashMap;
89

910
/// Helper for managing groups of functions
@@ -110,7 +111,7 @@ impl FunctionSet {
110111
function.add_kernel(kernel);
111112
Ok(self.aggregate_udf(name).unwrap())
112113
} else {
113-
internal_err!("Can't register aggregate kernel for function '{}'", name)
114+
sedona_internal_err!("Can't register aggregate kernel for function '{}'", name)
114115
}
115116
}
116117
}
@@ -248,10 +249,9 @@ mod tests {
248249
let err = functions
249250
.add_aggregate_udf_kernel("function that does not exist", kernel.clone())
250251
.unwrap_err();
251-
assert_eq!(
252-
err.message().lines().next().unwrap(),
252+
assert!(err.message().lines().next().unwrap().contains(
253253
"Can't register aggregate kernel for function 'function that does not exist'."
254-
);
254+
));
255255

256256
let udaf2 = SedonaAggregateUDF::new(
257257
"simple_udaf2",

rust/sedona-expr/src/scalar_udf.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use std::sync::Arc;
33
use std::{any::Any, fmt::Debug};
44

55
use arrow_schema::{DataType, Field, FieldRef};
6-
use datafusion_common::{internal_err, not_impl_err, plan_err, Result, ScalarValue};
6+
use datafusion_common::{not_impl_err, plan_err, Result, ScalarValue};
77
use datafusion_expr::{
88
ColumnarValue, Documentation, ReturnFieldArgs, ScalarFunctionArgs, ScalarUDFImpl, Signature,
99
Volatility,
1010
};
11+
use sedona_common::sedona_internal_err;
1112
use sedona_schema::datatypes::{Edges, SedonaType};
1213

1314
pub type ScalarKernelRef = Arc<dyn SedonaScalarKernel + Send + Sync>;
@@ -121,7 +122,7 @@ impl ArgMatcher {
121122
(Some(lhs_crs), Some(rhs_crs)) => {
122123
plan_err!("Mismatched CRS arguments: {lhs_crs} vs {rhs_crs}\n{hint}")
123124
}
124-
_ => internal_err!("None vs. None should be considered equal"),
125+
_ => sedona_internal_err!("None vs. None should be considered equal"),
125126
};
126127
}
127128
}
@@ -876,13 +877,13 @@ mod tests {
876877
}
877878
}
878879

879-
internal_err!("unrecognized target value")
880+
sedona_internal_err!("unrecognized target value")
880881
}
881882
}
882883

883884
impl SedonaScalarKernel for SimpleCast {
884885
fn return_type(&self, _args: &[SedonaType]) -> Result<Option<SedonaType>> {
885-
internal_err!("Should not be called")
886+
sedona_internal_err!("Should not be called")
886887
}
887888

888889
fn return_type_from_args_and_scalars(

rust/sedona-expr/src/spatial_filter.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use std::sync::Arc;
22

3-
use datafusion_common::{internal_err, DataFusionError, Result, ScalarValue};
3+
use datafusion_common::{DataFusionError, Result, ScalarValue};
44
use datafusion_expr::Operator;
55
use datafusion_physical_expr::{
66
expressions::{BinaryExpr, Column, Literal},
77
PhysicalExpr, ScalarFunctionExpr,
88
};
99
use geo_traits::Dimensions;
10+
use sedona_common::sedona_internal_err;
1011
use sedona_geometry::{bounding_box::BoundingBox, bounds::wkb_bounds_xy, interval::IntervalTrait};
1112
use sedona_schema::datatypes::SedonaType;
1213

@@ -107,7 +108,9 @@ impl SpatialFilter {
107108
match scalar_fun.fun().name() {
108109
"st_intersects" => {
109110
if args.len() != 2 {
110-
return internal_err!("unexpected argument count in filter evaluation");
111+
return sedona_internal_err!(
112+
"unexpected argument count in filter evaluation"
113+
);
111114
}
112115

113116
match (&args[0], &args[1]) {
@@ -126,7 +129,9 @@ impl SpatialFilter {
126129
}
127130
"st_hasz" => {
128131
if args.len() != 1 {
129-
return internal_err!("unexpected argument count in filter evaluation");
132+
return sedona_internal_err!(
133+
"unexpected argument count in filter evaluation"
134+
);
130135
}
131136

132137
match &args[0] {
@@ -191,7 +196,7 @@ fn literal_bounds(literal: &Literal) -> Result<BoundingBox> {
191196
_ => {}
192197
}
193198

194-
internal_err!("Unexpected scalar type in filter expression")
199+
sedona_internal_err!("Unexpected scalar type in filter expression")
195200
}
196201

197202
fn parse_args(args: &[Arc<dyn PhysicalExpr>]) -> Vec<ArgRef<'_>> {

rust/sedona-functions/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ arrow-array = { workspace = true }
2525
datafusion-common = { workspace = true }
2626
datafusion-expr = { workspace = true }
2727
geo-traits = { workspace = true }
28+
sedona-common = { path = "../sedona-common" }
2829
sedona-expr = { path = "../sedona-expr" }
2930
sedona-geometry = { path = "../sedona-geometry" }
3031
sedona-schema = { path = "../sedona-schema" }

rust/sedona-functions/src/executor.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use std::iter::zip;
33
use arrow_array::ArrayRef;
44
use datafusion_common::cast::{as_binary_array, as_binary_view_array};
55
use datafusion_common::error::Result;
6-
use datafusion_common::{internal_err, DataFusionError, ScalarValue};
6+
use datafusion_common::{DataFusionError, ScalarValue};
77
use datafusion_expr::ColumnarValue;
8+
use sedona_common::sedona_internal_err;
89
use sedona_schema::datatypes::SedonaType;
910
use wkb::reader::Wkb;
1011

@@ -300,7 +301,7 @@ impl IterGeo for ArrayRef {
300301
func: F,
301302
) -> Result<()> {
302303
if num_iterations != self.len() {
303-
return internal_err!(
304+
return sedona_internal_err!(
304305
"Expected {num_iterations} items but got Array with {} items",
305306
self.len()
306307
);
@@ -313,7 +314,7 @@ impl IterGeo for ArrayRef {
313314
// We could cast here as a fallback, iterate and cast per-element, or
314315
// implement iter_as_something_else()/supports_iter_xxx() when more geo array types
315316
// are supported.
316-
internal_err!("Can't iterate over {:?} as Wkb", sedona_type)
317+
sedona_internal_err!("Can't iterate over {:?} as Wkb", sedona_type)
317318
}
318319
}
319320
}
@@ -326,7 +327,7 @@ impl ScalarGeo for ScalarValue {
326327
| ScalarValue::BinaryView(maybe_item)
327328
| ScalarValue::LargeBinary(maybe_item) => Ok(maybe_item.as_deref()),
328329
ScalarValue::Null => Ok(None),
329-
_ => internal_err!("Can't iterate over {:?} ScalarValue as &[u8]", self),
330+
_ => sedona_internal_err!("Can't iterate over {:?} ScalarValue as &[u8]", self),
330331
}
331332
}
332333
}
@@ -379,7 +380,7 @@ fn iter_wkb_wkb_array<
379380
_ => {
380381
// We could do casting of one or both sides to support other cases as they
381382
// arise to manage the complexity/performance balance
382-
internal_err!(
383+
sedona_internal_err!(
383384
"Can't iterate over {:?} and {:?} arrays as a pair of Wkb scalars",
384385
types.0,
385386
types.1

rust/sedona-functions/src/st_dimension.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use std::sync::Arc;
33
use crate::executor::WkbExecutor;
44
use arrow_array::builder::Int8Builder;
55
use arrow_schema::DataType;
6-
use datafusion_common::{error::Result, internal_err};
6+
use datafusion_common::error::Result;
77
use datafusion_expr::{
88
scalar_doc_sections::DOC_SECTION_OTHER, ColumnarValue, Documentation, Volatility,
99
};
1010
use geo_traits::{GeometryCollectionTrait, GeometryTrait, GeometryType};
11+
use sedona_common::sedona_internal_err;
1112
use sedona_expr::scalar_udf::{ArgMatcher, SedonaScalarKernel, SedonaScalarUDF};
1213
use sedona_schema::datatypes::SedonaType;
1314
use wkb::reader::Wkb;
@@ -76,7 +77,7 @@ fn invoke_scalar(item: &Wkb) -> Result<i8> {
7677
}
7778
Ok(highest_dim)
7879
}
79-
_ => internal_err!("Invalid geometry type"),
80+
_ => sedona_internal_err!("Invalid geometry type"),
8081
}
8182
}
8283

0 commit comments

Comments
 (0)