From 7b546b911ddbf9b067d54b711d625ac5e4c7468f Mon Sep 17 00:00:00 2001 From: Tim Saucer Date: Wed, 25 Mar 2026 18:36:03 -0400 Subject: [PATCH 1/2] Check foreign table provider when creating ffi provider --- datafusion/ffi/src/table_provider.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datafusion/ffi/src/table_provider.rs b/datafusion/ffi/src/table_provider.rs index df8b648026d3e..c6940a67de62a 100644 --- a/datafusion/ffi/src/table_provider.rs +++ b/datafusion/ffi/src/table_provider.rs @@ -390,6 +390,9 @@ impl FFI_TableProvider { runtime: Option, logical_codec: FFI_LogicalExtensionCodec, ) -> Self { + if let Some(provider) = provider.as_any().downcast_ref::() { + return provider.0.clone(); + } let private_data = Box::new(ProviderPrivateData { provider, runtime }); Self { From a8c6673cc595e42000e91365a09681255b345843 Mon Sep 17 00:00:00 2001 From: Tim Saucer Date: Wed, 25 Mar 2026 18:49:16 -0400 Subject: [PATCH 2/2] Check foreign catalog and schema provider when creating ffi versions --- datafusion/ffi/src/catalog_provider.rs | 5 +++++ datafusion/ffi/src/schema_provider.rs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/datafusion/ffi/src/catalog_provider.rs b/datafusion/ffi/src/catalog_provider.rs index 61e26f1663532..ff588a89a71b3 100644 --- a/datafusion/ffi/src/catalog_provider.rs +++ b/datafusion/ffi/src/catalog_provider.rs @@ -250,6 +250,11 @@ impl FFI_CatalogProvider { runtime: Option, logical_codec: FFI_LogicalExtensionCodec, ) -> Self { + if let Some(provider) = provider.as_any().downcast_ref::() + { + return provider.0.clone(); + } + let private_data = Box::new(ProviderPrivateData { provider, runtime }); Self { diff --git a/datafusion/ffi/src/schema_provider.rs b/datafusion/ffi/src/schema_provider.rs index b8e44b134f87b..5d1348e2328f7 100644 --- a/datafusion/ffi/src/schema_provider.rs +++ b/datafusion/ffi/src/schema_provider.rs @@ -259,6 +259,11 @@ impl FFI_SchemaProvider { runtime: Option, logical_codec: FFI_LogicalExtensionCodec, ) -> Self { + if let Some(provider) = provider.as_any().downcast_ref::() + { + return provider.0.clone(); + } + let owner_name = provider.owner_name().map(|s| s.into()).into(); let private_data = Box::new(ProviderPrivateData { provider, runtime });