summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2008-01-04 20:40:22 +0000
committerJason Kirtland <jek@discorporate.us>2008-01-04 20:40:22 +0000
commit38bcc2b2f8eab265bf3fc93faf79ee72845f1313 (patch)
tree972e897815ec2f4461c20b7a4dbb5c870b8cbd0e
parenta230391a37e1f6b7aaef6adef4a57da24588432b (diff)
downloadsqlalchemy-38bcc2b2f8eab265bf3fc93faf79ee72845f1313.tar.gz
Refined bulk-assignment aspects of the r3999 in-place collection operator fix. Also? r4000!
-rw-r--r--lib/sqlalchemy/orm/attributes.py8
-rw-r--r--test/orm/collection.py21
2 files changed, 28 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 0937568e2..21b8a4e64 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -532,8 +532,14 @@ class CollectionAttributeImpl(AttributeImpl):
new_values = list(new_collection.adapt_like_to_iterable(value))
old = self.get(state)
+
+ # ignore re-assignment of the current collection, as happens
+ # implicitly with in-place operators (foo.collection |= other)
+ if old is value:
+ return
+
state.committed_state[self.key] = self.copy(old)
-
+
old_collection = self.get_collection(state, old)
idset = util.IdentitySet
diff --git a/test/orm/collection.py b/test/orm/collection.py
index 6e50a8512..fb4dbf199 100644
--- a/test/orm/collection.py
+++ b/test/orm/collection.py
@@ -443,6 +443,12 @@ class CollectionsTest(PersistTest):
control |= values
assert_eq()
+ # cover self-assignment short-circuit
+ values = set([e, creator(), creator()])
+ obj.attr |= values
+ control |= values
+ assert_eq()
+
try:
direct |= [e, creator()]
assert False
@@ -483,6 +489,11 @@ class CollectionsTest(PersistTest):
control -= values
assert_eq()
+ values = set([creator()])
+ obj.attr -= values
+ control -= values
+ assert_eq()
+
try:
direct -= [e, creator()]
assert False
@@ -519,6 +530,11 @@ class CollectionsTest(PersistTest):
control &= values
assert_eq()
+ values.update(set([creator()]))
+ obj.attr &= values
+ control &= values
+ assert_eq()
+
try:
direct &= [e, creator()]
assert False
@@ -569,6 +585,11 @@ class CollectionsTest(PersistTest):
control ^= values
assert_eq()
+ values = set([creator()])
+ obj.attr ^= values
+ control ^= values
+ assert_eq()
+
try:
direct ^= [e, creator()]
assert False