This is extracted from http://django-firebird.googlecode.com/files/firebird-qsrf-7398-2.patch to show how I fixed this bug with Firebird backend. Index: django/db/models/sql/subqueries.py =================================================================== --- django/db/models/sql/subqueries.py (revision 7398) +++ django/db/models/sql/subqueries.py (working copy) @@ -6,12 +6,19 @@ from django.core.exceptions import FieldError from django.db.models.sql.constants import * from django.db.models.sql.datastructures import RawValue, Date -from django.db.models.sql.query import Query +from django.db.models.sql.query import Query as _Query from django.db.models.sql.where import AND __all__ = ['DeleteQuery', 'UpdateQuery', 'InsertQuery', 'DateQuery', 'CountQuery'] +from django.db import connection +if connection.features.uses_custom_queryset: + Query = connection.ops.query_class(_Query) +else: + Query = _Query + class DeleteQuery(Query): """ Delete queries are done through this class, since they are more constrained @@ -24,7 +31,8 @@ """ assert len(self.tables) == 1, \ "Can only delete from one table at a time." - result = ['DELETE FROM %s' % self.tables[0]] + qn = self.quote_name_unless_alias + result = ['DELETE FROM %s' % qn(self.tables[0])] where, params = self.where.as_sql() result.append('WHERE %s' % where) return ' '.join(result), tuple(params) Index: django/db/backends/firebird/base.py =================================================================== + def query_class(this, DefaultQuery): + class FirebirdQuery(DefaultQuery): + def as_sql(self, with_limits=True): + do_offset = with_limits and (self.high_mark or self.low_mark) + if not do_offset: + return super(FirebirdQuery, self).as_sql(with_limits=False) + + self.pre_sql_setup() + limit_offset_before = [] + if self.high_mark: + limit_offset_before.append("FIRST %d" % (self.high_mark - self.low_mark)) + if self.low_mark: + limit_offset_before.append("SKIP %d" % self.low_mark) + + sql, params= super(FirebirdQuery, self).as_sql(with_limits=False) + result = sql.replace('SELECT', "SELECT %s" % ' '.join(limit_offset_before)) + return result, params + return FirebirdQuery + + def query_set_class(this, DefaultQuerySet): + # Getting the base default `Query` object. + DefaultQuery = DefaultQuerySet().query.__class__ + + FirebirdQuery = this.query_class(DefaultQuery) + + from django.db import connection + class FirebirdQuerySet(DefaultQuerySet): + "The FirebirdQuerySet is overriden to use FirebirdQuery." + def __init__(self, model=None, query=None): + super(FirebirdQuerySet, self).__init__(model=model, query=query) + self.query = query or FirebirdQuery(self.model, connection) + return FirebirdQuerySet