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

timsaucer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-python.git


The following commit(s) were added to refs/heads/main by this push:
     new 207fc16d Remove validate_pycapsule (#1426)
207fc16d is described below

commit 207fc16d62e2f64b687798741b33964aad9b5b7e
Author: Thomas Tanon <[email protected]>
AuthorDate: Fri Mar 27 14:39:20 2026 +0100

    Remove validate_pycapsule (#1426)
    
    The Bound<'_, PyCapsule>::pointer_checked does the same validation and is 
already used across the codebase
---
 crates/core/src/array.rs     |  6 +-----
 crates/core/src/catalog.rs   | 11 +++--------
 crates/core/src/context.rs   | 21 ++++++---------------
 crates/core/src/dataframe.rs |  7 ++-----
 crates/core/src/udaf.rs      |  7 ++-----
 crates/core/src/udf.rs       | 11 ++++-------
 crates/core/src/udtf.rs      |  8 ++------
 crates/core/src/udwf.rs      | 11 ++++-------
 crates/util/src/lib.rs       | 13 ++++---------
 9 files changed, 28 insertions(+), 67 deletions(-)

diff --git a/crates/core/src/array.rs b/crates/core/src/array.rs
index 99e63ef5..f284fa9d 100644
--- a/crates/core/src/array.rs
+++ b/crates/core/src/array.rs
@@ -22,8 +22,6 @@ use arrow::array::{Array, ArrayRef};
 use arrow::datatypes::{Field, FieldRef};
 use arrow::ffi::{FFI_ArrowArray, FFI_ArrowSchema};
 use arrow::pyarrow::ToPyArrow;
-use datafusion_python_util::validate_pycapsule;
-use pyo3::ffi::c_str;
 use pyo3::prelude::{PyAnyMethods, PyCapsuleMethods};
 use pyo3::types::PyCapsule;
 use pyo3::{Bound, PyAny, PyResult, Python, pyclass, pymethods};
@@ -53,10 +51,8 @@ impl PyArrowArrayExportable {
         requested_schema: Option<Bound<'py, PyCapsule>>,
     ) -> PyDataFusionResult<(Bound<'py, PyCapsule>, Bound<'py, PyCapsule>)> {
         let field = if let Some(schema_capsule) = requested_schema {
-            validate_pycapsule(&schema_capsule, "arrow_schema")?;
-
             let data: NonNull<FFI_ArrowSchema> = schema_capsule
-                .pointer_checked(Some(c_str!("arrow_schema")))?
+                .pointer_checked(Some(c"arrow_schema"))?
                 .cast();
             let schema_ptr = unsafe { data.as_ref() };
             let desired_field = Field::try_from(schema_ptr)?;
diff --git a/crates/core/src/catalog.rs b/crates/core/src/catalog.rs
index f707e7e5..30ec4744 100644
--- a/crates/core/src/catalog.rs
+++ b/crates/core/src/catalog.rs
@@ -31,12 +31,10 @@ use datafusion_ffi::catalog_provider::FFI_CatalogProvider;
 use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
 use datafusion_ffi::schema_provider::FFI_SchemaProvider;
 use datafusion_python_util::{
-    create_logical_extension_capsule, ffi_logical_codec_from_pycapsule, 
validate_pycapsule,
-    wait_for_future,
+    create_logical_extension_capsule, ffi_logical_codec_from_pycapsule, 
wait_for_future,
 };
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::PyKeyError;
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::PyCapsule;
 
@@ -659,9 +657,8 @@ fn extract_catalog_provider_from_pyobj(
     }
 
     let provider = if let Ok(capsule) = catalog_provider.cast::<PyCapsule>() {
-        validate_pycapsule(capsule, "datafusion_catalog_provider")?;
         let data: NonNull<FFI_CatalogProvider> = capsule
-            .pointer_checked(Some(c_str!("datafusion_catalog_provider")))?
+            .pointer_checked(Some(c"datafusion_catalog_provider"))?
             .cast();
         let provider = unsafe { data.as_ref() };
         let provider: Arc<dyn CatalogProvider + Send> = provider.into();
@@ -692,10 +689,8 @@ fn extract_schema_provider_from_pyobj(
     }
 
     let provider = if let Ok(capsule) = schema_provider.cast::<PyCapsule>() {
-        validate_pycapsule(capsule, "datafusion_schema_provider")?;
-
         let data: NonNull<FFI_SchemaProvider> = capsule
-            .pointer_checked(Some(c_str!("datafusion_schema_provider")))?
+            .pointer_checked(Some(c"datafusion_schema_provider"))?
             .cast();
         let provider = unsafe { data.as_ref() };
         let provider: Arc<dyn SchemaProvider + Send> = provider.into();
diff --git a/crates/core/src/context.rs b/crates/core/src/context.rs
index 200b6470..00cab4be 100644
--- a/crates/core/src/context.rs
+++ b/crates/core/src/context.rs
@@ -55,12 +55,11 @@ use 
datafusion_ffi::table_provider_factory::FFI_TableProviderFactory;
 use datafusion_proto::logical_plan::DefaultLogicalExtensionCodec;
 use datafusion_python_util::{
     create_logical_extension_capsule, ffi_logical_codec_from_pycapsule, 
get_global_ctx,
-    get_tokio_runtime, spawn_future, validate_pycapsule, wait_for_future,
+    get_tokio_runtime, spawn_future, wait_for_future,
 };
 use object_store::ObjectStore;
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::{PyKeyError, PyValueError};
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyDict, PyList, PyTuple};
 use url::Url;
@@ -675,10 +674,8 @@ impl PySessionContext {
 
         let factory: Arc<dyn TableProviderFactory> =
             if let Ok(capsule) = 
factory.cast::<PyCapsule>().map_err(py_datafusion_err) {
-                validate_pycapsule(capsule, 
"datafusion_table_provider_factory")?;
-
                 let data: NonNull<FFI_TableProviderFactory> = capsule
-                    
.pointer_checked(Some(c_str!("datafusion_table_provider_factory")))?
+                    
.pointer_checked(Some(c"datafusion_table_provider_factory"))?
                     .cast();
                 let factory = unsafe { data.as_ref() };
                 factory.into()
@@ -709,12 +706,9 @@ impl PySessionContext {
                 .call1((codec_capsule,))?;
         }
 
-        let provider = if let Ok(capsule) = 
provider.cast::<PyCapsule>().map_err(py_datafusion_err)
-        {
-            validate_pycapsule(capsule, "datafusion_catalog_provider_list")?;
-
+        let provider = if let Ok(capsule) = provider.cast::<PyCapsule>() {
             let data: NonNull<FFI_CatalogProviderList> = capsule
-                
.pointer_checked(Some(c_str!("datafusion_catalog_provider_list")))?
+                .pointer_checked(Some(c"datafusion_catalog_provider_list"))?
                 .cast();
             let provider = unsafe { data.as_ref() };
             let provider: Arc<dyn CatalogProviderList + Send> = 
provider.into();
@@ -747,12 +741,9 @@ impl PySessionContext {
                 .call1((codec_capsule,))?;
         }
 
-        let provider = if let Ok(capsule) = 
provider.cast::<PyCapsule>().map_err(py_datafusion_err)
-        {
-            validate_pycapsule(capsule, "datafusion_catalog_provider")?;
-
+        let provider = if let Ok(capsule) = provider.cast::<PyCapsule>() {
             let data: NonNull<FFI_CatalogProvider> = capsule
-                .pointer_checked(Some(c_str!("datafusion_catalog_provider")))?
+                .pointer_checked(Some(c"datafusion_catalog_provider"))?
                 .cast();
             let provider = unsafe { data.as_ref() };
             let provider: Arc<dyn CatalogProvider + Send> = provider.into();
diff --git a/crates/core/src/dataframe.rs b/crates/core/src/dataframe.rs
index 29fc05ed..72595ba8 100644
--- a/crates/core/src/dataframe.rs
+++ b/crates/core/src/dataframe.rs
@@ -41,12 +41,11 @@ use datafusion::logical_expr::SortExpr;
 use datafusion::logical_expr::dml::InsertOp;
 use datafusion::parquet::basic::{BrotliLevel, Compression, GzipLevel, 
ZstdLevel};
 use datafusion::prelude::*;
-use datafusion_python_util::{is_ipython_env, spawn_future, validate_pycapsule, 
wait_for_future};
+use datafusion_python_util::{is_ipython_env, spawn_future, wait_for_future};
 use futures::{StreamExt, TryStreamExt};
 use parking_lot::Mutex;
 use pyo3::PyErr;
 use pyo3::exceptions::PyValueError;
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::pybacked::PyBackedStr;
 use pyo3::types::{PyCapsule, PyList, PyTuple, PyTupleMethods};
@@ -1117,10 +1116,8 @@ impl PyDataFrame {
         let mut projection: Option<SchemaRef> = None;
 
         if let Some(schema_capsule) = requested_schema {
-            validate_pycapsule(&schema_capsule, "arrow_schema")?;
-
             let data: NonNull<FFI_ArrowSchema> = schema_capsule
-                .pointer_checked(Some(c_str!("arrow_schema")))?
+                .pointer_checked(Some(c"arrow_schema"))?
                 .cast();
             let schema_ptr = unsafe { data.as_ref() };
             let desired_schema = Schema::try_from(schema_ptr)?;
diff --git a/crates/core/src/udaf.rs b/crates/core/src/udaf.rs
index ed26c79c..80ef5171 100644
--- a/crates/core/src/udaf.rs
+++ b/crates/core/src/udaf.rs
@@ -27,8 +27,7 @@ use datafusion::logical_expr::{
     Accumulator, AccumulatorFactoryFunction, AggregateUDF, AggregateUDFImpl, 
create_udaf,
 };
 use datafusion_ffi::udaf::FFI_AggregateUDF;
-use datafusion_python_util::{parse_volatility, validate_pycapsule};
-use pyo3::ffi::c_str;
+use datafusion_python_util::parse_volatility;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyTuple};
 
@@ -157,10 +156,8 @@ pub fn to_rust_accumulator(accum: Py<PyAny>) -> 
AccumulatorFactoryFunction {
 }
 
 fn aggregate_udf_from_capsule(capsule: &Bound<'_, PyCapsule>) -> 
PyDataFusionResult<AggregateUDF> {
-    validate_pycapsule(capsule, "datafusion_aggregate_udf")?;
-
     let data: NonNull<FFI_AggregateUDF> = capsule
-        .pointer_checked(Some(c_str!("datafusion_aggregate_udf")))?
+        .pointer_checked(Some(c"datafusion_aggregate_udf"))?
         .cast();
     let udaf = unsafe { data.as_ref() };
     let udaf: Arc<dyn AggregateUDFImpl> = udaf.into();
diff --git a/crates/core/src/udf.rs b/crates/core/src/udf.rs
index 7543f96d..c0a39cb4 100644
--- a/crates/core/src/udf.rs
+++ b/crates/core/src/udf.rs
@@ -32,13 +32,12 @@ use datafusion::logical_expr::{
     Volatility,
 };
 use datafusion_ffi::udf::FFI_ScalarUDF;
-use datafusion_python_util::{parse_volatility, validate_pycapsule};
-use pyo3::ffi::c_str;
+use datafusion_python_util::parse_volatility;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyTuple};
 
 use crate::array::PyArrowArrayExportable;
-use crate::errors::{PyDataFusionResult, py_datafusion_err, to_datafusion_err};
+use crate::errors::{PyDataFusionResult, to_datafusion_err};
 use crate::expr::PyExpr;
 
 /// This struct holds the Python written function that is a
@@ -194,11 +193,9 @@ impl PyScalarUDF {
     pub fn from_pycapsule(func: Bound<'_, PyAny>) -> PyDataFusionResult<Self> {
         if func.hasattr("__datafusion_scalar_udf__")? {
             let capsule = func.getattr("__datafusion_scalar_udf__")?.call0()?;
-            let capsule = 
capsule.cast::<PyCapsule>().map_err(py_datafusion_err)?;
-            validate_pycapsule(capsule, "datafusion_scalar_udf")?;
-
+            let capsule = 
capsule.cast::<PyCapsule>().map_err(to_datafusion_err)?;
             let data: NonNull<FFI_ScalarUDF> = capsule
-                .pointer_checked(Some(c_str!("datafusion_scalar_udf")))?
+                .pointer_checked(Some(c"datafusion_scalar_udf"))?
                 .cast();
             let udf = unsafe { data.as_ref() };
             let udf: Arc<dyn ScalarUDFImpl> = udf.into();
diff --git a/crates/core/src/udtf.rs b/crates/core/src/udtf.rs
index 77c5ffbb..9371732d 100644
--- a/crates/core/src/udtf.rs
+++ b/crates/core/src/udtf.rs
@@ -22,10 +22,8 @@ use datafusion::catalog::{TableFunctionImpl, TableProvider};
 use datafusion::error::Result as DataFusionResult;
 use datafusion::logical_expr::Expr;
 use datafusion_ffi::udtf::FFI_TableFunction;
-use datafusion_python_util::validate_pycapsule;
 use pyo3::IntoPyObjectExt;
 use pyo3::exceptions::{PyImportError, PyTypeError};
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyTuple, PyType};
 
@@ -73,11 +71,9 @@ impl PyTableFunction {
                     err
                 }
             })?;
-            let capsule = 
capsule.cast::<PyCapsule>().map_err(py_datafusion_err)?;
-            validate_pycapsule(capsule, "datafusion_table_function")?;
-
+            let capsule = capsule.cast::<PyCapsule>()?;
             let data: NonNull<FFI_TableFunction> = capsule
-                .pointer_checked(Some(c_str!("datafusion_table_function")))?
+                .pointer_checked(Some(c"datafusion_table_function"))?
                 .cast();
             let ffi_func = unsafe { data.as_ref() };
             let foreign_func: Arc<dyn TableFunctionImpl> = 
ffi_func.to_owned().into();
diff --git a/crates/core/src/udwf.rs b/crates/core/src/udwf.rs
index ff7ab035..1d3608ad 100644
--- a/crates/core/src/udwf.rs
+++ b/crates/core/src/udwf.rs
@@ -32,14 +32,13 @@ use datafusion::logical_expr::{
 };
 use datafusion::scalar::ScalarValue;
 use datafusion_ffi::udwf::FFI_WindowUDF;
-use datafusion_python_util::{parse_volatility, validate_pycapsule};
+use datafusion_python_util::parse_volatility;
 use pyo3::exceptions::PyValueError;
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyList, PyTuple};
 
 use crate::common::data_type::PyScalarValue;
-use crate::errors::{PyDataFusionResult, py_datafusion_err, to_datafusion_err};
+use crate::errors::{PyDataFusionResult, to_datafusion_err};
 use crate::expr::PyExpr;
 
 #[derive(Debug)]
@@ -262,11 +261,9 @@ impl PyWindowUDF {
             func
         };
 
-        let capsule = capsule.cast::<PyCapsule>().map_err(py_datafusion_err)?;
-        validate_pycapsule(capsule, "datafusion_window_udf")?;
-
+        let capsule = capsule.cast::<PyCapsule>().map_err(to_datafusion_err)?;
         let data: NonNull<FFI_WindowUDF> = capsule
-            .pointer_checked(Some(c_str!("datafusion_window_udf")))?
+            .pointer_checked(Some(c"datafusion_window_udf"))?
             .cast();
         let udwf = unsafe { data.as_ref() };
         let udwf: Arc<dyn WindowUDFImpl> = udwf.into();
diff --git a/crates/util/src/lib.rs b/crates/util/src/lib.rs
index 2678a6b9..5b1c8993 100644
--- a/crates/util/src/lib.rs
+++ b/crates/util/src/lib.rs
@@ -26,14 +26,13 @@ use datafusion::logical_expr::Volatility;
 use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec;
 use datafusion_ffi::table_provider::FFI_TableProvider;
 use pyo3::exceptions::{PyImportError, PyTypeError, PyValueError};
-use pyo3::ffi::c_str;
 use pyo3::prelude::*;
 use pyo3::types::{PyCapsule, PyType};
 use tokio::runtime::Runtime;
 use tokio::task::JoinHandle;
 use tokio::time::sleep;
 
-use crate::errors::{PyDataFusionError, PyDataFusionResult, py_datafusion_err, 
to_datafusion_err};
+use crate::errors::{PyDataFusionError, PyDataFusionResult, to_datafusion_err};
 
 pub mod errors;
 
@@ -186,11 +185,9 @@ pub fn table_provider_from_pycapsule<'py>(
         })?;
     }
 
-    if let Ok(capsule) = obj.cast::<PyCapsule>().map_err(py_datafusion_err) {
-        validate_pycapsule(capsule, "datafusion_table_provider")?;
-
+    if let Ok(capsule) = obj.cast::<PyCapsule>() {
         let data: NonNull<FFI_TableProvider> = capsule
-            .pointer_checked(Some(c_str!("datafusion_table_provider")))?
+            .pointer_checked(Some(c"datafusion_table_provider"))?
             .cast();
         let provider = unsafe { data.as_ref() };
         let provider: Arc<dyn TableProvider> = provider.into();
@@ -220,10 +217,8 @@ pub fn ffi_logical_codec_from_pycapsule(obj: Bound<PyAny>) 
-> PyResult<FFI_Logic
     };
 
     let capsule = capsule.cast::<PyCapsule>()?;
-    validate_pycapsule(capsule, "datafusion_logical_extension_codec")?;
-
     let data: NonNull<FFI_LogicalExtensionCodec> = capsule
-        .pointer_checked(Some(c_str!("datafusion_logical_extension_codec")))?
+        .pointer_checked(Some(c"datafusion_logical_extension_codec"))?
         .cast();
     let codec = unsafe { data.as_ref() };
 


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

Reply via email to