summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShai Berger <shai@platonix.com>2015-02-18 00:50:45 +0200
committerShai Berger <shai@platonix.com>2015-02-19 02:44:08 +0200
commit66d37e593c8fa22be226b34b4fc1f60f85dcdc26 (patch)
tree35217077ad554d2e466a0cff5246fec18c4be14c
parente2a3be1e4d9a85aa30f1b7d9064b5abb1569eea6 (diff)
[1.8.x] Fixed #24307: Avoided redundant column nullability modifications on Oracle
Thanks Joris Benschop for the report, and Tim Graham for the tests. Backport of ceadc94f09 from master
-rw-r--r--django/db/backends/base/schema.py6
-rw-r--r--tests/schema/tests.py33
2 files changed, 37 insertions, 2 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 00306d6803..d14f8919c0 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -593,7 +593,11 @@ class BaseDatabaseSchemaEditor(object):
))
# Nullability change?
if old_field.null != new_field.null:
- if new_field.null:
+ if (self.connection.features.interprets_empty_strings_as_nulls and
+ new_field.get_internal_type() in ("CharField", "TextField")):
+ # The field is nullable in the database anyway, leave it alone
+ pass
+ elif new_field.null:
null_actions.append((
self.sql_alter_column_null % {
"column": self.quote_name(new_field.column),
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index 7961ffa36a..901397e391 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -1,6 +1,7 @@
import datetime
import itertools
import unittest
+from copy import copy
from django.db import (
DatabaseError, IntegrityError, OperationalError, connection,
@@ -411,7 +412,7 @@ class SchemaTests(TransactionTestCase):
# Ensure the field is right afterwards
columns = self.column_classes(Author)
self.assertEqual(columns['name'][0], "TextField")
- self.assertEqual(bool(columns['name'][1][6]), False)
+ self.assertEqual(bool(columns['name'][1][6]), bool(connection.features.interprets_empty_strings_as_nulls))
def test_alter_text_field(self):
# Regression for "BLOB/TEXT column 'info' can't have a default value")
@@ -454,6 +455,36 @@ class SchemaTests(TransactionTestCase):
self.assertEqual(Author.objects.get(name='Not null author').height, 12)
self.assertEqual(Author.objects.get(name='Null author').height, 42)
+ def test_alter_charfield_to_null(self):
+ """
+ #24307 - Should skip an alter statement on databases with
+ interprets_empty_strings_as_null when changing a CharField to null.
+ """
+ # Create the table
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+ # Change the CharField to null
+ old_field = Author._meta.get_field('name')
+ new_field = copy(old_field)
+ new_field.null = True
+ with connection.schema_editor() as editor:
+ editor.alter_field(Author, old_field, new_field)
+
+ def test_alter_textfield_to_null(self):
+ """
+ #24307 - Should skip an alter statement on databases with
+ interprets_empty_strings_as_null when changing a TextField to null.
+ """
+ # Create the table
+ with connection.schema_editor() as editor:
+ editor.create_model(Note)
+ # Change the TextField to null
+ old_field = Note._meta.get_field('info')
+ new_field = copy(old_field)
+ new_field.null = True
+ with connection.schema_editor() as editor:
+ editor.alter_field(Note, old_field, new_field)
+
@unittest.skipUnless(connection.features.supports_combined_alters, "No combined ALTER support")
def test_alter_null_to_not_null_keeping_default(self):
"""