From 1d101a59d6d0a934d754f29d57982b47e5cf95a6 Mon Sep 17 00:00:00 2001 From: Damian Owsianny Date: Thu, 5 Jan 2023 00:18:28 +0100 Subject: [PATCH 1/2] Execute prepared statements on client side by default --- trino/dbapi.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/trino/dbapi.py b/trino/dbapi.py index 21dbfc6e..97d7c599 100644 --- a/trino/dbapi.py +++ b/trino/dbapi.py @@ -429,8 +429,8 @@ def _deallocate_prepared_statement(self, statement_name: str) -> None: def _generate_unique_statement_name(self): return 'st_' + uuid.uuid4().hex.replace('-', '') - def execute(self, operation, params=None): - if params: + def execute(self, operation, params=None, prepared_statements_client_side=True): + if params and not prepared_statements_client_side: assert isinstance(params, (list, tuple)), ( 'params must be a list or tuple containing the query ' 'parameter values' @@ -454,6 +454,21 @@ def execute(self, operation, params=None): self._deallocate_prepared_statement(statement_name) else: + # Approach with parsing on client side + if params: + assert isinstance(params, (list, tuple)), ( + 'params must be a list or tuple containing the query ' + 'parameter values' + ) + + # substitue parameters in query in reversed order + question_mark_positions = [index for index, character in enumerate(operation) if character == '?'] + question_mark_positions.reverse() + for index, value in enumerate(reversed(params)): + operation = "".join([operation[:question_mark_positions[index]], + "'", value, "'", + operation[question_mark_positions[index] + 1:]]) + self._query = trino.client.TrinoQuery(self._request, sql=operation, experimental_python_types=self._experimental_pyton_types) result = self._query.execute() From dab8de2cc4de1ecfcb41aa26cd4e29401cacf1d9 Mon Sep 17 00:00:00 2001 From: Damian Owsianny Date: Thu, 5 Jan 2023 10:39:04 +0100 Subject: [PATCH 2/2] approach with ClientSession manipulation --- trino/dbapi.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/trino/dbapi.py b/trino/dbapi.py index 97d7c599..57ea2865 100644 --- a/trino/dbapi.py +++ b/trino/dbapi.py @@ -336,6 +336,9 @@ def _prepare_statement(self, statement: str, name: str) -> None: experimental_python_types=self._experimental_pyton_types) query.execute() + # Approach with directly manipulating on ClientSession + # self._connection._client_session.prepared_statements[name] = statement + def _execute_prepared_statement( self, statement_name, @@ -426,6 +429,9 @@ def _deallocate_prepared_statement(self, statement_name: str) -> None: experimental_python_types=self._experimental_pyton_types) query.execute() + # Approach with directly manipulating on ClientSession + # self._connection._client_session.prepared_statements.pop(statement_name, None) + def _generate_unique_statement_name(self): return 'st_' + uuid.uuid4().hex.replace('-', '')