]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
separated standalone between(), column.between(), put literal checking for both,...
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 8 Jun 2006 17:38:37 +0000 (17:38 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 8 Jun 2006 17:38:37 +0000 (17:38 +0000)
lib/sqlalchemy/sql.py
test/sql/select.py

index 48c9f87546ac4b7dc9b3a8cc25dc53fac4cc6be6..7ac28babe70b5e172671f317b0ef255695c2fc30 100644 (file)
@@ -125,10 +125,15 @@ def not_(clause):
     clause.parens=True
     return BooleanExpression(TextClause("NOT"), clause, None)
 
-def between_(ctest, cleft, cright):
-    """ returns BETWEEN predicate clause (clausetest BETWEEN clauseleft AND clauseright) """
-    return BooleanExpression(ctest, and_(cleft, cright), 'BETWEEN')
-between = between_
+def between(ctest, cleft, cright):
+    """ returns BETWEEN predicate clause (clausetest BETWEEN clauseleft AND clauseright).
+    
+    this is better called off a ColumnElement directly, i.e.
+    
+    column.between(value1, value2). 
+    """
+    return BooleanExpression(ctest, and_(_check_literal(cleft, ctest.type), _check_literal(cright, ctest.type)), 'BETWEEN')
+between_ = between
 
 def case(whens, value=None, else_=None):
     """ SQL CASE statement -- whens are a sequence of pairs to be translated into "when / then" clauses;
@@ -168,6 +173,12 @@ def union_all(*selects, **params):
 def alias(*args, **params):
     return Alias(*args, **params)
 
+def _check_literal(value, type):
+    if _is_literal(value):
+        return literal(value, type)
+    else:
+        return value
+
 def literal(value, type=None):
     """returns a literal clause, bound to a bind parameter.  
     
@@ -551,7 +562,7 @@ class CompareMixin(object):
     def distinct(self):
         return CompoundClause(None,"DISTINCT", self)
     def between(self, cleft, cright):
-        return between_(self, self._check_literal(cleft), self._check_literal(cright))
+        return BooleanExpression(self, and_(self._check_literal(cleft), self._check_literal(cright)), 'BETWEEN')
     def op(self, operator):
         return lambda other: self._compare(operator, other)
     # and here come the math operators:
index e246ece89dc8938917a86a5353cf70acca168aa3..2481e04aed8e98e71c89eead27ddc7a9cd2ab75f 100644 (file)
@@ -566,6 +566,8 @@ FROM mytable, myothertable WHERE mytable.myid = myothertable.otherid AND mytable
             Column('date', Date))
         self.runtest(table.select(table.c.date.between(datetime.date(2006,6,1), datetime.date(2006,6,5))), "SELECT dt.date FROM dt WHERE dt.date BETWEEN :dt_date AND :dt_da_1", checkparams={'dt_date':datetime.date(2006,6,1), 'dt_da_1':datetime.date(2006,6,5)})
 
+        self.runtest(table.select(sql.between(table.c.date, datetime.date(2006,6,1), datetime.date(2006,6,5))), "SELECT dt.date FROM dt WHERE dt.date BETWEEN :literal AND :liter_1", checkparams={'literal':datetime.date(2006,6,1), 'liter_1':datetime.date(2006,6,5)})
+
 class CRUDTest(SQLTest):
     def testinsert(self):
         # generic insert, will create bind params for all columns