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