]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- adjusted operator precedence of NOT to match '==' and others, so that
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Sep 2007 20:19:48 +0000 (20:19 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Sep 2007 20:19:48 +0000 (20:19 +0000)
~(x==y) produces NOT (x=y), which is compatible with MySQL (doesn't like
"NOT x=y") [ticket:764]

CHANGES
lib/sqlalchemy/sql.py
test/sql/select.py

diff --git a/CHANGES b/CHANGES
index ca3f246d025e8ac9877023c560b4eaa042800b4b..bd3354ba6b83fbddad7fd390a0e9840dbea42e17 100644 (file)
--- 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 
index 8d9c42abc72c3a1fe74b1a692bb3cf5b02230cfd..3367756e2d68a0eb87def110fbb420881a1b5bef 100644 (file)
@@ -64,7 +64,7 @@ PRECEDENCE = {
     '<=':5,
     'BETWEEN':5,
     'DISTINCT':5,
-    'NOT':4,
+    'NOT':5,
     'AND':3,
     'OR':2,
     ',':-1,
index 030bf44dce0162d74591c27a525f54c74f122abe..1cf210975c75acec268cbc1c2d9cd4ee41f4deb6 100644 (file)
@@ -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)),