| 1 |
This is extracted from http://django-firebird.googlecode.com/files/firebird-qsrf-7398-2.patch |
|---|
| 2 |
to show how I fixed this bug with Firebird backend. |
|---|
| 3 |
|
|---|
| 4 |
Index: django/db/models/sql/subqueries.py |
|---|
| 5 |
=================================================================== |
|---|
| 6 |
--- django/db/models/sql/subqueries.py (revision 7398) |
|---|
| 7 |
+++ django/db/models/sql/subqueries.py (working copy) |
|---|
| 8 |
@@ -6,12 +6,19 @@ |
|---|
| 9 |
from django.core.exceptions import FieldError |
|---|
| 10 |
from django.db.models.sql.constants import * |
|---|
| 11 |
from django.db.models.sql.datastructures import RawValue, Date |
|---|
| 12 |
-from django.db.models.sql.query import Query |
|---|
| 13 |
+from django.db.models.sql.query import Query as _Query |
|---|
| 14 |
from django.db.models.sql.where import AND |
|---|
| 15 |
|
|---|
| 16 |
__all__ = ['DeleteQuery', 'UpdateQuery', 'InsertQuery', 'DateQuery', |
|---|
| 17 |
'CountQuery'] |
|---|
| 18 |
|
|---|
| 19 |
+from django.db import connection |
|---|
| 20 |
+if connection.features.uses_custom_queryset: |
|---|
| 21 |
+ Query = connection.ops.query_class(_Query) |
|---|
| 22 |
+else: |
|---|
| 23 |
+ Query = _Query |
|---|
| 24 |
+ |
|---|
| 25 |
class DeleteQuery(Query): |
|---|
| 26 |
""" |
|---|
| 27 |
Delete queries are done through this class, since they are more constrained |
|---|
| 28 |
@@ -24,7 +31,8 @@ |
|---|
| 29 |
""" |
|---|
| 30 |
assert len(self.tables) == 1, \ |
|---|
| 31 |
"Can only delete from one table at a time." |
|---|
| 32 |
- result = ['DELETE FROM %s' % self.tables[0]] |
|---|
| 33 |
+ qn = self.quote_name_unless_alias |
|---|
| 34 |
+ result = ['DELETE FROM %s' % qn(self.tables[0])] |
|---|
| 35 |
where, params = self.where.as_sql() |
|---|
| 36 |
result.append('WHERE %s' % where) |
|---|
| 37 |
return ' '.join(result), tuple(params) |
|---|
| 38 |
|
|---|
| 39 |
Index: django/db/backends/firebird/base.py |
|---|
| 40 |
=================================================================== |
|---|
| 41 |
+ def query_class(this, DefaultQuery): |
|---|
| 42 |
+ class FirebirdQuery(DefaultQuery): |
|---|
| 43 |
+ def as_sql(self, with_limits=True): |
|---|
| 44 |
+ do_offset = with_limits and (self.high_mark or self.low_mark) |
|---|
| 45 |
+ if not do_offset: |
|---|
| 46 |
+ return super(FirebirdQuery, self).as_sql(with_limits=False) |
|---|
| 47 |
+ |
|---|
| 48 |
+ self.pre_sql_setup() |
|---|
| 49 |
+ limit_offset_before = [] |
|---|
| 50 |
+ if self.high_mark: |
|---|
| 51 |
+ limit_offset_before.append("FIRST %d" % (self.high_mark - self.low_mark)) |
|---|
| 52 |
+ if self.low_mark: |
|---|
| 53 |
+ limit_offset_before.append("SKIP %d" % self.low_mark) |
|---|
| 54 |
+ |
|---|
| 55 |
+ sql, params= super(FirebirdQuery, self).as_sql(with_limits=False) |
|---|
| 56 |
+ result = sql.replace('SELECT', "SELECT %s" % ' '.join(limit_offset_before)) |
|---|
| 57 |
+ return result, params |
|---|
| 58 |
+ return FirebirdQuery |
|---|
| 59 |
+ |
|---|
| 60 |
+ def query_set_class(this, DefaultQuerySet): |
|---|
| 61 |
+ # Getting the base default `Query` object. |
|---|
| 62 |
+ DefaultQuery = DefaultQuerySet().query.__class__ |
|---|
| 63 |
+ |
|---|
| 64 |
+ FirebirdQuery = this.query_class(DefaultQuery) |
|---|
| 65 |
+ |
|---|
| 66 |
+ from django.db import connection |
|---|
| 67 |
+ class FirebirdQuerySet(DefaultQuerySet): |
|---|
| 68 |
+ "The FirebirdQuerySet is overriden to use FirebirdQuery." |
|---|
| 69 |
+ def __init__(self, model=None, query=None): |
|---|
| 70 |
+ super(FirebirdQuerySet, self).__init__(model=model, query=query) |
|---|
| 71 |
+ self.query = query or FirebirdQuery(self.model, connection) |
|---|
| 72 |
+ return FirebirdQuerySet |
|---|