From: Mike Bayer Date: Fri, 9 Dec 2022 20:56:15 +0000 (-0500) Subject: look out for extras=None in freeze X-Git-Tag: rel_1_4_45~2^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c60ff04d671558c02d8f8eb1ea6470f896538f78;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git look out for extras=None in freeze 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) --- diff --git a/doc/build/changelog/unreleased_14/8963.rst b/doc/build/changelog/unreleased_14/8963.rst new file mode 100644 index 0000000000..54711af596 --- /dev/null +++ b/doc/build/changelog/unreleased_14/8963.rst @@ -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`. + diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py index 898d3d88cd..5a69b0a4ef 100644 --- a/lib/sqlalchemy/engine/result.py +++ b/lib/sqlalchemy/engine/result.py @@ -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)) diff --git a/test/sql/test_resultset.py b/test/sql/test_resultset.py index 11d58a57a2..e1a414bd1b 100644 --- a/test/sql/test_resultset.py +++ b/test/sql/test_resultset.py @@ -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