From 09df554a85ff1f9e35e4275465ba4eca029a61b3 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 15 Aug 2021 18:12:42 -0400 Subject: honor NO_CACHE in lambdas Fixed issue in lambda caching system where an element of a query that produces no cache key, like a custom option or clause element, would still populate the expression in the "lambda cache" inappropriately. This was discovered as part of :ticket:`6887` but is a separate issue. References: #6887 Change-Id: I1665f4320254ddc63a0abf3088e9daeaffbd1840 --- test/sql/test_lambdas.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'test/sql') diff --git a/test/sql/test_lambdas.py b/test/sql/test_lambdas.py index 51530b079..2e794d7bc 100644 --- a/test/sql/test_lambdas.py +++ b/test/sql/test_lambdas.py @@ -17,6 +17,7 @@ from sqlalchemy.sql import roles from sqlalchemy.sql import select from sqlalchemy.sql import table from sqlalchemy.sql import util as sql_util +from sqlalchemy.sql.traversals import HasCacheKey from sqlalchemy.testing import assert_raises_message from sqlalchemy.testing import AssertsCompiledSQL from sqlalchemy.testing import eq_ @@ -953,6 +954,63 @@ class LambdaElementTest( eq_(s1key.key, s2key.key) ne_(s1key.key, s3key.key) + def test_stmt_lambda_opt_w_key(self): + """test issue related to #6887""" + + def go(opts): + stmt = lambdas.lambda_stmt(lambda: select(column("x"))) + stmt += lambda stmt: stmt.options(*opts) + + return stmt + + class SomeOpt(HasCacheKey): + def _gen_cache_key(self, anon_map, bindparams): + return ("fixed_key",) + + # generates no key, will not be cached + eq_(SomeOpt()._generate_cache_key().key, ("fixed_key",)) + + s1o, s2o = SomeOpt(), SomeOpt() + s1 = go([s1o]) + s2 = go([s2o]) + + s1key = s1._generate_cache_key() + s2key = s2._generate_cache_key() + + eq_(s1key.key[-1], (("fixed_key",),)) + eq_(s1key.key, s2key.key) + + eq_(s1._resolved._with_options, (s1o,)) + eq_(s2._resolved._with_options, (s1o,)) + ne_(s2._resolved._with_options, (s2o,)) + + def test_stmt_lambda_opt_w_no_key(self): + """test issue related to #6887""" + + def go(opts): + stmt = lambdas.lambda_stmt(lambda: select(column("x"))) + stmt += lambda stmt: stmt.options(*opts) + + return stmt + + class SomeOpt(HasCacheKey): + pass + + # generates no key, will not be cached + eq_(SomeOpt()._generate_cache_key(), None) + + s1o, s2o = SomeOpt(), SomeOpt() + s1 = go([s1o]) + s2 = go([s2o]) + + s1key = s1._generate_cache_key() + + eq_(s1key, None) + + eq_(s1._resolved._with_options, (s1o,)) + eq_(s2._resolved._with_options, (s2o,)) + ne_(s2._resolved._with_options, (s1o,)) + def test_stmt_lambda_hey_theres_multiple_paths(self): def go(x, y): stmt = lambdas.lambda_stmt(lambda: select(column("x"))) -- cgit v1.2.1