Skip to content

Commit 1d101a5

Browse files
committed
Execute prepared statements on client side by default
1 parent 8affa61 commit 1d101a5

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

trino/dbapi.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)