mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[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
			
			
This commit is contained in:
		| @@ -593,7 +593,11 @@ class BaseDatabaseSchemaEditor(object): | |||||||
|                 )) |                 )) | ||||||
|         # Nullability change? |         # Nullability change? | ||||||
|         if old_field.null != new_field.null: |         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(( |                 null_actions.append(( | ||||||
|                     self.sql_alter_column_null % { |                     self.sql_alter_column_null % { | ||||||
|                         "column": self.quote_name(new_field.column), |                         "column": self.quote_name(new_field.column), | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| import datetime | import datetime | ||||||
| import itertools | import itertools | ||||||
| import unittest | import unittest | ||||||
|  | from copy import copy | ||||||
|  |  | ||||||
| from django.db import ( | from django.db import ( | ||||||
|     DatabaseError, IntegrityError, OperationalError, connection, |     DatabaseError, IntegrityError, OperationalError, connection, | ||||||
| @@ -411,7 +412,7 @@ class SchemaTests(TransactionTestCase): | |||||||
|         # Ensure the field is right afterwards |         # Ensure the field is right afterwards | ||||||
|         columns = self.column_classes(Author) |         columns = self.column_classes(Author) | ||||||
|         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]), bool(connection.features.interprets_empty_strings_as_nulls)) | ||||||
|  |  | ||||||
|     def test_alter_text_field(self): |     def test_alter_text_field(self): | ||||||
|         # Regression for "BLOB/TEXT column 'info' can't have a default value") |         # 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='Not null author').height, 12) | ||||||
|         self.assertEqual(Author.objects.get(name='Null author').height, 42) |         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") |     @unittest.skipUnless(connection.features.supports_combined_alters, "No combined ALTER support") | ||||||
|     def test_alter_null_to_not_null_keeping_default(self): |     def test_alter_null_to_not_null_keeping_default(self): | ||||||
|         """ |         """ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user