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
|
---|