summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Skyttä <ville.skytta@iki.fi>2015-09-12 22:06:35 +0300
committerTim Graham <timograham@gmail.com>2015-09-14 12:25:08 -0400
commit4d933ad4181a511f3ced98edba4e17aff054e0e2 (patch)
tree25cda0af854de4c497182a1993123ec3745e6bf6
parentb8b776aabe9afcd771f5c49afd2b41b44cae65a4 (diff)
Fixed #25393 -- Fixed MySQL crash when adding text/blob field with unhashable default.
-rw-r--r--django/db/backends/mysql/schema.py3
-rw-r--r--docs/releases/1.8.5.txt3
-rw-r--r--docs/spelling_wordlist1
-rw-r--r--tests/schema/tests.py12
4 files changed, 18 insertions, 1 deletions
diff --git a/django/db/backends/mysql/schema.py b/django/db/backends/mysql/schema.py
index e803a4452c..ef4ccf51db 100644
--- a/django/db/backends/mysql/schema.py
+++ b/django/db/backends/mysql/schema.py
@@ -50,7 +50,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),
diff --git a/docs/releases/1.8.5.txt b/docs/releases/1.8.5.txt
index c2557bd1c2..917599447f 100644
--- a/docs/releases/1.8.5.txt
+++ b/docs/releases/1.8.5.txt
@@ -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`).
diff --git a/docs/spelling_wordlist b/docs/spelling_wordlist
index 1edaa68d49..0aba338d18 100644
--- a/docs/spelling_wordlist
+++ b/docs/spelling_wordlist
@@ -869,6 +869,7 @@ unglamorous
ungrouped
unhandled
unharmful
+unhashable
unicode
uninstall
uninstalling
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index a63e3fa79d..9e0731cf4f 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -1673,3 +1673,15 @@ class SchemaTests(TransactionTestCase):
)
if connection.features.can_introspect_default:
self.assertIsNone(field.default)
+
+ 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)