From d57124433f0d0f2bf61ea4e14962f3b663ab20c7 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Thu, 4 Dec 2014 09:11:30 -0500 Subject: [PATCH] [1.7.x] Fixed #23920 -- Fixed MySQL crash when adding blank=True to TextField. Thanks wkornewald for the report and Markus Holtermann for review. Backport of 765fa36d57d08d0568438f6fd74521e7a56abb61 from master --- django/db/backends/schema.py | 2 +- docs/releases/1.7.2.txt | 5 ++++- tests/schema/models.py | 4 ++++ tests/schema/tests.py | 15 ++++++++++++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/django/db/backends/schema.py b/django/db/backends/schema.py index 4fc6601dfd..06d7ad27bf 100644 --- a/django/db/backends/schema.py +++ b/django/db/backends/schema.py @@ -560,7 +560,7 @@ class BaseDatabaseSchemaEditor(object): # Default change? old_default = self.effective_default(old_field) new_default = self.effective_default(new_field) - if old_default != new_default: + if old_default != new_default and not self.skip_default(new_field): if new_default is None: actions.append(( self.sql_alter_column_no_default % { diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 771e353818..e3db0d404e 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -107,4 +107,7 @@ Bugfixes * Prevented the :class:`~django.contrib.auth.middleware.SessionAuthenticationMiddleware` from - setting a ``"Vary: Cookie"`` header on all responses. + setting a ``"Vary: Cookie"`` header on all responses (:ticket:`23939`). + +* Fixed a crash when adding ``blank=True`` to ``TextField()`` on MySQL + (:ticket:`23920`). diff --git a/tests/schema/models.py b/tests/schema/models.py index 3139838b97..df8a1c5ce4 100644 --- a/tests/schema/models.py +++ b/tests/schema/models.py @@ -171,3 +171,7 @@ class Thing(models.Model): def __str__(self): return self.when + + +class Note(models.Model): + info = models.TextField() diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 4a7d537665..4c773599f9 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -10,7 +10,7 @@ from django.db.transaction import atomic from .models import (Author, AuthorWithDefaultHeight, AuthorWithM2M, Book, BookWithLongName, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, UniqueTest, Thing, TagThrough, BookWithM2MThrough, AuthorTag, AuthorWithM2MThrough, - AuthorWithEvenLongerName, BookWeak) + AuthorWithEvenLongerName, BookWeak, Note) class SchemaTests(TransactionTestCase): @@ -423,6 +423,19 @@ class SchemaTests(TransactionTestCase): self.assertEqual(columns['name'][0], "TextField") self.assertEqual(bool(columns['name'][1][6]), False) + def test_alter_text_field(self): + # Regression for "BLOB/TEXT column 'info' can't have a default value") + # on MySQL. + new_field = TextField(blank=True) + new_field.set_attributes_from_name("info") + with connection.schema_editor() as editor: + editor.alter_field( + Note, + Note._meta.get_field_by_name("info")[0], + new_field, + strict=True, + ) + def test_alter_null_to_not_null(self): """ #23609 - Tests handling of default values when altering from NULL to NOT NULL.