if self._has_events or self.engine._has_events:
(
+ default,
distilled_params,
event_multiparams,
event_params,
if self._has_events or self.engine._has_events:
(
+ ddl,
distilled_params,
event_multiparams,
event_params,
else:
distilled_params = []
- return distilled_params, event_multiparams, event_params
+ return elem, distilled_params, event_multiparams, event_params
def _execute_clauseelement(
self, elem, multiparams, params, execution_options
has_events = self._has_events or self.engine._has_events
if has_events:
(
+ elem,
distilled_params,
event_multiparams,
event_params,
if self._has_events or self.engine._has_events:
(
+ compiled,
distilled_params,
event_multiparams,
event_params,
if not future:
if self._has_events or self.engine._has_events:
(
+ statement,
distilled_params,
event_multiparams,
event_params,
)
eq_(result.all(), [("15",)])
+ @testing.only_on("sqlite")
+ def test_modify_statement_string(self, connection):
+ @event.listens_for(connection, "before_execute", retval=True)
+ def _modify(
+ conn, clauseelement, multiparams, params, execution_options
+ ):
+ return clauseelement.replace("hi", "there"), multiparams, params
+
+ with _string_deprecation_expect():
+ eq_(connection.scalar("select 'hi'"), "there")
+
def test_retval_flag(self):
canary = []
from sqlalchemy.pool import QueuePool
from sqlalchemy.sql import column
from sqlalchemy.sql import literal
+from sqlalchemy.sql.elements import literal_column
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import config
with e1.connect() as conn:
conn.execute(select(literal("1")))
+ @testing.only_on("sqlite")
+ def test_dont_modify_statement_driversql(self, connection):
+ m1 = mock.Mock()
+
+ @event.listens_for(connection, "before_execute", retval=True)
+ def _modify(
+ conn, clauseelement, multiparams, params, execution_options
+ ):
+ m1.run_event()
+ return clauseelement.replace("hi", "there"), multiparams, params
+
+ # the event does not take effect for the "driver SQL" option
+ eq_(connection.exec_driver_sql("select 'hi'").scalar(), "hi")
+
+ # event is not called at all
+ eq_(m1.mock_calls, [])
+
+ @testing.combinations((True,), (False,), argnames="future")
+ @testing.only_on("sqlite")
+ def test_modify_statement_internal_driversql(self, connection, future):
+ m1 = mock.Mock()
+
+ @event.listens_for(connection, "before_execute", retval=True)
+ def _modify(
+ conn, clauseelement, multiparams, params, execution_options
+ ):
+ m1.run_event()
+ return clauseelement.replace("hi", "there"), multiparams, params
+
+ eq_(
+ connection._exec_driver_sql(
+ "select 'hi'", [], {}, {}, future=future
+ ).scalar(),
+ "hi" if future else "there",
+ )
+
+ if future:
+ eq_(m1.mock_calls, [])
+ else:
+ eq_(m1.mock_calls, [call.run_event()])
+
+ def test_modify_statement_clauseelement(self, connection):
+ @event.listens_for(connection, "before_execute", retval=True)
+ def _modify(
+ conn, clauseelement, multiparams, params, execution_options
+ ):
+ return select(literal_column("'there'")), multiparams, params
+
+ eq_(connection.scalar(select(literal_column("'hi'"))), "there")
+
def test_argument_format_execute(self, testing_engine):
def before_execute(
conn, clauseelement, multiparams, params, execution_options