summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2009-02-24 11:15:31 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2009-02-24 11:15:31 +0000
commit7d03ca9e86e366c2c369101621d011eb6ee8b2c2 (patch)
tree99fea1747897dc075e212e8acd5b8e7d04b4eb4c /django
parent28605a9c2665505c85561b4f33483cfd81718898 (diff)
Fixed #10161 -- Modified evaluation of query expressions to allow for operators that take the form of functions. This is mostly for the benefit of Oracle, but it should prove useful later on. Thanks to Ian for the report and feedback on the fix.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9898 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/__init__.py9
-rw-r--r--django/db/backends/oracle/base.py10
-rw-r--r--django/db/models/sql/expressions.py3
3 files changed, 20 insertions, 2 deletions
diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index 99f8f27ad9..6b027de193 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -408,6 +408,15 @@ class BaseDatabaseOperations(object):
"""
pass
+ def combine_expression(self, connector, sub_expressions):
+ """Combine a list of subexpressions into a single expression, using
+ the provided connecting operator. This is required because operators
+ can vary between backends (e.g., Oracle with %% and &) and between
+ subexpression types (e.g., date expressions)
+ """
+ conn = ' %s ' % connector
+ return conn.join(sub_expressions)
+
class BaseDatabaseIntrospection(object):
"""
This class encapsulates all backend-specific introspection utilities
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index d6bd3eab66..732f3ebba4 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -221,6 +221,16 @@ WHEN (new.%(col_name)s IS NULL)
second = '%s-12-31'
return [first % value, second % value]
+ def combine_expression(self, connector, sub_expressions):
+ "Oracle requires special cases for %% and & operators in query expressions"
+ if connector == '%%':
+ return 'MOD(%s)' % ','.join(sub_expressions)
+ elif connector == '&':
+ return 'BITAND(%s)' % ','.join(sub_expressions)
+ elif connector == '|':
+ raise NotImplementedError("Bit-wise or is not supported in Oracle.")
+ return super(DatabaseOperations, self).combine_expression(connector, sub_expressions)
+
class DatabaseWrapper(BaseDatabaseWrapper):
diff --git a/django/db/models/sql/expressions.py b/django/db/models/sql/expressions.py
index ef9fcb00c3..f011db2165 100644
--- a/django/db/models/sql/expressions.py
+++ b/django/db/models/sql/expressions.py
@@ -74,9 +74,8 @@ class SQLEvaluator(object):
if sql:
expressions.append(format % sql)
expression_params.extend(params)
- conn = ' %s ' % node.connector
- return conn.join(expressions), expression_params
+ return connection.ops.combine_expression(node.connector, expressions), expression_params
def evaluate_leaf(self, node, qn):
if not qn: