diff --git a/debug_toolbar/panels/sql/tracking.py b/debug_toolbar/panels/sql/tracking.py index 204cfa13c..fe1de6af8 100644 --- a/debug_toolbar/panels/sql/tracking.py +++ b/debug_toolbar/panels/sql/tracking.py @@ -6,7 +6,7 @@ from time import time from django.utils import six -from django.utils.encoding import force_text, DjangoUnicodeDecodeError +from django.utils.encoding import DjangoUnicodeDecodeError, force_text from debug_toolbar import settings as dt_settings from debug_toolbar.utils import get_stack, get_template_info, tidy_stacktrace @@ -88,6 +88,8 @@ def _quote_expr(self, element): return "'%s'" % force_text(element).replace("'", "''") except DjangoUnicodeDecodeError: return repr(element) + elif isinstance(element, six.binary_type): + return '(binary data)' else: return repr(element) diff --git a/tests/panels/test_sql.py b/tests/panels/test_sql.py index b46ece32d..df91b59a2 100644 --- a/tests/panels/test_sql.py +++ b/tests/panels/test_sql.py @@ -122,6 +122,18 @@ def test_param_conversion(self): '["2017-12-22 16:07:01"]' )) + @unittest.skipUnless(connection.vendor not in ('sqlite', 'postgresql'), '') + def test_binary_param_force_text(self): + self.assertEqual(len(self.panel._queries), 0) + + with connection.cursor() as cursor: + cursor.execute("SELECT * FROM auth_user WHERE username = %s", [b'\xff']) + + self.assertEqual(len(self.panel._queries), 1) + + self.panel.process_response(self.request, self.response) + self.panel.generate_stats(self.request, self.response) + @unittest.skipUnless(connection.vendor != 'sqlite', 'Test invalid for SQLite') def test_raw_query_param_conversion(self):