summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2024-04-02 16:33:31 -0400
committerNatalia <124304+nessita@users.noreply.github.com>2024-04-02 17:34:38 -0300
commitfead2dd52303505f30007df5e3c198b48b3ce9ae (patch)
tree3b4374a6e2371f1e1c0f984e441b481955919d82 /tests
parent14ab15d69ab2171ef26b295dcbd561b723b7eb7e (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.py44
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)