From: Mike Bayer Date: Thu, 25 Mar 2021 12:40:16 +0000 (-0400) Subject: Accept **kw in annotated._clone() method X-Git-Tag: rel_1_4_3~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3b09f65df5dd51f87515f115827dedba50e9dca;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Accept **kw in annotated._clone() method Fixed bug where combinations of the new "relationship with criteria" feature could fail in conjunction with features that make use of the new "lambda SQL" feature, including loader strategies such as selectinload and lazyload, for more complicated scenarios such as polymorphic loading. Fixes: #6131 Change-Id: I915dead6596866ae5fd1a7f593a90bce4b61d1af --- diff --git a/doc/build/changelog/unreleased_14/6131.rst b/doc/build/changelog/unreleased_14/6131.rst new file mode 100644 index 0000000000..ceba91453a --- /dev/null +++ b/doc/build/changelog/unreleased_14/6131.rst @@ -0,0 +1,8 @@ +.. change:: + :tags: bug, orm + :tickets: 6131 + + Fixed bug where combinations of the new "relationship with criteria" + feature could fail in conjunction with features that make use of the new + "lambda SQL" feature, including loader strategies such as selectinload and + lazyload, for more complicated scenarios such as polymorphic loading. diff --git a/lib/sqlalchemy/sql/annotation.py b/lib/sqlalchemy/sql/annotation.py index 23b5052a9d..8e5cdf148c 100644 --- a/lib/sqlalchemy/sql/annotation.py +++ b/lib/sqlalchemy/sql/annotation.py @@ -199,8 +199,8 @@ class Annotated(object): def _constructor(self): return self.__element._constructor - def _clone(self): - clone = self.__element._clone() + def _clone(self, **kw): + clone = self.__element._clone(**kw) if clone is self.__element: # detect immutable, don't change anything return self diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 20c3e89911..74e8dceffd 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -1493,7 +1493,8 @@ class BindParameter(roles.InElementRole, ColumnElement): self.__dict__.update(state) def __repr__(self): - return "BindParameter(%r, %r, type_=%r)" % ( + return "%s(%r, %r, type_=%r)" % ( + self.__class__.__name__, self.key, self.value, self.type, diff --git a/test/sql/test_lambdas.py b/test/sql/test_lambdas.py index fcf0241825..24a83c9ee3 100644 --- a/test/sql/test_lambdas.py +++ b/test/sql/test_lambdas.py @@ -1453,6 +1453,17 @@ class LambdaElementTest( is_(expr1._generate_cache_key().bindparams[0], expr1._resolved.right) is_(expr2._generate_cache_key().bindparams[0], expr2._resolved.right) + def test_cache_key_bindparam_matches_annotations(self): + t1 = table("t1", column("q"), column("p")) + + def go(): + expr = sql_util._deep_annotate((t1.c.q == 5), {"foo": "bar"}) + stmt = coercions.expect(roles.WhereHavingRole, lambda: expr) + return stmt + + self.assert_compile(go(), "t1.q = :q_1", checkparams={"q_1": 5}) + self.assert_compile(go(), "t1.q = :q_1", checkparams={"q_1": 5}) + def test_cache_key_instance_variable_issue_incorrect(self): t1 = table("t1", column("q"), column("p"))