@@ -35,15 +35,15 @@ use crate::catalog::{PyCatalog, RustWrappedPyCatalogProvider};
3535use crate :: common:: data_type:: PyScalarValue ;
3636use crate :: dataframe:: PyDataFrame ;
3737use crate :: dataset:: Dataset ;
38- use crate :: errors:: { py_datafusion_err, to_datafusion_err, PyDataFusionError , PyDataFusionResult } ;
38+ use crate :: errors:: { py_datafusion_err, to_datafusion_err, PyDataFusionResult } ;
3939use crate :: expr:: sort_expr:: PySortExpr ;
4040use crate :: physical_plan:: PyExecutionPlan ;
4141use crate :: record_batch:: PyRecordBatchStream ;
4242use crate :: sql:: exceptions:: py_value_err;
4343use crate :: sql:: logical:: PyLogicalPlan ;
44- use crate :: sql:: util:: replace_placeholders_with_table_names ;
44+ use crate :: sql:: util:: replace_placeholders_with_strings ;
4545use crate :: store:: StorageContexts ;
46- use crate :: table:: { PyTable , TempViewTable } ;
46+ use crate :: table:: PyTable ;
4747use crate :: udaf:: PyAggregateUDF ;
4848use crate :: udf:: PyScalarUDF ;
4949use crate :: udtf:: PyTableFunction ;
@@ -429,54 +429,41 @@ impl PySessionContext {
429429 self . ctx . register_udtf ( & name, func) ;
430430 }
431431
432- #[ pyo3( signature = ( query, options=None , scalar_params=vec! [ ] , dataframe_params=vec! [ ] ) ) ]
432+ #[ pyo3( signature = ( query, options=None , param_values= HashMap :: default ( ) , param_strings= HashMap :: default ( ) ) ) ]
433433 pub fn sql_with_options (
434434 & self ,
435435 py : Python ,
436- query : & str ,
436+ mut query : String ,
437437 options : Option < PySQLOptions > ,
438- scalar_params : Vec < ( String , PyScalarValue ) > ,
439- dataframe_params : Vec < ( String , PyDataFrame ) > ,
438+ param_values : HashMap < String , PyScalarValue > ,
439+ param_strings : HashMap < String , String > ,
440440 ) -> PyDataFusionResult < PyDataFrame > {
441441 let options = if let Some ( options) = options {
442442 options. options
443443 } else {
444444 SQLOptions :: new ( )
445445 } ;
446446
447- let scalar_params = scalar_params
447+ let param_values = param_values
448448 . into_iter ( )
449449 . map ( |( name, value) | ( name, ScalarValue :: from ( value) ) )
450- . collect :: < Vec < _ > > ( ) ;
451-
452- let dataframe_params = dataframe_params
453- . into_iter ( )
454- . map ( |( name, df) | {
455- let uuid = Uuid :: new_v4 ( ) . to_string ( ) . replace ( "-" , "" ) ;
456- let view_name = format ! ( "view_{uuid}" ) ;
457-
458- self . create_temporary_view ( py, view_name. as_str ( ) , df, true ) ?;
459- Ok ( ( name, view_name) )
460- } )
461- . collect :: < Result < HashMap < _ , _ > , PyDataFusionError > > ( ) ?;
450+ . collect :: < HashMap < _ , _ > > ( ) ;
462451
463452 let state = self . ctx . state ( ) ;
464453 let dialect = state. config ( ) . options ( ) . sql_parser . dialect . as_str ( ) ;
465454
466- let query = replace_placeholders_with_table_names ( query, dialect, dataframe_params) ?;
467-
468- println ! ( "using scalar params: {scalar_params:?}" ) ;
469- let df = wait_for_future ( py, async {
470- self . ctx
471- . sql_with_options ( & query, options)
472- . await
473- . map_err ( |err| {
474- println ! ( "error before param replacement: {}" , err) ;
475- err
476- } ) ?
477- . with_param_values ( scalar_params)
455+ if !param_strings. is_empty ( ) {
456+ query = replace_placeholders_with_strings ( & query, dialect, param_strings) ?;
457+ }
458+
459+ let mut df = wait_for_future ( py, async {
460+ self . ctx . sql_with_options ( & query, options) . await
478461 } ) ??;
479462
463+ if !param_values. is_empty ( ) {
464+ df = df. with_param_values ( param_values) ?;
465+ }
466+
480467 Ok ( PyDataFrame :: new ( df) )
481468 }
482469
@@ -521,29 +508,6 @@ impl PySessionContext {
521508 PyDataFrame :: new ( DataFrame :: new ( self . ctx . state ( ) , plan. plan . as_ref ( ) . clone ( ) ) )
522509 }
523510
524- pub fn create_temporary_view (
525- & self ,
526- py : Python ,
527- name : & str ,
528- df : PyDataFrame ,
529- replace_if_exists : bool ,
530- ) -> PyDataFusionResult < ( ) > {
531- if self . table ( name, py) . is_ok ( ) {
532- if replace_if_exists {
533- let _ = self . deregister_table ( name) ;
534- } else {
535- exec_err ! (
536- "Unable to create temporary view. Table with name {name} already exists."
537- ) ?;
538- }
539- }
540-
541- let table = Arc :: new ( TempViewTable :: new ( df. inner_df ( ) ) ) ;
542- self . ctx . register_table ( name, table) ?;
543-
544- Ok ( ( ) )
545- }
546-
547511 /// Construct datafusion dataframe from Python list
548512 #[ pyo3( signature = ( data, name=None ) ) ]
549513 pub fn from_pylist (
0 commit comments