summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-03-25 08:40:16 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-03-25 08:45:32 -0400
commite3b09f65df5dd51f87515f115827dedba50e9dca (patch)
tree23b5b19e2d7423289ff0b5ef2e91851084ec4802
parent5682b9a24d4174f429204638ec90622b52035cdc (diff)
downloadsqlalchemy-e3b09f65df5dd51f87515f115827dedba50e9dca.tar.gz
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
-rw-r--r--doc/build/changelog/unreleased_14/6131.rst8
-rw-r--r--lib/sqlalchemy/sql/annotation.py4
-rw-r--r--lib/sqlalchemy/sql/elements.py3
-rw-r--r--test/sql/test_lambdas.py11
4 files changed, 23 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_14/6131.rst b/doc/build/changelog/unreleased_14/6131.rst
new file mode 100644
index 000000000..ceba91453
--- /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 23b5052a9..8e5cdf148 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 20c3e8991..74e8dceff 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 fcf024182..24a83c9ee 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"))