@@ -429,8 +429,8 @@ def _deallocate_prepared_statement(self, statement_name: str) -> None:
429429 def _generate_unique_statement_name (self ):
430430 return 'st_' + uuid .uuid4 ().hex .replace ('-' , '' )
431431
432- def execute (self , operation , params = None ):
433- if params :
432+ def execute (self , operation , params = None , prepared_statements_client_side = True ):
433+ if params and not prepared_statements_client_side :
434434 assert isinstance (params , (list , tuple )), (
435435 'params must be a list or tuple containing the query '
436436 'parameter values'
@@ -454,6 +454,21 @@ def execute(self, operation, params=None):
454454 self ._deallocate_prepared_statement (statement_name )
455455
456456 else :
457+ # Approach with parsing on client side
458+ if params :
459+ assert isinstance (params , (list , tuple )), (
460+ 'params must be a list or tuple containing the query '
461+ 'parameter values'
462+ )
463+
464+ # substitue parameters in query in reversed order
465+ question_mark_positions = [index for index , character in enumerate (operation ) if character == '?' ]
466+ question_mark_positions .reverse ()
467+ for index , value in enumerate (reversed (params )):
468+ operation = "" .join ([operation [:question_mark_positions [index ]],
469+ "'" , value , "'" ,
470+ operation [question_mark_positions [index ] + 1 :]])
471+
457472 self ._query = trino .client .TrinoQuery (self ._request , sql = operation ,
458473 experimental_python_types = self ._experimental_pyton_types )
459474 result = self ._query .execute ()
0 commit comments