1818use crate :: dataset:: Dataset ;
1919use crate :: errors:: { py_datafusion_err, to_datafusion_err, PyDataFusionError , PyDataFusionResult } ;
2020use crate :: table:: PyTableProvider ;
21- use crate :: utils:: { table_provider_from_pycapsule, validate_pycapsule, wait_for_future} ;
21+ use crate :: utils:: {
22+ table_provider_from_pycapsule, table_provider_send_to_table_provider, table_provider_to_send,
23+ validate_pycapsule, wait_for_future,
24+ } ;
2225use async_trait:: async_trait;
2326use datafusion:: catalog:: { MemoryCatalogProvider , MemorySchemaProvider } ;
2427use datafusion:: common:: DataFusionError ;
@@ -354,13 +357,7 @@ impl SchemaProvider for RustWrappedPySchemaProvider {
354357 ) -> datafusion:: common:: Result < Option < Arc < dyn TableProvider > > , DataFusionError > {
355358 // Convert from our internal Send type to the trait expected type
356359 match self . table_inner ( name) . map_err ( to_datafusion_err) ? {
357- Some ( table) => {
358- // Safe conversion: we're widening the bounds (removing Send)
359- let raw = Arc :: into_raw ( table) ;
360- let wide: * const dyn TableProvider = raw as * const _ ;
361- let arc = unsafe { Arc :: from_raw ( wide) } ;
362- Ok ( Some ( arc) )
363- }
360+ Some ( table) => Ok ( Some ( table_provider_send_to_table_provider ( table) ) ) ,
364361 None => Ok ( None ) ,
365362 }
366363 }
@@ -371,11 +368,7 @@ impl SchemaProvider for RustWrappedPySchemaProvider {
371368 table : Arc < dyn TableProvider > ,
372369 ) -> datafusion:: common:: Result < Option < Arc < dyn TableProvider > > > {
373370 // Convert from trait type to our internal Send type
374- let send_table = {
375- let raw = Arc :: into_raw ( table) ;
376- let send: * const ( dyn TableProvider + Send ) = raw as * const _ ;
377- unsafe { Arc :: from_raw ( send) }
378- } ;
371+ let send_table = table_provider_to_send ( table) ;
379372
380373 let py_table = PyTable :: new ( send_table) ;
381374 Python :: with_gil ( |py| {
@@ -407,12 +400,8 @@ impl SchemaProvider for RustWrappedPySchemaProvider {
407400 // Otherwise, return None.
408401 let dataset = match Dataset :: new ( & table, py) {
409402 Ok ( dataset) => {
410- // Convert from our internal Send type to trait expected type
411403 let send_table = Arc :: new ( dataset) as Arc < dyn TableProvider + Send > ;
412- let raw = Arc :: into_raw ( send_table) ;
413- let wide: * const dyn TableProvider = raw as * const _ ;
414- let arc = unsafe { Arc :: from_raw ( wide) } ;
415- Some ( arc)
404+ Some ( table_provider_send_to_table_provider ( send_table) )
416405 }
417406 Err ( _) => None ,
418407 } ;
0 commit comments