From: Mike Bayer Date: Tue, 11 Jun 2024 02:59:49 +0000 (-0400) Subject: include HasCTE traversal elements in TextualSelect X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=faecebc9df2a57173ee720973ba44ada370b682f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git include HasCTE traversal elements in TextualSelect Fixed caching issue where using the :meth:`.TextualSelect.add_cte` method of the :class:`.TextualSelect` construct would not set a correct cache key which distinguished between different CTE expressions. Fixes: #11471 Change-Id: Ia9ce2c8cfd128f0f130aa9b26448dc23d994c324 --- diff --git a/doc/build/changelog/unreleased_14/11471.rst b/doc/build/changelog/unreleased_14/11471.rst new file mode 100644 index 0000000000..f669eabc78 --- /dev/null +++ b/doc/build/changelog/unreleased_14/11471.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, sql + :tickets: 11471 + + Fixed caching issue where using the :meth:`.TextualSelect.add_cte` method + of the :class:`.TextualSelect` construct would not set a correct cache key + which distinguished between different CTE expressions. diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 0e53f318fe..216ddd3626 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -6816,10 +6816,14 @@ class TextualSelect(SelectBase, ExecutableReturnsRows, Generative): _label_style = LABEL_STYLE_NONE - _traverse_internals: _TraverseInternalsType = [ - ("element", InternalTraversal.dp_clauseelement), - ("column_args", InternalTraversal.dp_clauseelement_list), - ] + SupportsCloneAnnotations._clone_annotations_traverse_internals + _traverse_internals: _TraverseInternalsType = ( + [ + ("element", InternalTraversal.dp_clauseelement), + ("column_args", InternalTraversal.dp_clauseelement_list), + ] + + SupportsCloneAnnotations._clone_annotations_traverse_internals + + HasCTE._has_ctes_traverse_internals + ) _is_textual = True diff --git a/test/sql/test_compare.py b/test/sql/test_compare.py index 746058c679..c1f6e7f113 100644 --- a/test/sql/test_compare.py +++ b/test/sql/test_compare.py @@ -205,6 +205,15 @@ class CoreFixtures: bindparam("bar", type_=String) ), ), + lambda: ( + # test #11471 + text("select * from table") + .columns(a=Integer()) + .add_cte(table_b.select().cte()), + text("select * from table") + .columns(a=Integer()) + .add_cte(table_b.select().where(table_b.c.a > 5).cte()), + ), lambda: ( literal(1).op("+")(literal(1)), literal(1).op("-")(literal(1)),