diff options
| author | Tom Carrick <tom@carrick.eu> | 2023-10-27 15:46:05 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-10-30 07:37:40 +0100 |
| commit | 34b411762b50883d768d7b67e0a158ec39da8b09 (patch) | |
| tree | a8bdec327436eb7be76b1219e61fdcdfc1735b1a /tests/schema | |
| parent | 46df3ab244e1688bd186f0bfbfea6a354097a910 (diff) | |
Fixed #34932 -- Restored varchar_pattern_ops/text_pattern_ops index creation when deterministic collaction is set.
Regression in f3f9d03edf17ccfa17263c7efa0b1350d1ac9278 (4.2) and
8ed25d65ea7546fafd808086fa07e7e5bb5428fc (5.0).
Diffstat (limited to 'tests/schema')
| -rw-r--r-- | tests/schema/tests.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 68b6442794..20a00e29f7 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -223,6 +223,18 @@ class SchemaTests(TransactionTestCase): constraints_for_column.append(name) return sorted(constraints_for_column) + def get_constraint_opclasses(self, constraint_name): + with connection.cursor() as cursor: + sql = """ + SELECT opcname + FROM pg_opclass AS oc + JOIN pg_index as i on oc.oid = ANY(i.indclass) + JOIN pg_class as c on c.oid = i.indexrelid + WHERE c.relname = %s + """ + cursor.execute(sql, [constraint_name]) + return [row[0] for row in cursor.fetchall()] + def check_added_field_default( self, schema_editor, @@ -1404,6 +1416,40 @@ class SchemaTests(TransactionTestCase): @isolate_apps("schema") @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific") + @skipUnlessDBFeature("supports_collation_on_charfield") + def test_unique_with_deterministic_collation_charfield(self): + deterministic_collation = connection.features.test_collations.get( + "deterministic" + ) + if not deterministic_collation: + self.skipTest("This backend does not support deterministic collations.") + + class CharModel(Model): + field = CharField(db_collation=deterministic_collation, unique=True) + + class Meta: + app_label = "schema" + + # Create the table. + with connection.schema_editor() as editor: + editor.create_model(CharModel) + self.isolated_local_models = [CharModel] + constraints = self.get_constraints_for_column( + CharModel, CharModel._meta.get_field("field").column + ) + self.assertIn("schema_charmodel_field_8b338dea_like", constraints) + self.assertIn( + "varchar_pattern_ops", + self.get_constraint_opclasses("schema_charmodel_field_8b338dea_like"), + ) + self.assertEqual( + self.get_column_collation(CharModel._meta.db_table, "field"), + deterministic_collation, + ) + self.assertIn("field", self.get_uniques(CharModel._meta.db_table)) + + @isolate_apps("schema") + @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific") @skipUnlessDBFeature( "supports_collation_on_charfield", "supports_non_deterministic_collations", @@ -1438,6 +1484,61 @@ class SchemaTests(TransactionTestCase): ) self.assertIn("field_id", self.get_uniques(RelationModel._meta.db_table)) + @isolate_apps("schema") + @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific") + @skipUnlessDBFeature("supports_collation_on_charfield") + def test_relation_to_deterministic_collation_charfield(self): + deterministic_collation = connection.features.test_collations.get( + "deterministic" + ) + if not deterministic_collation: + self.skipTest("This backend does not support deterministic collations.") + + class CharModel(Model): + field = CharField(db_collation=deterministic_collation, unique=True) + + class Meta: + app_label = "schema" + + class RelationModel(Model): + field = OneToOneField(CharModel, CASCADE, to_field="field") + + class Meta: + app_label = "schema" + + # Create the table. + with connection.schema_editor() as editor: + editor.create_model(CharModel) + editor.create_model(RelationModel) + self.isolated_local_models = [CharModel, RelationModel] + constraints = self.get_constraints_for_column( + CharModel, CharModel._meta.get_field("field").column + ) + self.assertIn("schema_charmodel_field_8b338dea_like", constraints) + self.assertIn( + "varchar_pattern_ops", + self.get_constraint_opclasses("schema_charmodel_field_8b338dea_like"), + ) + rel_constraints = self.get_constraints_for_column( + RelationModel, RelationModel._meta.get_field("field").column + ) + self.assertIn("schema_relationmodel_field_id_395fbb08_like", rel_constraints) + self.assertIn( + "varchar_pattern_ops", + self.get_constraint_opclasses( + "schema_relationmodel_field_id_395fbb08_like" + ), + ) + self.assertEqual( + self.get_column_collation(RelationModel._meta.db_table, "field_id"), + deterministic_collation, + ) + self.assertEqual( + self.get_column_collation(CharModel._meta.db_table, "field"), + deterministic_collation, + ) + self.assertIn("field_id", self.get_uniques(RelationModel._meta.db_table)) + def test_alter_textfield_to_null(self): """ #24307 - Should skip an alter statement on databases with |
