[CalendarServer-changes] [7083] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Feb 25 12:57:08 PST 2011


Revision: 7083
          http://trac.macosforge.org/projects/calendarserver/changeset/7083
Author:   cdaboo at apple.com
Date:     2011-02-25 12:57:06 -0800 (Fri, 25 Feb 2011)
Log Message:
-----------
Fix logical operator precedence parenthesis.

Modified Paths:
--------------
    CalendarServer/trunk/twext/enterprise/dal/syntax.py
    CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py
    CalendarServer/trunk/txdav/common/datastore/sql.py

Modified: CalendarServer/trunk/twext/enterprise/dal/syntax.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/syntax.py	2011-02-25 18:05:25 UTC (rev 7082)
+++ CalendarServer/trunk/twext/enterprise/dal/syntax.py	2011-02-25 20:57:06 UTC (rev 7083)
@@ -429,9 +429,17 @@
 
     def subSQL(self, placeholder, quote, allTables):
         stmt = SQLFragment()
-        stmt.append(self._subexpression(self.a, placeholder, quote, allTables))
+        result = self._subexpression(self.a, placeholder, quote, allTables)
+        if isinstance(self.a, CompoundComparison) and self.a.op == 'or' and self.op == 'and':
+            result = _inParens(result)
+        stmt.append(result)
+
         stmt.text += ' %s ' % (self.op,)
-        stmt.append(self._subexpression(self.b, placeholder, quote, allTables))
+
+        result = self._subexpression(self.b, placeholder, quote, allTables)
+        if isinstance(self.b, CompoundComparison) and self.b.op == 'or' and self.op == 'and':
+            result = _inParens(result)
+        stmt.append(result)
         return stmt
 
 

Modified: CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-25 18:05:25 UTC (rev 7082)
+++ CalendarServer/trunk/twext/enterprise/dal/test/test_sqlsyntax.py	2011-02-25 20:57:06 UTC (rev 7083)
@@ -645,3 +645,35 @@
             Insert({self.schema.BOZ.QUX:
                     self.schema.A_SEQ}).toSQL(),
             SQLFragment("insert into BOZ (QUX) values (nextval('A_SEQ'))", []))
+
+    def test_nestedLogicalExpressions(self):
+        """
+        When a sequence is used as a value in an expression, it renders as the
+        call to 'nextval' that will produce its next value.
+        """
+        self.assertEquals(
+            Select(
+                From=self.schema.FOO,
+                Where=(self.schema.FOO.BAR != 7).
+                    And(self.schema.FOO.BAZ != 8).
+                    And((self.schema.FOO.BAR == 8).Or(self.schema.FOO.BAZ == 0))
+            ).toSQL(),
+            SQLFragment("select * from FOO where BAR != ? and BAZ != ? and (BAR = ? or BAZ = ?)", [7, 8, 8, 0]))
+
+        self.assertEquals(
+            Select(
+                From=self.schema.FOO,
+                Where=(self.schema.FOO.BAR != 7).
+                    Or(self.schema.FOO.BAZ != 8).
+                    Or((self.schema.FOO.BAR == 8).And(self.schema.FOO.BAZ == 0))
+            ).toSQL(),
+            SQLFragment("select * from FOO where BAR != ? or BAZ != ? or BAR = ? and BAZ = ?", [7, 8, 8, 0]))
+
+        self.assertEquals(
+            Select(
+                From=self.schema.FOO,
+                Where=(self.schema.FOO.BAR != 7).
+                    Or(self.schema.FOO.BAZ != 8).
+                    And((self.schema.FOO.BAR == 8).Or(self.schema.FOO.BAZ == 0))
+            ).toSQL(),
+            SQLFragment("select * from FOO where (BAR != ? or BAZ != ?) and (BAR = ? or BAZ = ?)", [7, 8, 8, 0]))

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2011-02-25 18:05:25 UTC (rev 7082)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2011-02-25 20:57:06 UTC (rev 7083)
@@ -1373,11 +1373,10 @@
                 ownedCond = bind.BIND_MODE != _BIND_MODE_OWN
             revisions = (yield Select(
                 [rev.RESOURCE_ID, Max(rev.REVISION)],
-                From=rev.join(bind, rev.RESOURCE_ID == bind.RESOURCE_ID,
-                              'left'),
-                Where=(bind.HOME_RESOURCE_ID == home._resourceID).And(
-                    ownedCond).And(
-                        (rev.RESOURCE_NAME != None).Or(rev.DELETED == False)),
+                From=rev.join(bind, rev.RESOURCE_ID == bind.RESOURCE_ID, 'left'),
+                Where=(bind.HOME_RESOURCE_ID == home._resourceID).
+                    And(ownedCond).
+                    And((rev.RESOURCE_NAME != None).Or(rev.DELETED == False)),
                 GroupBy=rev.RESOURCE_ID
             ).on(home._txn))
             revisions = dict(revisions)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110225/7c80624d/attachment-0001.html>


More information about the calendarserver-changes mailing list