From f8441937633c8e076d1e612ce89fcc6ca1298483 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 10 Jun 2024 22:59:49 -0400 Subject: [PATCH] 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 (cherry picked from commit faecebc9df2a57173ee720973ba44ada370b682f) (cherry picked from commit 228d98e43a0bba1f33cd46f92f14851ecccbb728) --- doc/build/changelog/unreleased_14/11471.rst | 7 +++++++ lib/sqlalchemy/sql/selectable.py | 12 ++++++++---- test/sql/test_compare.py | 9 +++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 doc/build/changelog/unreleased_14/11471.rst 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 b6e96c7b0c..81fd45da92 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -6867,10 +6867,14 @@ class TextualSelect(SelectBase): _label_style = LABEL_STYLE_NONE - _traverse_internals = [ - ("element", InternalTraversal.dp_clauseelement), - ("column_args", InternalTraversal.dp_clauseelement_list), - ] + SupportsCloneAnnotations._clone_annotations_traverse_internals + _traverse_internals = ( + [ + ("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 d64deb8677..0a7f0d4114 100644 --- a/test/sql/test_compare.py +++ b/test/sql/test_compare.py @@ -205,6 +205,15 @@ class CoreFixtures(object): 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)), -- 2.47.2