Fixed #32653 -- Made quoting names in the Oracle backend consistent with db_table.

This commit is contained in:
Mariusz Felisiak 2021-04-30 12:59:07 +02:00 committed by GitHub
parent 54da6e2ac2
commit 1f643c28b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -334,7 +334,7 @@ END;
# always defaults to uppercase. # always defaults to uppercase.
# We simplify things by making Oracle identifiers always uppercase. # We simplify things by making Oracle identifiers always uppercase.
if not name.startswith('"') and not name.endswith('"'): if not name.startswith('"') and not name.endswith('"'):
name = '"%s"' % truncate_name(name.upper(), self.max_name_length()) name = '"%s"' % truncate_name(name, self.max_name_length())
# Oracle puts the query text into a (query % args) construct, so % signs # Oracle puts the query text into a (query % args) construct, so % signs
# in names need to be escaped. The '%%' will be collapsed back to '%' at # in names need to be escaped. The '%%' will be collapsed back to '%' at
# that stage so we aren't really making the name longer here. # that stage so we aren't really making the name longer here.

View File

@ -4,7 +4,9 @@ from django.db import DatabaseError, connection
from django.db.models import BooleanField from django.db.models import BooleanField
from django.test import TransactionTestCase from django.test import TransactionTestCase
from ..models import Square from ..models import (
Square, VeryLongModelNameZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ,
)
@unittest.skipUnless(connection.vendor == 'oracle', 'Oracle tests') @unittest.skipUnless(connection.vendor == 'oracle', 'Oracle tests')
@ -16,6 +18,13 @@ class Tests(unittest.TestCase):
quoted_name = connection.ops.quote_name(name) quoted_name = connection.ops.quote_name(name)
self.assertEqual(quoted_name % (), name) self.assertEqual(quoted_name % (), name)
def test_quote_name_db_table(self):
model = VeryLongModelNameZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
db_table = model._meta.db_table.upper()
self.assertEqual(f'"{db_table}"', connection.ops.quote_name(
'backends_verylongmodelnamezzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
))
def test_dbms_session(self): def test_dbms_session(self):
"""A stored procedure can be called through a cursor wrapper.""" """A stored procedure can be called through a cursor wrapper."""
with connection.cursor() as cursor: with connection.cursor() as cursor: