]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Cache every key in reflection_cache
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 31 Oct 2019 13:30:12 +0000 (09:30 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 31 Oct 2019 13:33:58 +0000 (09:33 -0400)
Fixed bug in :class:`.Inspector` where the cache key generation did not
take into account arguments passed in the form of tuples, such as the tuple
of view name styles to return for the PostgreSQL dialect. This would lead
the inspector to cache too generally for a more specific set of criteria.
The logic has been adjusted to include every keyword element in the cache,
as every argument is expected to be appropriate for a cache else the
caching decorator should be bypassed by the dialect.

Fixes: #4955
Change-Id: Icd97744323407977a3f7db26e8a63a1a5c576010

doc/build/changelog/unreleased_13/4955.rst [new file with mode: 0644]
lib/sqlalchemy/engine/reflection.py
test/dialect/postgresql/test_reflection.py

diff --git a/doc/build/changelog/unreleased_13/4955.rst b/doc/build/changelog/unreleased_13/4955.rst
new file mode 100644 (file)
index 0000000..7e98c48
--- /dev/null
@@ -0,0 +1,12 @@
+.. change::
+    :tags: bug, engine, postgresql
+    :tickets: 4955
+
+    Fixed bug in :class:`.Inspector` where the cache key generation did not
+    take into account arguments passed in the form of tuples, such as the tuple
+    of view name styles to return for the PostgreSQL dialect. This would lead
+    the inspector to cache too generally for a more specific set of criteria.
+    The logic has been adjusted to include every keyword element in the cache,
+    as every argument is expected to be appropriate for a cache else the
+    caching decorator should be bypassed by the dialect.
+
index e36d99d5d19f848d2ec28f05c6390afeb95e3801..15300c6a17eeace79b8dfd783268eda7d1cf89f6 100644 (file)
@@ -45,11 +45,7 @@ def cache(fn, self, con, *args, **kw):
     key = (
         fn.__name__,
         tuple(a for a in args if isinstance(a, util.string_types)),
-        tuple(
-            (k, v)
-            for k, v in kw.items()
-            if isinstance(v, util.string_types + util.int_types + (float,))
-        ),
+        tuple((k, v) for k, v in kw.items() if k != "info_cache"),
     )
     ret = info_cache.get(key)
     if ret is None:
index 7054a9fddf56b048fd4fbb932846bf0cda4a5112..b6cedd55fc7ff48c46c4224007f1d137f863bd6c 100644 (file)
@@ -232,6 +232,17 @@ class MaterializedViewReflectionTest(
             set(["test_mview"]),
         )
 
+    def test_get_view_names_reflection_cache_ok(self):
+        insp = inspect(testing.db)
+        eq_(
+            set(insp.get_view_names(include=("plain",))), set(["test_regview"])
+        )
+        eq_(
+            set(insp.get_view_names(include=("materialized",))),
+            set(["test_mview"]),
+        )
+        eq_(set(insp.get_view_names()), set(["test_regview", "test_mview"]))
+
     def test_get_view_names_empty(self):
         insp = inspect(testing.db)
         assert_raises(ValueError, insp.get_view_names, include=())