]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
look out for extras=None in freeze
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 9 Dec 2022 20:56:15 +0000 (15:56 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 9 Dec 2022 20:58:04 +0000 (15:58 -0500)
Fixed issue where :meth:`_engine.Result.freeze` method would not work for
textual SQL using either :func:`_sql.text` or
:meth:`_engine.Connection.exec_driver_sql`.

Fixes: #8963
Change-Id: Ia131c6ac41a4adf32eb1bf1abf23930ef395f16c
(cherry picked from commit 44170aee47a021883c6244f702de2e4385a5cd1d)

doc/build/changelog/unreleased_14/8963.rst [new file with mode: 0644]
lib/sqlalchemy/engine/result.py
test/sql/test_resultset.py

diff --git a/doc/build/changelog/unreleased_14/8963.rst b/doc/build/changelog/unreleased_14/8963.rst
new file mode 100644 (file)
index 0000000..54711af
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, engine
+    :tickets: 8963
+
+    Fixed issue where :meth:`_engine.Result.freeze` method would not work for
+    textual SQL using either :func:`_sql.text` or
+    :meth:`_engine.Connection.exec_driver_sql`.
+
index 898d3d88cd58879dfc092fe04355db0efe284739..5a69b0a4ef56a7aca297980815cb6e4cb665da4e 100644 (file)
@@ -167,7 +167,7 @@ class SimpleResultMetaData(ResultMetaData):
         if extra:
             recs_names = [
                 (
-                    (name,) + extras,
+                    (name,) + (extras if extras else ()),
                     (index, name, extras),
                 )
                 for index, (name, extras) in enumerate(zip(self._keys, extra))
index 11d58a57a24c41e84f2396084075e17b2fd90443..e1a414bd1b0aa8d5e844bdb36b0e3f4c678b58a8 100644 (file)
@@ -105,6 +105,52 @@ class CursorResultTest(fixtures.TablesTest):
             Column("y", String(50)),
         )
 
+    @testing.variation(
+        "type_", ["text", "driversql", "core", "textstar", "driverstar"]
+    )
+    def test_freeze(self, type_, connection):
+        """test #8963"""
+
+        users = self.tables.users
+        connection.execute(
+            users.insert(),
+            [
+                dict(user_id=1, user_name="john"),
+                dict(user_id=2, user_name="jack"),
+            ],
+        )
+
+        if type_.core:
+            stmt = select(users).order_by(users.c.user_id)
+        else:
+            if "star" in type_.name:
+                stmt = "select * from users order by user_id"
+            else:
+                stmt = "select user_id, user_name from users order by user_id"
+
+            if "text" in type_.name:
+                stmt = text(stmt)
+
+        if "driver" in type_.name:
+            result = connection.exec_driver_sql(stmt)
+        else:
+            result = connection.execute(stmt)
+
+        frozen = result.freeze()
+
+        unfrozen = frozen()
+        eq_(unfrozen.keys(), ["user_id", "user_name"])
+        eq_(unfrozen.all(), [(1, "john"), (2, "jack")])
+
+        unfrozen = frozen()
+        eq_(
+            unfrozen.mappings().all(),
+            [
+                {"user_id": 1, "user_name": "john"},
+                {"user_id": 2, "user_name": "jack"},
+            ],
+        )
+
     def test_row_iteration(self, connection):
         users = self.tables.users