@@ -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 ;
@@ -320,6 +320,13 @@ impl PySessionContext {
320320 } else {
321321 RuntimeEnvBuilder :: default ( )
322322 } ;
323+ deltalake:: azure:: register_handlers ( None ) ;
324+ deltalake:: aws:: register_handlers ( None ) ;
325+ let _ = env_logger:: try_init ( ) ;
326+
327+ let config = config. set_bool ( "datafusion.sql_parser.enable_ident_normalization" , false ) ;
328+
329+
323330 let runtime = Arc :: new ( runtime_env_builder. build ( ) ?) ;
324331 let session_state = SessionStateBuilder :: new ( )
325332 . with_config ( config)
@@ -875,6 +882,22 @@ impl PySessionContext {
875882 Ok ( ( ) )
876883 }
877884
885+ pub fn register_delta_table (
886+ & self ,
887+ name : & str ,
888+ table_uri : & str ,
889+ storage_opts : HashMap < String , String > ,
890+ py : Python ,
891+ ) -> PyResult < ( ) > {
892+ deltalake:: ensure_initialized ( ) ;
893+ let table_uri = Url :: parse ( table_uri) . map_err ( py_runtime_err) ?;
894+ let table = deltalake:: open_table_with_storage_options ( table_uri, storage_opts) ;
895+ let table = wait_for_future ( py, table) ?. map_err ( py_datafusion_err) ?;
896+ self . ctx . register_table ( name, Arc :: new ( table) ) . map_err ( py_datafusion_err) ?;
897+ Ok ( ( ) )
898+ }
899+
900+
878901 #[ pyo3( signature = ( name="datafusion" ) ) ]
879902 pub fn catalog ( & self , name : & str ) -> PyResult < PyObject > {
880903 let catalog = self . ctx . catalog ( name) . ok_or ( PyKeyError :: new_err ( format ! (
0 commit comments