]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixes: #9647 - Raise exception for execute when parameter is an empty list 10406/head
authorCarlos Sousa <edu-eduardo99@hotmail.com>
Tue, 3 Oct 2023 03:06:10 +0000 (00:06 -0300)
committerCarlos Sousa <edu-eduardo99@hotmail.com>
Tue, 3 Oct 2023 03:19:49 +0000 (00:19 -0300)
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/orm/session.py
test/engine/test_execute.py
test/orm/test_session.py

index 72012ff9d91fdd8b8bb59fca5605def44127d7fb..bfbe472cb0e480c825ce5956963f86e0ef3d396e 100644 (file)
@@ -1403,6 +1403,10 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]):
         :return: a :class:`_engine.Result` object.
 
         """
+        if isinstance(parameters, list) and not parameters:
+            raise exc.ArgumentError(
+                "Empty list of parameters passed; no statement to execute"
+            )
         distilled_parameters = _distill_params_20(parameters)
         try:
             meth = statement._execute_on_connection
index e5eb5036dd738b502fa89c7cd3548724c5620196..032b2ba97cfa1d69b22552514f3c50aa522c2269 100644 (file)
@@ -2151,7 +2151,7 @@ class Session(_SessionClassMethods, EventTarget):
             )
         else:
             result = conn.execute(
-                statement, params or {}, execution_options=execution_options
+                statement, params, execution_options=execution_options
             )
 
         if _scalar_result:
index 6080f3dc6d045aede97cc6ff738f4909ce621454..5d9d47d90c3f2c8375b678782691b844fa963232 100644 (file)
@@ -272,6 +272,17 @@ class ExecuteTest(fixtures.TablesTest):
             (4, "sally"),
         ]
 
+    @testing.requires.named_paramstyle
+    def test_raw_insert_with_empty_list(self, connection):
+        conn = connection
+        assert_raises_message(
+            tsa.exc.ProgrammingError,
+            "Incorrect number of bindings supplied. The current statement uses 2, and there are 0 supplied",
+            conn.exec_driver_sql,
+            "insert into users (user_id, user_name) values (:id, :name)",
+            [],
+        )
+
     def test_raw_tuple_params(self, connection):
         """test #7820
 
@@ -639,11 +650,18 @@ class ExecuteTest(fixtures.TablesTest):
         """test that execute() interprets [] as a list with no params"""
         users_autoinc = self.tables.users_autoinc
 
-        connection.execute(
-            users_autoinc.insert().values(user_name=bindparam("name", None)),
-            [],
-        )
-        eq_(connection.execute(users_autoinc.select()).fetchall(), [(1, None)])
+        with expect_raises_message(
+            tsa.exc.ArgumentError,
+            "Empty list of parameters passed; no statement to execute",
+        ):
+            connection.execute(
+                users_autoinc.insert().values(
+                    user_name=bindparam("name", None)
+                ),
+                [],
+            )
+
+        eq_(connection.execute(users_autoinc.select()).fetchall(), [])
 
     @testing.only_on("sqlite")
     def test_execute_compiled_favors_compiled_paramstyle(self):
index b304ac574540085e2f5837fbfc35657fe617b5c9..dff7f3f7df63b4173bb8a6b0159c19700579aec0 100644 (file)
@@ -128,6 +128,24 @@ class ExecutionTest(_fixtures.FixtureTest):
             ):
                 sess.scalar("select id from users where id=:id", {"id": 7})
 
+    def test_empty_list_execute(self, connection):
+        users = self.tables.users
+        sess = Session(bind=testing.db)
+        sess.execute(users.insert(), {"id": 10, "name": "u10"})
+
+        with expect_raises_message(
+            sa.exc.ArgumentError,
+            "Empty list of parameters passed; no statement to execute",
+        ):
+            sess.execute(users.insert(), [])
+
+        eq_(
+            sess.execute(
+                sa.select(users.c.id).order_by(users.c.id)
+            ).fetchall(),
+            [(10,)],
+        )
+
 
 class TransScopingTest(_fixtures.FixtureTest):
     run_inserts = None