]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged between precedence from trunk ([2785])
authorAnts Aasma <ants.aasma@gmail.com>
Mon, 25 Jun 2007 19:20:53 +0000 (19:20 +0000)
committerAnts Aasma <ants.aasma@gmail.com>
Mon, 25 Jun 2007 19:20:53 +0000 (19:20 +0000)
lib/sqlalchemy/sql.py
test/sql/select.py

index 59a8e31f4c85a90562808e1db30aed69aee15200..15d46889ad7d981a1349d788f6e0e5b49cea04e3 100644 (file)
@@ -32,7 +32,7 @@ __all__ = ['AbstractDialect', 'Alias', 'ClauseElement', 'ClauseParameters',
            'ClauseVisitor', 'ColumnCollection', 'ColumnElement',
            'CompoundSelect', 'Delete', 'FromClause', 'Insert', 'Join', 
            'Select', 'Selectable', 'TableClause', 'Update', 'alias', 'and_', 'asc',
-           'between_', 'bindparam', 'case', 'cast', 'column', 'delete',
+           'between_', 'between', 'bindparam', 'case', 'cast', 'column', 'delete',
            'desc', 'distinct', 'except_', 'except_all', 'exists', 'extract', 'func', 'modifier',
            'insert', 'intersect', 'intersect_all', 'join', 'literal',
            'literal_column', 'not_', 'null', 'or_', 'outerjoin', 'select',
@@ -61,13 +61,13 @@ PRECEDENCE = {
     '<':5,
     '>=':5,
     '<=':5,
+    'BETWEEN':5,
     'NOT':4,
     'AND':3,
     'OR':2,
     ',':-1,
     'AS':-1,
     'EXISTS':0,
-    'BETWEEN':0,
     '_smallest': -1000,
     '_largest': 1000
 }
@@ -403,7 +403,7 @@ def between(ctest, cleft, cright):
     provides similar functionality.
     """
 
-    return _BinaryExpression(ctest, and_(_literal_as_binds(cleft, type=ctest.type), _literal_as_binds(cright, type=ctest.type)), 'BETWEEN')
+    return _BinaryExpression(ctest, ClauseList(_literal_as_binds(cleft, type=ctest.type), _literal_as_binds(cright, type=ctest.type), operator='AND', group=False), 'BETWEEN')
 
 def between_(*args, **kwargs):
     """synonym for [sqlalchemy.sql#between()] (deprecated)."""
@@ -1220,7 +1220,7 @@ class _CompareMixin(object):
 
     def between(self, cleft, cright):
         """produce a BETWEEN clause, i.e. ``<column> BETWEEN <cleft> AND <cright>``"""
-        return _BinaryExpression(self, and_(self._check_literal(cleft), self._check_literal(cright)), 'BETWEEN')
+        return _BinaryExpression(self, ClauseList(self._check_literal(cleft), self._check_literal(cright), operator='AND', group=False), 'BETWEEN')
 
     def op(self, operator):
         """produce a generic operator function.
@@ -1825,12 +1825,6 @@ class ClauseList(ClauseElement):
     def __len__(self):
         return len(self.clauses)
         
-    def self_group(self, against=None):
-        if self.group:
-            return _Grouping(self)
-        else:
-            return self
-
     def append(self, clause):
         # TODO: not sure if i like the 'group_contents' flag.  need to define the difference between
         # a ClauseList of ClauseLists, and a "flattened" ClauseList of ClauseLists.  flatten() method ?
@@ -1852,7 +1846,7 @@ class ClauseList(ClauseElement):
         return f
 
     def self_group(self, against=None):
-        if self.operator != against and PRECEDENCE.get(self.operator, PRECEDENCE['_smallest']) <= PRECEDENCE.get(against, PRECEDENCE['_largest']):
+        if self.group and self.operator != against and PRECEDENCE.get(self.operator, PRECEDENCE['_smallest']) <= PRECEDENCE.get(against, PRECEDENCE['_largest']):
             return _Grouping(self)
         else:
             return self
index 48b352e3affbf8ba05704bace942c584fd7e1526..80b86fec5109faa054b6a089724756fcb648b6f7 100644 (file)
@@ -941,6 +941,10 @@ UNION SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE
             "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)),
+            "SELECT op.field FROM op WHERE (op.field = op.field) BETWEEN :literal AND :literal_1")
+        self.runtest(table.select(between((table.c.field == table.c.field), False, True)),
+            "SELECT op.field FROM op WHERE (op.field = op.field) BETWEEN :literal AND :literal_1")
 
 class CRUDTest(SQLTest):
     def testinsert(self):