@@ -429,8 +429,8 @@ def _deallocate_prepared_statement(self, statement_name: str) -> None:
429
429
def _generate_unique_statement_name (self ):
430
430
return 'st_' + uuid .uuid4 ().hex .replace ('-' , '' )
431
431
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 :
434
434
assert isinstance (params , (list , tuple )), (
435
435
'params must be a list or tuple containing the query '
436
436
'parameter values'
@@ -454,6 +454,21 @@ def execute(self, operation, params=None):
454
454
self ._deallocate_prepared_statement (statement_name )
455
455
456
456
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
+
457
472
self ._query = trino .client .TrinoQuery (self ._request , sql = operation ,
458
473
experimental_python_types = self ._experimental_pyton_types )
459
474
result = self ._query .execute ()
0 commit comments