diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-24 11:15:31 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-24 11:15:31 +0000 |
| commit | 7d03ca9e86e366c2c369101621d011eb6ee8b2c2 (patch) | |
| tree | 99fea1747897dc075e212e8acd5b8e7d04b4eb4c /django | |
| parent | 28605a9c2665505c85561b4f33483cfd81718898 (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__.py | 9 | ||||
| -rw-r--r-- | django/db/backends/oracle/base.py | 10 | ||||
| -rw-r--r-- | django/db/models/sql/expressions.py | 3 |
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: |
