Fixed #23920 -- Fixed MySQL crash when adding blank=True to TextField.

Thanks wkornewald for the report and Markus Holtermann for review.
This commit is contained in:
Tim Graham 2014-12-04 09:11:30 -05:00
parent 018d110ef5
commit 765fa36d57
4 changed files with 23 additions and 3 deletions

View File

@ -552,7 +552,7 @@ class BaseDatabaseSchemaEditor(object):
# Default change? # Default change?
old_default = self.effective_default(old_field) old_default = self.effective_default(old_field)
new_default = self.effective_default(new_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: if new_default is None:
actions.append(( actions.append((
self.sql_alter_column_no_default % { self.sql_alter_column_no_default % {

View File

@ -107,4 +107,7 @@ Bugfixes
* Prevented the * Prevented the
:class:`~django.contrib.auth.middleware.SessionAuthenticationMiddleware` from :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`).

View File

@ -171,3 +171,7 @@ class Thing(models.Model):
def __str__(self): def __str__(self):
return self.when return self.when
class Note(models.Model):
info = models.TextField()

View File

@ -10,7 +10,7 @@ from django.db.transaction import atomic
from .models import (Author, AuthorWithDefaultHeight, AuthorWithM2M, Book, BookWithLongName, from .models import (Author, AuthorWithDefaultHeight, AuthorWithM2M, Book, BookWithLongName,
BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagM2MTest, TagUniqueRename,
UniqueTest, Thing, TagThrough, BookWithM2MThrough, AuthorTag, AuthorWithM2MThrough, UniqueTest, Thing, TagThrough, BookWithM2MThrough, AuthorTag, AuthorWithM2MThrough,
AuthorWithEvenLongerName, BookWeak) AuthorWithEvenLongerName, BookWeak, Note)
class SchemaTests(TransactionTestCase): class SchemaTests(TransactionTestCase):
@ -416,6 +416,19 @@ class SchemaTests(TransactionTestCase):
self.assertEqual(columns['name'][0], "TextField") self.assertEqual(columns['name'][0], "TextField")
self.assertEqual(bool(columns['name'][1][6]), False) 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): def test_alter_null_to_not_null(self):
""" """
#23609 - Tests handling of default values when altering from NULL to NOT NULL. #23609 - Tests handling of default values when altering from NULL to NOT NULL.