diff options
author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2017-02-15 12:22:34 +0100 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2017-02-17 09:24:55 -0500 |
commit | b9351905721771fb49ea0020c751ae4280754c43 (patch) | |
tree | 1c01fac71304251530d9b027596ee6ca6fffa4a5 | |
parent | 1f7ca858664491589ba400419a491dd0a9af5dff (diff) | |
download | django-b9351905721771fb49ea0020c751ae4280754c43.tar.gz |
Fixed #27843 -- Fixed truncate_name() when the name contains a username.
-rw-r--r-- | django/db/backends/utils.py | 15 | ||||
-rw-r--r-- | tests/backends/test_utils.py | 4 |
2 files changed, 15 insertions, 4 deletions
diff --git a/django/db/backends/utils.py b/django/db/backends/utils.py index 5da4e04478..7cb8228226 100644 --- a/django/db/backends/utils.py +++ b/django/db/backends/utils.py @@ -2,6 +2,7 @@ import datetime import decimal import hashlib import logging +import re from time import time from django.conf import settings @@ -178,13 +179,19 @@ def rev_typecast_decimal(d): def truncate_name(name, length=None, hash_len=4): - """Shortens a string to a repeatable mangled version with the given length. """ - if length is None or len(name) <= length: + Shorten a string to a repeatable mangled version with the given length. + If a quote stripped name contains a username, e.g. USERNAME"."TABLE, + truncate the table portion only. + """ + match = re.match('([^"]+)"\."([^"]+)', name) + table_name = match.group(2) if match else name + + if length is None or len(table_name) <= length: return name - hsh = hashlib.md5(force_bytes(name)).hexdigest()[:hash_len] - return '%s%s' % (name[:length - hash_len], hsh) + hsh = hashlib.md5(force_bytes(table_name)).hexdigest()[:hash_len] + return '%s%s%s' % (match.group(1) + '"."' if match else '', table_name[:length - hash_len], hsh) def format_number(value, max_digits, decimal_places): diff --git a/tests/backends/test_utils.py b/tests/backends/test_utils.py index 5076c1ae08..bf62c8c6df 100644 --- a/tests/backends/test_utils.py +++ b/tests/backends/test_utils.py @@ -20,3 +20,7 @@ class TestLoadBackend(SimpleTestCase): self.assertEqual(truncate_name('some_long_table', 10), 'some_la38a') self.assertEqual(truncate_name('some_long_table', 10, 3), 'some_loa38') self.assertEqual(truncate_name('some_long_table'), 'some_long_table') + # "user"."table" syntax + self.assertEqual(truncate_name('username"."some_table', 10), 'username"."some_table') + self.assertEqual(truncate_name('username"."some_long_table', 10), 'username"."some_la38a') + self.assertEqual(truncate_name('username"."some_long_table', 10, 3), 'username"."some_loa38') |