Ticket #6956: sample-fix.txt

File sample-fix.txt, 3.1 KB (added by Ivan Illarionov, 16 years ago)

The fix extracted from external backend implementation

Line 
1This is extracted from http://django-firebird.googlecode.com/files/firebird-qsrf-7398-2.patch
2to show how I fixed this bug with Firebird backend.
3
4Index: 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
39Index: 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
Back to Top