[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:
parent
1b0b6f0342
commit
23ac35af19
|
@ -221,6 +221,10 @@ class BaseDatabaseFeatures(object):
|
|||
# Defaults to False to allow third-party backends to opt-in.
|
||||
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):
|
||||
self.connection = connection
|
||||
|
||||
|
|
|
@ -363,7 +363,9 @@ class BaseDatabaseSchemaEditor(object):
|
|||
"""
|
||||
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
|
||||
self.execute(self.sql_rename_table % {
|
||||
"old_table": self.quote_name(old_db_table),
|
||||
|
|
|
@ -40,6 +40,9 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||
# select for update with limit can be achieved on Oracle, but not with the current backend.
|
||||
supports_select_for_update_with_limit = False
|
||||
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):
|
||||
"""
|
||||
|
|
|
@ -39,6 +39,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||
supports_sequence_reset = False
|
||||
can_clone_databases = True
|
||||
supports_temporal_subtraction = True
|
||||
ignores_quoted_identifier_case = True
|
||||
|
||||
@cached_property
|
||||
def uses_savepoints(self):
|
||||
|
|
|
@ -825,6 +825,15 @@ class SchemaTests(TransactionTestCase):
|
|||
author_is_fk = True
|
||||
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):
|
||||
"""
|
||||
Should be able to convert an implicit "id" field to an explicit "id"
|
||||
|
|
Loading…
Reference in New Issue