diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-08-15 18:12:42 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-08-17 14:30:24 -0400 |
| commit | 09df554a85ff1f9e35e4275465ba4eca029a61b3 (patch) | |
| tree | 8286ebf4bb54e103e10a0be1ebd3cab2152e16b4 /test/sql | |
| parent | 76b506ed51e31b922014a30de2a5952d1a6ad891 (diff) | |
| download | sqlalchemy-09df554a85ff1f9e35e4275465ba4eca029a61b3.tar.gz | |
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
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_lambdas.py | 58 |
1 files changed, 58 insertions, 0 deletions
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"))) |
