diff roundup/backends/rdbms_common.py @ 2530:a182c536b72d

fix filtering by Link property: if value list contained both NULL (-1) and non-NULL items, 'is NULL' and 'in (list)' clauses were joined by 'and' instead of 'or'. in .find() and .filter(), put brackets around all 'where' segments that may contain ORed parts: 'or' has lower precedence than 'and'
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Sat, 03 Jul 2004 16:51:52 +0000
parents 125311efe783
children 70ede89e8056
line wrap: on
line diff
--- a/roundup/backends/rdbms_common.py	Sat Jul 03 15:51:11 2004 +0000
+++ b/roundup/backends/rdbms_common.py	Sat Jul 03 16:51:52 2004 +0000
@@ -1,4 +1,4 @@
-# $Id: rdbms_common.py,v 1.117 2004-07-02 08:15:01 a1s Exp $
+# $Id: rdbms_common.py,v 1.118 2004-07-03 16:51:52 a1s Exp $
 ''' Relational database (SQL) backend common code.
 
 Basics:
@@ -1878,7 +1878,7 @@
                     s = '_%s is NULL or '%prop
                 allvalues += tuple(values)
                 s += '_%s in (%s)'%(prop, ','.join([a]*len(values)))
-                where.append(s)
+                where.append('(' + s +')')
         tables = ['_%s'%self.classname]
         if where:
             o.append('(' + ' and '.join(where) + ')')
@@ -2041,8 +2041,9 @@
                 v = ['%%'+self.db.sql_stringquote(s)+'%%' for s in v]
 
                 # now add to the where clause
-                where.append(' or '.join(["_%s._%s LIKE '%s'"%(cn, k, s)
-                    for s in v]))
+                where.append('('
+                    +' or '.join(["_%s._%s LIKE '%s'"%(cn, k, s) for s in v])
+                    +')')
                 # note: args are embedded in the query string now
             elif isinstance(propclass, Link):
                 if isinstance(v, type([])):
@@ -2058,10 +2059,10 @@
                     if d:
                         v = d.keys()
                         s = ','.join([a for x in v])
-                        where.append('(_%s._%s in (%s))'%(cn, k, s))
+                        l.append('(_%s._%s in (%s))'%(cn, k, s))
                         args = args + v
                     if l:
-                        where.append(' or '.join(l))
+                        where.append('(' + ' or '.join(l) +')')
                 else:
                     if v in ('-1', None):
                         v = None

Roundup Issue Tracker: http://roundup-tracker.org/