From b1c06998245d3190f4e7386285a20ae4c3f09f8c Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 8 Sep 2007 20:19:48 +0000 Subject: [PATCH] - adjusted operator precedence of NOT to match '==' and others, so that ~(x==y) produces NOT (x=y), which is compatible with MySQL (doesn't like "NOT x=y") [ticket:764] --- CHANGES | 5 ++++- lib/sqlalchemy/sql.py | 2 +- test/sql/select.py | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index ca3f246d02..bd3354ba6b 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,10 @@ `func.count(t.c.col.distinct())` - Fixed detection of internal '$' characters in :bind$params [ticket:719] - [ticket:768] dont assume join criterion consists only of column objects - + - adjusted operator precedence of NOT to match '==' and others, so that + ~(x==y) produces NOT (x=y), which is compatible with MySQL (doesn't like + "NOT x=y") [ticket:764] + - orm - added a check for joining from A->B using join(), along two different m2m tables. this raises an error in 0.3 but is diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 8d9c42abc7..3367756e2d 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -64,7 +64,7 @@ PRECEDENCE = { '<=':5, 'BETWEEN':5, 'DISTINCT':5, - 'NOT':4, + 'NOT':5, 'AND':3, 'OR':2, ',':-1, diff --git a/test/sql/select.py b/test/sql/select.py index 030bf44dce..1cf210975c 100644 --- a/test/sql/select.py +++ b/test/sql/select.py @@ -271,7 +271,7 @@ sq.myothertable_othername AS sq_myothertable_othername FROM (" + sqstring + ") A def testoperators(self): self.runtest( table1.select((table1.c.myid != 12) & ~(table1.c.name=='john')), - "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid != :mytable_myid AND NOT mytable.name = :mytable_name" + "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid != :mytable_myid AND NOT (mytable.name = :mytable_name)" ) self.runtest( @@ -828,6 +828,9 @@ myothertable.othername != :myothertable_othername OR EXISTS (select yay from foo self.runtest(select([table1], table1.c.myid.in_('a')), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid = :mytable_myid") + self.runtest(select([table1], ~table1.c.myid.in_('a')), + "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE NOT (mytable.myid = :mytable_myid)") + self.runtest(select([table1], table1.c.myid.in_('a', 'b')), "SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (:mytable_myid, :mytable_myid_1)") @@ -972,7 +975,7 @@ UNION SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE self.runtest(table.select((5 + table.c.field).in_(5,6)), "SELECT op.field FROM op WHERE :op_field + op.field IN (:literal, :literal_1)") self.runtest(table.select(not_(table.c.field == 5)), - "SELECT op.field FROM op WHERE NOT op.field = :op_field") + "SELECT op.field FROM op WHERE NOT (op.field = :op_field)") self.runtest(table.select(not_(table.c.field) == 5), "SELECT op.field FROM op WHERE (NOT op.field) = :literal") self.runtest(table.select((table.c.field == table.c.field).between(False, True)), -- 2.47.2