[1.10.x] Fixed #26781 -- Made table name case change a noop on SQLite.

SQLite disgresses from the SQL standard by ignoring case of quoted identifiers.

Thanks to laozzzi for the report and Tim for the review.

Backport of c2e62fd1ae from master
This commit is contained in:
Simon Charette 2016-06-21 00:01:03 -04:00
parent 1b0b6f0342
commit 23ac35af19
5 changed files with 20 additions and 1 deletions

View File

@ -221,6 +221,10 @@ class BaseDatabaseFeatures(object):
# Defaults to False to allow third-party backends to opt-in. # Defaults to False to allow third-party backends to opt-in.
can_clone_databases = False can_clone_databases = False
# Does the backend consider quoted identifiers with different casing to
# be equal?
ignores_quoted_identifier_case = False
def __init__(self, connection): def __init__(self, connection):
self.connection = connection self.connection = connection

View File

@ -363,7 +363,9 @@ class BaseDatabaseSchemaEditor(object):
""" """
Renames the table a model points to. Renames the table a model points to.
""" """
if old_db_table == new_db_table: if (old_db_table == new_db_table or
(self.connection.features.ignores_quoted_identifier_case and
old_db_table.lower() == new_db_table.lower())):
return return
self.execute(self.sql_rename_table % { self.execute(self.sql_rename_table % {
"old_table": self.quote_name(old_db_table), "old_table": self.quote_name(old_db_table),

View File

@ -40,6 +40,9 @@ class DatabaseFeatures(BaseDatabaseFeatures):
# select for update with limit can be achieved on Oracle, but not with the current backend. # select for update with limit can be achieved on Oracle, but not with the current backend.
supports_select_for_update_with_limit = False supports_select_for_update_with_limit = False
supports_temporal_subtraction = True supports_temporal_subtraction = True
# Oracle doesn't ignore quoted identifiers case but the current backend
# does by uppercasing all identifiers.
ignores_quoted_identifier_case = True
def introspected_boolean_field_type(self, field=None, created_separately=False): def introspected_boolean_field_type(self, field=None, created_separately=False):
""" """

View File

@ -39,6 +39,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_sequence_reset = False supports_sequence_reset = False
can_clone_databases = True can_clone_databases = True
supports_temporal_subtraction = True supports_temporal_subtraction = True
ignores_quoted_identifier_case = True
@cached_property @cached_property
def uses_savepoints(self): def uses_savepoints(self):

View File

@ -825,6 +825,15 @@ class SchemaTests(TransactionTestCase):
author_is_fk = True author_is_fk = True
self.assertTrue(author_is_fk, "No FK constraint for author_id found") self.assertTrue(author_is_fk, "No FK constraint for author_id found")
def test_alter_db_table_case(self):
# Create the table
with connection.schema_editor() as editor:
editor.create_model(Author)
# Alter the case of the table
old_table_name = Author._meta.db_table
with connection.schema_editor() as editor:
editor.alter_db_table(Author, old_table_name, old_table_name.upper())
def test_alter_implicit_id_to_explicit(self): def test_alter_implicit_id_to_explicit(self):
""" """
Should be able to convert an implicit "id" field to an explicit "id" Should be able to convert an implicit "id" field to an explicit "id"