diff options
| author | Simon Charette <charette.s@gmail.com> | 2024-04-02 16:33:31 -0400 |
|---|---|---|
| committer | Natalia <124304+nessita@users.noreply.github.com> | 2024-04-02 17:34:38 -0300 |
| commit | fead2dd52303505f30007df5e3c198b48b3ce9ae (patch) | |
| tree | 3b4374a6e2371f1e1c0f984e441b481955919d82 /tests | |
| parent | 14ab15d69ab2171ef26b295dcbd561b723b7eb7e (diff) | |
[5.0.x] Fixed #35336 -- Addressed crash when adding a GeneratedField with % literals.
A longer term solution is likely to have a better separation of parametrized
DDL altogether to handle checks, constraints, defaults, and generated fields
but such a change would require a significant refactor that isn't suitable
for a backport.
Thanks Adrian Garcia for the report.
Backport of 888b9042b3598bab6557c62de82505eec9ea62ed from main
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/schema/tests.py | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/tests/schema/tests.py b/tests/schema/tests.py index fff4982315..740cd5b0d0 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -54,7 +54,16 @@ from django.db.models import ( Value, ) from django.db.models.fields.json import KT, KeyTextTransform -from django.db.models.functions import Abs, Cast, Collate, Lower, Random, Round, Upper +from django.db.models.functions import ( + Abs, + Cast, + Collate, + Concat, + Lower, + Random, + Round, + Upper, +) from django.db.models.indexes import IndexExpression from django.db.transaction import TransactionManagementError, atomic from django.test import ( @@ -893,6 +902,39 @@ class SchemaTests(TransactionTestCase): editor.create_model(GeneratedFieldOutputFieldModel) @isolate_apps("schema") + @skipUnlessDBFeature("supports_stored_generated_columns") + def test_add_generated_field_contains(self): + class GeneratedFieldContainsModel(Model): + text = TextField(default="foo") + generated = GeneratedField( + expression=Concat("text", Value("%")), + db_persist=True, + output_field=TextField(), + ) + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(GeneratedFieldContainsModel) + + field = GeneratedField( + expression=Q(text__icontains="FOO"), + db_persist=True, + output_field=BooleanField(), + ) + field.contribute_to_class(GeneratedFieldContainsModel, "contains_foo") + + with connection.schema_editor() as editor: + editor.add_field(GeneratedFieldContainsModel, field) + + obj = GeneratedFieldContainsModel.objects.create() + obj.refresh_from_db() + self.assertEqual(obj.text, "foo") + self.assertEqual(obj.generated, "foo%") + self.assertIs(obj.contains_foo, True) + + @isolate_apps("schema") def test_add_auto_field(self): class AddAutoFieldModel(Model): name = CharField(max_length=255, primary_key=True) |
