2727except ImportError :
2828 from typing_extensions import deprecated # Python 3.12
2929
30+ import uuid
31+
3032import pyarrow as pa
3133
3234from datafusion .catalog import Catalog
@@ -592,7 +594,9 @@ def register_listing_table(
592594 self ._convert_file_sort_order (file_sort_order ),
593595 )
594596
595- def sql (self , query : str , options : SQLOptions | None = None ) -> DataFrame :
597+ def sql (
598+ self , query : str , options : SQLOptions | None = None , ** named_params : Any
599+ ) -> DataFrame :
596600 """Create a :py:class:`~datafusion.DataFrame` from SQL query text.
597601
598602 Note: This API implements DDL statements such as ``CREATE TABLE`` and
@@ -603,10 +607,25 @@ def sql(self, query: str, options: SQLOptions | None = None) -> DataFrame:
603607 Args:
604608 query: SQL query text.
605609 options: If provided, the query will be validated against these options.
610+ named_params: Provides substitution in the query string.
606611
607612 Returns:
608613 DataFrame representation of the SQL query.
609614 """
615+ if named_params :
616+ for alias , param in named_params .items ():
617+ if isinstance (param , DataFrame ):
618+ view_name = str (uuid .uuid4 ()).replace ("-" , "_" )
619+ view_name = f"view_{ view_name } "
620+ self .ctx .create_temporary_view (
621+ view_name , param .df , replace_if_exists = True
622+ )
623+ replace_str = view_name
624+ else :
625+ replace_str = str (param )
626+
627+ query = query .replace (f"{{{ alias } }}" , replace_str )
628+
610629 if options is None :
611630 return DataFrame (self .ctx .sql (query ))
612631 return DataFrame (self .ctx .sql_with_options (query , options .options_internal ))
0 commit comments