diff --git a/django/db/backends/oracle/compiler.py b/django/db/backends/oracle/compiler.py deleted file mode 100644 index 819f241f80..0000000000 --- a/django/db/backends/oracle/compiler.py +++ /dev/null @@ -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 diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py index 12894e65b4..bba1e3cb0d 100644 --- a/django/db/backends/oracle/features.py +++ b/django/db/backends/oracle/features.py @@ -1,6 +1,5 @@ from django.db.backends.base.features import BaseDatabaseFeatures from django.db.utils import InterfaceError -from django.utils.functional import cached_property class DatabaseFeatures(BaseDatabaseFeatures): @@ -56,15 +55,4 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_ignore_conflicts = False max_query_params = 2**16 - 1 supports_partial_indexes = False - - @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 + supports_slicing_ordering_in_compound = True diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py index 4d40614958..7ef56b3dc4 100644 --- a/django/db/backends/oracle/operations.py +++ b/django/db/backends/oracle/operations.py @@ -580,9 +580,3 @@ END; if fields: return self.connection.features.max_query_params // len(fields) 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' diff --git a/docs/ref/contrib/gis/install/index.txt b/docs/ref/contrib/gis/install/index.txt index be4f036d40..7adf85c8ce 100644 --- a/docs/ref/contrib/gis/install/index.txt +++ b/docs/ref/contrib/gis/install/index.txt @@ -60,7 +60,7 @@ Database Library Requirements Supported Versions Notes ================== ============================== ================== ========================================= PostgreSQL GEOS, GDAL, PROJ.4, PostGIS 9.5+ Requires PostGIS. MySQL GEOS, GDAL 5.6+ Not OGC-compliant; :ref:`limited functionality `. -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+ ================== ============================== ================== ========================================= diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index d8f0257617..97e354fad9 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -730,7 +730,7 @@ iterator. Your code must handle this. 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. .. _`Oracle Database Server`: https://www.oracle.com/ diff --git a/docs/releases/3.0.txt b/docs/releases/3.0.txt index a657a4b0a0..eb02f19121 100644 --- a/docs/releases/3.0.txt +++ b/docs/releases/3.0.txt @@ -235,6 +235,12 @@ Dropped support for PostgreSQL 9.4 Upstream support for PostgreSQL 9.4 ends in December 2019. Django 3.0 supports 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 -------------------------------------------