Commit 69017bad authored by Ville Skyttä's avatar Ville Skyttä Committed by Tim Graham
Browse files

[1.8.x] Fixed #25393 -- Fixed MySQL crash when adding text/blob field with unhashable default.

Backport of 4d933ad4 from master
parent 07e01dce
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -43,7 +43,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
        super(DatabaseSchemaEditor, self).add_field(model, field)

        # Simulate the effect of a one-off default.
        if self.skip_default(field) and field.default not in {None, NOT_PROVIDED}:
        # field.default may be unhashable, so a set isn't used for "in" check.
        if self.skip_default(field) and field.default not in (None, NOT_PROVIDED):
            effective_default = self.effective_default(field)
            self.execute('UPDATE %(table)s SET %(column)s = %%s' % {
                'table': self.quote_name(model._meta.db_table),
+3 −0
Original line number Diff line number Diff line
@@ -29,3 +29,6 @@ Bugfixes

* Alphabetized ordering of imports in ``from django.db import migrations,
  models`` statement in newly created migrations (:ticket:`25384`).

* Fixed migrations crash on MySQL when adding a text or a blob field with an
  unhashable default (:ticket:`25393`).
+1 −0
Original line number Diff line number Diff line
@@ -695,6 +695,7 @@ unescaped
ungrouped
unhandled
unharmful
unhashable
unicode
uninstall
uninstalling
+12 −0
Original line number Diff line number Diff line
@@ -1535,3 +1535,15 @@ class SchemaTests(TransactionTestCase):
            cursor.execute("SELECT surname FROM schema_author;")
            item = cursor.fetchall()[0]
            self.assertEqual(item[0], None if connection.features.interprets_empty_strings_as_nulls else '')

    def test_add_textfield_unhashable_default(self):
        # Create the table
        with connection.schema_editor() as editor:
            editor.create_model(Author)
        # Create a row
        Author.objects.create(name='Anonymous1')
        # Create a field that has an unhashable default
        new_field = TextField(default={})
        new_field.set_attributes_from_name("info")
        with connection.schema_editor() as editor:
            editor.add_field(Author, new_field)