@@ -34,7 +34,7 @@ use pyo3::prelude::*;
3434use crate :: catalog:: { PyCatalog , PyTable , RustWrappedPyCatalogProvider } ;
3535use crate :: dataframe:: PyDataFrame ;
3636use crate :: dataset:: Dataset ;
37- use crate :: errors:: { py_datafusion_err, to_datafusion_err, PyDataFusionResult } ;
37+ use crate :: errors:: { py_datafusion_err, py_runtime_err , to_datafusion_err, PyDataFusionResult } ;
3838use crate :: expr:: sort_expr:: PySortExpr ;
3939use crate :: physical_plan:: PyExecutionPlan ;
4040use crate :: record_batch:: PyRecordBatchStream ;
@@ -72,6 +72,7 @@ use datafusion::prelude::{
7272} ;
7373use datafusion_ffi:: catalog_provider:: { FFI_CatalogProvider , ForeignCatalogProvider } ;
7474use datafusion_ffi:: table_provider:: { FFI_TableProvider , ForeignTableProvider } ;
75+ use deltalake:: ensure_table_uri;
7576use pyo3:: types:: { PyCapsule , PyDict , PyList , PyTuple , PyType } ;
7677use pyo3:: IntoPyObjectExt ;
7778use tokio:: task:: JoinHandle ;
@@ -320,6 +321,13 @@ impl PySessionContext {
320321 } else {
321322 RuntimeEnvBuilder :: default ( )
322323 } ;
324+ deltalake:: azure:: register_handlers ( None ) ;
325+ deltalake:: aws:: register_handlers ( None ) ;
326+ let _ = env_logger:: try_init ( ) ;
327+
328+ let config = config. set_bool ( "datafusion.sql_parser.enable_ident_normalization" , false ) ;
329+
330+
323331 let runtime = Arc :: new ( runtime_env_builder. build ( ) ?) ;
324332 let session_state = SessionStateBuilder :: new ( )
325333 . with_config ( config)
@@ -875,6 +883,22 @@ impl PySessionContext {
875883 Ok ( ( ) )
876884 }
877885
886+ pub fn register_delta_table (
887+ & self ,
888+ name : & str ,
889+ table_uri : & str ,
890+ storage_opts : HashMap < String , String > ,
891+ py : Python ,
892+ ) -> PyResult < ( ) > {
893+ deltalake:: ensure_initialized ( ) ;
894+ let table_uri = ensure_table_uri ( table_uri) . map_err ( py_runtime_err) ?;
895+ let table = deltalake:: open_table_with_storage_options ( table_uri, storage_opts) ;
896+ let table = wait_for_future ( py, table) ?. map_err ( py_datafusion_err) ?;
897+ self . ctx . register_table ( name, Arc :: new ( table) ) . map_err ( py_datafusion_err) ?;
898+ Ok ( ( ) )
899+ }
900+
901+
878902 #[ pyo3( signature = ( name="datafusion" ) ) ]
879903 pub fn catalog ( & self , name : & str ) -> PyResult < PyObject > {
880904 let catalog = self . ctx . catalog ( name) . ok_or ( PyKeyError :: new_err ( format ! (
0 commit comments