Fixed #30157 -- Dropped support for Oracle 12.1.
Thanks Tim Graham for the review.
This commit is contained in:
parent
10b0fd1576
commit
21bb71ef0d
|
@ -1,60 +0,0 @@
|
||||||
from django.db import NotSupportedError
|
|
||||||
from django.db.models.sql import compiler
|
|
||||||
|
|
||||||
|
|
||||||
class SQLCompiler(compiler.SQLCompiler):
|
|
||||||
def as_sql(self, with_limits=True, with_col_aliases=False):
|
|
||||||
"""
|
|
||||||
Create the SQL for this query. Return the SQL string and list of
|
|
||||||
parameters. This is overridden from the original Query class to handle
|
|
||||||
the restriction in Oracle 12.1 and emulate LIMIT and OFFSET with
|
|
||||||
a subquery.
|
|
||||||
|
|
||||||
If 'with_limits' is False, any limit/offset information is not included
|
|
||||||
in the query.
|
|
||||||
"""
|
|
||||||
# Whether the query must be constructed using limit/offset.
|
|
||||||
do_offset = with_limits and (self.query.high_mark is not None or self.query.low_mark)
|
|
||||||
if not do_offset:
|
|
||||||
sql, params = super().as_sql(with_limits=False, with_col_aliases=with_col_aliases)
|
|
||||||
elif not self.connection.features.supports_select_for_update_with_limit and self.query.select_for_update:
|
|
||||||
raise NotSupportedError(
|
|
||||||
'LIMIT/OFFSET is not supported with select_for_update on this '
|
|
||||||
'database backend.'
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
sql, params = super().as_sql(with_limits=False, with_col_aliases=True)
|
|
||||||
# Wrap the base query in an outer SELECT * with boundaries on
|
|
||||||
# the "_RN" column. This is the canonical way to emulate LIMIT
|
|
||||||
# and OFFSET on Oracle.
|
|
||||||
high_where = ''
|
|
||||||
if self.query.high_mark is not None:
|
|
||||||
high_where = 'WHERE ROWNUM <= %d' % (self.query.high_mark,)
|
|
||||||
|
|
||||||
if self.query.low_mark:
|
|
||||||
sql = (
|
|
||||||
'SELECT * FROM (SELECT "_SUB".*, ROWNUM AS "_RN" FROM (%s) '
|
|
||||||
'"_SUB" %s) WHERE "_RN" > %d' % (sql, high_where, self.query.low_mark)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# Simplify the query to support subqueries if there's no offset.
|
|
||||||
sql = (
|
|
||||||
'SELECT * FROM (SELECT "_SUB".* FROM (%s) "_SUB" %s)' % (sql, high_where)
|
|
||||||
)
|
|
||||||
return sql, params
|
|
||||||
|
|
||||||
|
|
||||||
class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class SQLDeleteCompiler(compiler.SQLDeleteCompiler, SQLCompiler):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class SQLAggregateCompiler(compiler.SQLAggregateCompiler, SQLCompiler):
|
|
||||||
pass
|
|
|
@ -1,6 +1,5 @@
|
||||||
from django.db.backends.base.features import BaseDatabaseFeatures
|
from django.db.backends.base.features import BaseDatabaseFeatures
|
||||||
from django.db.utils import InterfaceError
|
from django.db.utils import InterfaceError
|
||||||
from django.utils.functional import cached_property
|
|
||||||
|
|
||||||
|
|
||||||
class DatabaseFeatures(BaseDatabaseFeatures):
|
class DatabaseFeatures(BaseDatabaseFeatures):
|
||||||
|
@ -56,15 +55,4 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
||||||
supports_ignore_conflicts = False
|
supports_ignore_conflicts = False
|
||||||
max_query_params = 2**16 - 1
|
max_query_params = 2**16 - 1
|
||||||
supports_partial_indexes = False
|
supports_partial_indexes = False
|
||||||
|
supports_slicing_ordering_in_compound = True
|
||||||
@cached_property
|
|
||||||
def has_fetch_offset_support(self):
|
|
||||||
return self.connection.oracle_version >= (12, 2)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def allow_sliced_subqueries_with_in(self):
|
|
||||||
return self.has_fetch_offset_support
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def supports_slicing_ordering_in_compound(self):
|
|
||||||
return self.has_fetch_offset_support
|
|
||||||
|
|
|
@ -580,9 +580,3 @@ END;
|
||||||
if fields:
|
if fields:
|
||||||
return self.connection.features.max_query_params // len(fields)
|
return self.connection.features.max_query_params // len(fields)
|
||||||
return len(objs)
|
return len(objs)
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def compiler_module(self):
|
|
||||||
if self.connection.features.has_fetch_offset_support:
|
|
||||||
return super().compiler_module
|
|
||||||
return 'django.db.backends.oracle.compiler'
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ Database Library Requirements Supported Versions Notes
|
||||||
================== ============================== ================== =========================================
|
================== ============================== ================== =========================================
|
||||||
PostgreSQL GEOS, GDAL, PROJ.4, PostGIS 9.5+ Requires PostGIS.
|
PostgreSQL GEOS, GDAL, PROJ.4, PostGIS 9.5+ Requires PostGIS.
|
||||||
MySQL GEOS, GDAL 5.6+ Not OGC-compliant; :ref:`limited functionality <mysql-spatial-limitations>`.
|
MySQL GEOS, GDAL 5.6+ Not OGC-compliant; :ref:`limited functionality <mysql-spatial-limitations>`.
|
||||||
Oracle GEOS, GDAL 12.1+ XE not supported.
|
Oracle GEOS, GDAL 12.2+ XE not supported.
|
||||||
SQLite GEOS, GDAL, PROJ.4, SpatiaLite 3.8.3+ Requires SpatiaLite 4.3+
|
SQLite GEOS, GDAL, PROJ.4, SpatiaLite 3.8.3+ Requires SpatiaLite 4.3+
|
||||||
================== ============================== ================== =========================================
|
================== ============================== ================== =========================================
|
||||||
|
|
||||||
|
|
|
@ -730,7 +730,7 @@ iterator. Your code must handle this.
|
||||||
Oracle notes
|
Oracle notes
|
||||||
============
|
============
|
||||||
|
|
||||||
Django supports `Oracle Database Server`_ versions 12.1 and higher. Version
|
Django supports `Oracle Database Server`_ versions 12.2 and higher. Version
|
||||||
6.0 or higher of the `cx_Oracle`_ Python driver is required.
|
6.0 or higher of the `cx_Oracle`_ Python driver is required.
|
||||||
|
|
||||||
.. _`Oracle Database Server`: https://www.oracle.com/
|
.. _`Oracle Database Server`: https://www.oracle.com/
|
||||||
|
|
|
@ -235,6 +235,12 @@ Dropped support for PostgreSQL 9.4
|
||||||
Upstream support for PostgreSQL 9.4 ends in December 2019. Django 3.0 supports
|
Upstream support for PostgreSQL 9.4 ends in December 2019. Django 3.0 supports
|
||||||
PostgreSQL 9.5 and higher.
|
PostgreSQL 9.5 and higher.
|
||||||
|
|
||||||
|
Dropped support for Oracle 12.1
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Upstream support for Oracle 12.1 ends in July 2021. Django 2.2 will be
|
||||||
|
supported until April 2022. Django 3.0 officially supports Oracle 12.2 and 18c.
|
||||||
|
|
||||||
Removed private Python 2 compatibility APIs
|
Removed private Python 2 compatibility APIs
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue