The "eq" and "ne" operators are no longer part of the list of
"associative" operators, while they remain considered to be
"commutative". This allows an expression like ``(x == y) == z``
to be maintained at the SQL level with parenthesis. Pull request
courtesy John Passaro.
Fixes: #3799
Change-Id: I3759d8987b35649d7418b6524316c9e70c857e68
Pull-request: https://github.com/zzzeek/sqlalchemy/pull/308
.. changelog::
:version: 1.1.0
+ .. change::
+ :tags: bug, sql
+ :tickets: 3799
+
+ The "eq" and "ne" operators are no longer part of the list of
+ "associative" operators, while they remain considered to be
+ "commutative". This allows an expression like ``(x == y) == z``
+ to be maintained at the SQL level with parenthesis. Pull request
+ courtesy John Passaro.
+
.. change::
:tags: bug, orm
:tickets: 3788
return _mirror.get(op, op)
-_associative = _commutative.union([concat_op, and_, or_])
+_associative = _commutative.union([concat_op, and_, or_]).difference([eq, ne])
_natural_self_precedent = _associative.union([
getitem, json_getitem_op, json_path_getitem_op])
f = column('f')
self.assert_compile(f / (f / (f - f)), "f / (f / (f - f))")
+ def test_associativity_22(self):
+ f = column('f')
+ self.assert_compile((f==f) == f, '(f = f) = f')
+
+ def test_associativity_23(self):
+ f = column('f')
+ self.assert_compile((f!=f) != f, '(f != f) != f')
+
class IsDistinctFromTest(fixtures.TestBase, testing.AssertsCompiledSQL):
__dialect__ = 'default'