mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #35479 -- Dropped support for PostgreSQL 13 and PostGIS 3.0.
This commit is contained in:
committed by
Sarah Boyce
parent
bcbc4b9b8a
commit
b049bec7cf
@@ -1,4 +1,4 @@
|
||||
from django.db import connection, transaction
|
||||
from django.db import transaction
|
||||
from django.db.models import (
|
||||
CharField,
|
||||
F,
|
||||
@@ -13,7 +13,6 @@ from django.db.models import (
|
||||
)
|
||||
from django.db.models.fields.json import KeyTextTransform, KeyTransform
|
||||
from django.db.models.functions import Cast, Concat, LPad, Substr
|
||||
from django.test import skipUnlessDBFeature
|
||||
from django.test.utils import Approximate
|
||||
from django.utils import timezone
|
||||
|
||||
@@ -95,9 +94,8 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
||||
BoolOr("boolean_field"),
|
||||
JSONBAgg("integer_field"),
|
||||
StringAgg("char_field", delimiter=";"),
|
||||
BitXor("integer_field"),
|
||||
]
|
||||
if connection.features.has_bit_xor:
|
||||
tests.append(BitXor("integer_field"))
|
||||
for aggregation in tests:
|
||||
with self.subTest(aggregation=aggregation):
|
||||
# Empty result with non-execution optimization.
|
||||
@@ -133,9 +131,8 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
||||
StringAgg("char_field", delimiter=";", default=Value("<empty>")),
|
||||
"<empty>",
|
||||
),
|
||||
(BitXor("integer_field", default=0), 0),
|
||||
]
|
||||
if connection.features.has_bit_xor:
|
||||
tests.append((BitXor("integer_field", default=0), 0))
|
||||
for aggregation, expected_result in tests:
|
||||
with self.subTest(aggregation=aggregation):
|
||||
# Empty result with non-execution optimization.
|
||||
@@ -348,7 +345,6 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
||||
)
|
||||
self.assertEqual(values, {"bitor": 0})
|
||||
|
||||
@skipUnlessDBFeature("has_bit_xor")
|
||||
def test_bit_xor_general(self):
|
||||
AggregateTestModel.objects.create(integer_field=3)
|
||||
values = AggregateTestModel.objects.filter(
|
||||
@@ -356,14 +352,12 @@ class TestGeneralAggregate(PostgreSQLTestCase):
|
||||
).aggregate(bitxor=BitXor("integer_field"))
|
||||
self.assertEqual(values, {"bitxor": 2})
|
||||
|
||||
@skipUnlessDBFeature("has_bit_xor")
|
||||
def test_bit_xor_on_only_true_values(self):
|
||||
values = AggregateTestModel.objects.filter(
|
||||
integer_field=1,
|
||||
).aggregate(bitxor=BitXor("integer_field"))
|
||||
self.assertEqual(values, {"bitxor": 1})
|
||||
|
||||
@skipUnlessDBFeature("has_bit_xor")
|
||||
def test_bit_xor_on_only_false_values(self):
|
||||
values = AggregateTestModel.objects.filter(
|
||||
integer_field=0,
|
||||
|
||||
@@ -4,7 +4,7 @@ from unittest import mock
|
||||
from django.contrib.postgres.indexes import OpClass
|
||||
from django.core.checks import Error
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import IntegrityError, NotSupportedError, connection, transaction
|
||||
from django.db import IntegrityError, connection, transaction
|
||||
from django.db.models import (
|
||||
CASCADE,
|
||||
CharField,
|
||||
@@ -997,7 +997,6 @@ class ExclusionConstraintTests(PostgreSQLTestCase):
|
||||
RangesModel.objects.create(ints=(10, 19))
|
||||
RangesModel.objects.create(ints=(51, 60))
|
||||
|
||||
@skipUnlessDBFeature("supports_covering_spgist_indexes")
|
||||
def test_range_adjacent_spgist_include(self):
|
||||
constraint_name = "ints_adjacent_spgist_include"
|
||||
self.assertNotIn(
|
||||
@@ -1034,7 +1033,6 @@ class ExclusionConstraintTests(PostgreSQLTestCase):
|
||||
editor.add_constraint(RangesModel, constraint)
|
||||
self.assertIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
|
||||
|
||||
@skipUnlessDBFeature("supports_covering_spgist_indexes")
|
||||
def test_range_adjacent_spgist_include_condition(self):
|
||||
constraint_name = "ints_adjacent_spgist_include_condition"
|
||||
self.assertNotIn(
|
||||
@@ -1067,7 +1065,6 @@ class ExclusionConstraintTests(PostgreSQLTestCase):
|
||||
editor.add_constraint(RangesModel, constraint)
|
||||
self.assertIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
|
||||
|
||||
@skipUnlessDBFeature("supports_covering_spgist_indexes")
|
||||
def test_range_adjacent_spgist_include_deferrable(self):
|
||||
constraint_name = "ints_adjacent_spgist_include_deferrable"
|
||||
self.assertNotIn(
|
||||
@@ -1084,27 +1081,6 @@ class ExclusionConstraintTests(PostgreSQLTestCase):
|
||||
editor.add_constraint(RangesModel, constraint)
|
||||
self.assertIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
|
||||
|
||||
def test_spgist_include_not_supported(self):
|
||||
constraint_name = "ints_adjacent_spgist_include_not_supported"
|
||||
constraint = ExclusionConstraint(
|
||||
name=constraint_name,
|
||||
expressions=[("ints", RangeOperators.ADJACENT_TO)],
|
||||
index_type="spgist",
|
||||
include=["id"],
|
||||
)
|
||||
msg = (
|
||||
"Covering exclusion constraints using an SP-GiST index require "
|
||||
"PostgreSQL 14+."
|
||||
)
|
||||
with connection.schema_editor() as editor:
|
||||
with mock.patch(
|
||||
"django.db.backends.postgresql.features.DatabaseFeatures."
|
||||
"supports_covering_spgist_indexes",
|
||||
False,
|
||||
):
|
||||
with self.assertRaisesMessage(NotSupportedError, msg):
|
||||
editor.add_constraint(RangesModel, constraint)
|
||||
|
||||
def test_range_adjacent_opclass(self):
|
||||
constraint_name = "ints_adjacent_opclass"
|
||||
self.assertNotIn(
|
||||
@@ -1187,7 +1163,6 @@ class ExclusionConstraintTests(PostgreSQLTestCase):
|
||||
editor.add_constraint(RangesModel, constraint)
|
||||
self.assertIn(constraint_name, self.get_constraints(RangesModel._meta.db_table))
|
||||
|
||||
@skipUnlessDBFeature("supports_covering_spgist_indexes")
|
||||
def test_range_adjacent_spgist_opclass_include(self):
|
||||
constraint_name = "ints_adjacent_spgist_opclass_include"
|
||||
self.assertNotIn(
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from unittest import mock
|
||||
|
||||
from django.contrib.postgres.indexes import (
|
||||
BloomIndex,
|
||||
BrinIndex,
|
||||
@@ -11,10 +9,9 @@ from django.contrib.postgres.indexes import (
|
||||
PostgresIndex,
|
||||
SpGistIndex,
|
||||
)
|
||||
from django.db import NotSupportedError, connection
|
||||
from django.db import connection
|
||||
from django.db.models import CharField, F, Index, Q
|
||||
from django.db.models.functions import Cast, Collate, Length, Lower
|
||||
from django.test import skipUnlessDBFeature
|
||||
from django.test.utils import register_lookup
|
||||
|
||||
from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
|
||||
@@ -640,7 +637,6 @@ class SchemaTests(PostgreSQLTestCase):
|
||||
index_name, self.get_constraints(TextFieldModel._meta.db_table)
|
||||
)
|
||||
|
||||
@skipUnlessDBFeature("supports_covering_spgist_indexes")
|
||||
def test_spgist_include(self):
|
||||
index_name = "scene_spgist_include_setting"
|
||||
index = SpGistIndex(name=index_name, fields=["scene"], include=["setting"])
|
||||
@@ -654,20 +650,6 @@ class SchemaTests(PostgreSQLTestCase):
|
||||
editor.remove_index(Scene, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(Scene._meta.db_table))
|
||||
|
||||
def test_spgist_include_not_supported(self):
|
||||
index_name = "spgist_include_exception"
|
||||
index = SpGistIndex(fields=["scene"], name=index_name, include=["setting"])
|
||||
msg = "Covering SP-GiST indexes require PostgreSQL 14+."
|
||||
with self.assertRaisesMessage(NotSupportedError, msg):
|
||||
with mock.patch(
|
||||
"django.db.backends.postgresql.features.DatabaseFeatures."
|
||||
"supports_covering_spgist_indexes",
|
||||
False,
|
||||
):
|
||||
with connection.schema_editor() as editor:
|
||||
editor.add_index(Scene, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(Scene._meta.db_table))
|
||||
|
||||
def test_custom_suffix(self):
|
||||
class CustomSuffixIndex(PostgresIndex):
|
||||
suffix = "sfx"
|
||||
|
||||
Reference in New Issue
Block a user