]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Ensure descendants of mixins don't become cacheable
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Feb 2020 18:11:20 +0000 (13:11 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Feb 2020 18:11:20 +0000 (13:11 -0500)
HasPrefix / HasSuffixes / SupportsCloneAnnotations exported
a _traverse_internals attribute that does not represent a
complete traversal, meaning non-traversible subclasses would
seem traversible.  rename these attributes so that this
does not occur.  DML is currently not traversible (will be soon).

Change-Id: I2605e61c8c3d49965335e66e09f4aeedc5e73bd3

lib/sqlalchemy/sql/annotation.py
lib/sqlalchemy/sql/selectable.py
test/sql/test_compare.py

index 0f668ebe7f3ee041e2443c5bc15a04db816aee1f..7984dc7ea385ecd9708307f93bf09f1b067f0d19 100644 (file)
@@ -37,7 +37,7 @@ class SupportsAnnotations(object):
 class SupportsCloneAnnotations(SupportsAnnotations):
     _annotations = util.immutabledict()
 
-    _traverse_internals = [
+    _clone_annotations_traverse_internals = [
         ("_annotations_cache_key", InternalTraversal.dp_plain_obj)
     ]
 
index 5f22457fa11cf2c042468563133caf5a26e6dc86..b11e315ea56d392949d0ed97683f5b14189586af 100644 (file)
@@ -208,7 +208,9 @@ class Selectable(ReturnsRows):
 class HasPrefixes(object):
     _prefixes = ()
 
-    _traverse_internals = [("_prefixes", InternalTraversal.dp_prefix_sequence)]
+    _has_prefixes_traverse_internals = [
+        ("_prefixes", InternalTraversal.dp_prefix_sequence)
+    ]
 
     @_generative
     @_document_text_coercion(
@@ -261,7 +263,9 @@ class HasPrefixes(object):
 class HasSuffixes(object):
     _suffixes = ()
 
-    _traverse_internals = [("_suffixes", InternalTraversal.dp_prefix_sequence)]
+    _has_suffixes_traverse_internals = [
+        ("_suffixes", InternalTraversal.dp_prefix_sequence)
+    ]
 
     @_generative
     @_document_text_coercion(
@@ -1480,8 +1484,8 @@ class CTE(Generative, HasPrefixes, HasSuffixes, AliasedReturnsRows):
             ("_restates", InternalTraversal.dp_clauseelement_unordered_set),
             ("recursive", InternalTraversal.dp_boolean),
         ]
-        + HasPrefixes._traverse_internals
-        + HasSuffixes._traverse_internals
+        + HasPrefixes._has_prefixes_traverse_internals
+        + HasSuffixes._has_suffixes_traverse_internals
     )
 
     @classmethod
@@ -2793,7 +2797,7 @@ class CompoundSelect(GenerativeSelect):
         ("_group_by_clause", InternalTraversal.dp_clauseelement),
         ("_for_update_arg", InternalTraversal.dp_clauseelement),
         ("keyword", InternalTraversal.dp_string),
-    ] + SupportsCloneAnnotations._traverse_internals
+    ] + SupportsCloneAnnotations._clone_annotations_traverse_internals
 
     UNION = util.symbol("UNION")
     UNION_ALL = util.symbol("UNION ALL")
@@ -3173,9 +3177,9 @@ class Select(
             ("_distinct", InternalTraversal.dp_boolean),
             ("_distinct_on", InternalTraversal.dp_clauseelement_list),
         ]
-        + HasPrefixes._traverse_internals
-        + HasSuffixes._traverse_internals
-        + SupportsCloneAnnotations._traverse_internals
+        + HasPrefixes._has_prefixes_traverse_internals
+        + HasSuffixes._has_suffixes_traverse_internals
+        + SupportsCloneAnnotations._clone_annotations_traverse_internals
     )
 
     @classmethod
@@ -4500,7 +4504,7 @@ class TextualSelect(SelectBase):
     _traverse_internals = [
         ("element", InternalTraversal.dp_clauseelement),
         ("column_args", InternalTraversal.dp_clauseelement_list),
-    ] + SupportsCloneAnnotations._traverse_internals
+    ] + SupportsCloneAnnotations._clone_annotations_traverse_internals
 
     _is_textual = True
 
index 2d0e393314a3d88ce7f1b6930169bb1623b09bbd..7333fb306446dbb6063c11a0d49ff108a7a3552d 100644 (file)
@@ -19,6 +19,7 @@ from sqlalchemy import select
 from sqlalchemy import String
 from sqlalchemy import Table
 from sqlalchemy import table
+from sqlalchemy import testing
 from sqlalchemy import text
 from sqlalchemy import tuple_
 from sqlalchemy import union
@@ -62,7 +63,6 @@ from sqlalchemy.testing import ne_
 from sqlalchemy.testing.util import random_choices
 from sqlalchemy.util import class_hierarchy
 
-
 meta = MetaData()
 meta2 = MetaData()
 
@@ -543,6 +543,10 @@ class CacheKeyFixture(object):
 
 
 class CacheKeyTest(CacheKeyFixture, CoreFixtures, fixtures.TestBase):
+    @testing.combinations(table_a.update(), table_a.insert(), table_a.delete())
+    def test_dml_not_cached_yet(self, dml_stmt):
+        eq_(dml_stmt._generate_cache_key(), None)
+
     def test_cache_key(self):
         for fixtures_, compare_values in [
             (self.fixtures, True),