From ec3e6735bf95d62d768f214dd5a49bbfc4fecaa5 Mon Sep 17 00:00:00 2001 From: cjc0013 Date: Mon, 25 May 2026 10:53:39 -0400 Subject: [PATCH] Fix lambda statements with non-lambda criteria --- lib/sqlalchemy/sql/lambdas.py | 2 +- test/sql/test_lambdas.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/sqlalchemy/sql/lambdas.py b/lib/sqlalchemy/sql/lambdas.py index 38fa97b0e3..6ec217e8f8 100644 --- a/lib/sqlalchemy/sql/lambdas.py +++ b/lib/sqlalchemy/sql/lambdas.py @@ -314,7 +314,7 @@ class LambdaElement(elements.ClauseElement): return rec def __getattr__(self, key): - return getattr(self._rec.expected_expr, key) + return getattr(self._resolved, key) @property def _is_sequence(self): diff --git a/test/sql/test_lambdas.py b/test/sql/test_lambdas.py index 007f3e189c..e327bf9790 100644 --- a/test/sql/test_lambdas.py +++ b/test/sql/test_lambdas.py @@ -346,6 +346,34 @@ class LambdaElementTest( eq_(s2key[0], s4key[0]) ne_(s1key[0], s2key[0]) + def test_stmt_lambda_w_additional_non_lambda_and_closure_var(self): + def go(q): + stmt = lambdas.lambda_stmt( + lambda: select(column("x")).where(column("x") == q) + ) + stmt = stmt.where(column("y") == column("z")) + + return stmt + + s1 = go(5) + s2 = go(10) + + self.assert_compile( + s1, + "SELECT x WHERE x = :q_1 AND y = z", + checkparams={"q_1": 5}, + ) + self.assert_compile( + s2, + "SELECT x WHERE x = :q_1 AND y = z", + checkparams={"q_1": 10}, + ) + + s1key = s1._generate_cache_key() + s2key = s2._generate_cache_key() + + eq_(s1key[0], s2key[0]) + def test_stmt_lambda_w_atonce_whereclause_values_notrack(self): def go(col_expr, whereclause): stmt = lambdas.lambda_stmt(lambda: select(col_expr)) -- 2.47.3