summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2023-11-01 20:43:16 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-11-02 15:48:31 +0100
commitb735b90f439a964bda20a3ded19a39c5f0ce9b9a (patch)
tree331454c52c0eb8d535651bcbbb557b6f691682ce
parentbf8aac36796165ad6688364089572e642f3a1bd4 (diff)
[5.0.x] Refs #31300 -- Allowed testing GeneratedField without collation.
CockroachDB and Snowflake don't support it. Backport of 208870b6122c4cbc39c3b2432e13db54c920db51 from main
-rw-r--r--django/db/backends/base/features.py1
-rw-r--r--django/db/backends/mysql/features.py1
-rw-r--r--django/db/backends/oracle/features.py16
-rw-r--r--django/db/backends/postgresql/features.py1
-rw-r--r--django/db/backends/sqlite3/features.py1
-rw-r--r--tests/model_fields/models.py12
-rw-r--r--tests/model_fields/test_generatedfield.py7
7 files changed, 18 insertions, 21 deletions
diff --git a/django/db/backends/base/features.py b/django/db/backends/base/features.py
index b1f0b9d491..4dfe9db11f 100644
--- a/django/db/backends/base/features.py
+++ b/django/db/backends/base/features.py
@@ -373,6 +373,7 @@ class BaseDatabaseFeatures:
"cs": None, # Case-sensitive.
"non_default": None, # Non-default.
"swedish_ci": None, # Swedish case-insensitive.
+ "virtual": None, # A collation that can be used for virtual columns.
}
# SQL template override for tests.aggregation.tests.NowUTC
test_now_utc_template = None
diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py
index 4d68b2bf3e..038a14a331 100644
--- a/django/db/backends/mysql/features.py
+++ b/django/db/backends/mysql/features.py
@@ -86,6 +86,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
"ci": f"{charset}_general_ci",
"non_default": f"{charset}_esperanto_ci",
"swedish_ci": f"{charset}_swedish_ci",
+ "virtual": f"{charset}_esperanto_ci",
}
test_now_utc_template = "UTC_TIMESTAMP(6)"
diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py
index 9b894d0df6..8a02e098d6 100644
--- a/django/db/backends/oracle/features.py
+++ b/django/db/backends/oracle/features.py
@@ -80,12 +80,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_comparing_boolean_expr = False
supports_json_field_contains = False
supports_collation_on_textfield = False
- test_collations = {
- "ci": "BINARY_CI",
- "cs": "BINARY",
- "non_default": "SWEDISH_CI",
- "swedish_ci": "SWEDISH_CI",
- }
test_now_utc_template = "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'"
django_test_skips = {
@@ -149,6 +143,16 @@ class DatabaseFeatures(BaseDatabaseFeatures):
}
@cached_property
+ def test_collations(self):
+ return {
+ "ci": "BINARY_CI",
+ "cs": "BINARY",
+ "non_default": "SWEDISH_CI",
+ "swedish_ci": "SWEDISH_CI",
+ "virtual": "SWEDISH_CI" if self.supports_collation_on_charfield else None,
+ }
+
+ @cached_property
def supports_collation_on_charfield(self):
with self.connection.cursor() as cursor:
try:
diff --git a/django/db/backends/postgresql/features.py b/django/db/backends/postgresql/features.py
index 1254586d03..941ebb92dd 100644
--- a/django/db/backends/postgresql/features.py
+++ b/django/db/backends/postgresql/features.py
@@ -77,6 +77,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
"deterministic": "C",
"non_default": "sv-x-icu",
"swedish_ci": "sv-x-icu",
+ "virtual": "sv-x-icu",
}
test_now_utc_template = "STATEMENT_TIMESTAMP() AT TIME ZONE 'UTC'"
insert_test_table_with_defaults = "INSERT INTO {} DEFAULT VALUES"
diff --git a/django/db/backends/sqlite3/features.py b/django/db/backends/sqlite3/features.py
index 44ace18681..32ea770d47 100644
--- a/django/db/backends/sqlite3/features.py
+++ b/django/db/backends/sqlite3/features.py
@@ -46,6 +46,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
"ci": "nocase",
"cs": "binary",
"non_default": "nocase",
+ "virtual": "nocase",
}
django_test_expected_failures = {
# The django_format_dtdelta() function doesn't properly handle mixed
diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
index b966da59e5..7804c19881 100644
--- a/tests/model_fields/models.py
+++ b/tests/model_fields/models.py
@@ -20,7 +20,7 @@ except ImportError:
test_collation = SimpleLazyObject(
- lambda: connection.features.test_collations.get("non_default")
+ lambda: connection.features.test_collations["virtual"]
)
@@ -529,10 +529,7 @@ class GeneratedModelOutputField(models.Model):
)
class Meta:
- required_db_features = {
- "supports_stored_generated_columns",
- "supports_collation_on_charfield",
- }
+ required_db_features = {"supports_stored_generated_columns"}
class GeneratedModelOutputFieldVirtual(models.Model):
@@ -544,10 +541,7 @@ class GeneratedModelOutputFieldVirtual(models.Model):
)
class Meta:
- required_db_features = {
- "supports_virtual_generated_columns",
- "supports_collation_on_charfield",
- }
+ required_db_features = {"supports_virtual_generated_columns"}
class GeneratedModelNull(models.Model):
diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py
index d965940465..a37e374981 100644
--- a/tests/model_fields/test_generatedfield.py
+++ b/tests/model_fields/test_generatedfield.py
@@ -165,12 +165,8 @@ class GeneratedFieldTestMixin:
with self.assertNumQueries(0), self.assertRaises(does_not_exist):
self.base_model.objects.get(field__gte=overflow_value)
- @skipUnlessDBFeature("supports_collation_on_charfield")
def test_output_field(self):
- collation = connection.features.test_collations.get("non_default")
- if not collation:
- self.skipTest("Language collations are not supported.")
-
+ collation = connection.features.test_collations["virtual"]
m = self.output_field_model.objects.create(name="NAME")
field = m._meta.get_field("lower_name")
db_parameters = field.db_parameters(connection)
@@ -181,7 +177,6 @@ class GeneratedFieldTestMixin:
field._resolved_expression.output_field.db_type(connection),
)
- @skipUnlessDBFeature("supports_collation_on_charfield")
def test_db_type_parameters(self):
db_type_parameters = self.output_field_model._meta.get_field(
"lower_name"