From: Mike Bayer Date: Fri, 16 Jul 2021 14:14:56 +0000 (-0400) Subject: reset key/name when TableValuedColumn is adapted X-Git-Tag: rel_1_4_22~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b932b04b65f0851cbd63e89ee6067fd0a8d30a1b;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git reset key/name when TableValuedColumn is adapted Fixed issue in new :meth:`_schema.Table.table_valued` method where the resulting :class:`_sql.TableValuedColumn` construct would not respond correctly to alias adaptation as is used throughout the ORM, such as for eager loading, polymorphic loading, etc. Fixes: #6775 Change-Id: I77cec4b6e1b1003f2b6be242b54ada8e4a435250 --- diff --git a/doc/build/changelog/unreleased_14/6775.rst b/doc/build/changelog/unreleased_14/6775.rst new file mode 100644 index 0000000000..e7c9a5351c --- /dev/null +++ b/doc/build/changelog/unreleased_14/6775.rst @@ -0,0 +1,9 @@ +.. change:: + :tags: bug, orm + :tickets: 6775 + + Fixed issue in new :meth:`_schema.Table.table_valued` method where the + resulting :class:`_sql.TableValuedColumn` construct would not respond + correctly to alias adaptation as is used throughout the ORM, such as for + eager loading, polymorphic loading, etc. + diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index f95fa143e9..e253ddb936 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -4931,6 +4931,10 @@ class TableValuedColumn(NamedColumn): self.key = self.name = scalar_alias.name self.type = type_ + def _copy_internals(self, clone=_clone, **kw): + self.scalar_alias = clone(self.scalar_alias, **kw) + self.key = self.name = self.scalar_alias.name + @property def _from_objects(self): return [self.scalar_alias] diff --git a/test/sql/test_external_traversal.py b/test/sql/test_external_traversal.py index b0241da590..764bcd6d4a 100644 --- a/test/sql/test_external_traversal.py +++ b/test/sql/test_external_traversal.py @@ -2231,6 +2231,21 @@ class ClauseAdapterTest(fixtures.TestBase, AssertsCompiledSQL): "FROM table1 AS table1_1", ) + def test_table_valued_column(self): + """test #6775""" + stmt = select(func.some_json_func(t1.table_valued())) + + self.assert_compile( + stmt, + "SELECT some_json_func(table1) AS some_json_func_1 FROM table1", + ) + + self.assert_compile( + sql_util.ClauseAdapter(t1.alias()).traverse(stmt), + "SELECT some_json_func(table1_1) AS some_json_func_1 " + "FROM table1 AS table1_1", + ) + def test_recursive(self): metadata = MetaData() a = Table("a", metadata, Column("id", Integer, primary_key=True))