Commit 6605ac33 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #17158 -- Used a non-ambiguous representation of SQL queries

when a correct representation cannot be obtained.
parent d18893d5
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -614,11 +614,11 @@ class BaseDatabaseOperations(object):
        # Convert params to contain Unicode values.
        to_unicode = lambda s: force_text(s, strings_only=True, errors='replace')
        if isinstance(params, (list, tuple)):
            u_params = tuple([to_unicode(val) for val in params])
            u_params = tuple(to_unicode(val) for val in params)
        else:
            u_params = dict([(to_unicode(k), to_unicode(v)) for k, v in params.items()])
            u_params = dict((to_unicode(k), to_unicode(v)) for k, v in params.items())

        return force_text(sql) % u_params
        return six.text_type("QUERY = %r - PARAMS = %r") % (sql, u_params)

    def last_insert_id(self, cursor, table_name, pk_name):
        """
+14 −4
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ from django.db.models import fields, Sum, Avg, Variance, StdDev
from django.db.utils import ConnectionHandler, DatabaseError, load_backend
from django.test import (TestCase, skipUnlessDBFeature, skipIfDBFeature,
    TransactionTestCase)
from django.test.utils import override_settings
from django.test.utils import override_settings, str_prefix
from django.utils import six
from django.utils.six.moves import xrange
from django.utils import unittest
@@ -160,12 +160,13 @@ class DateQuotingTest(TestCase):
        self.assertEqual(len(classes), 1)


class LastExecutedQueryTest(TestCase):
@override_settings(DEBUG=True)
class LastExecutedQueryTest(TestCase):

    def test_debug_sql(self):
        list(models.Tag.objects.filter(name="test"))
        sql = connection.queries[-1]['sql'].lower()
        self.assertTrue(sql.startswith("select"))
        self.assertIn("select", sql)
        self.assertIn(models.Tag._meta.db_table, sql)

    def test_query_encoding(self):
@@ -178,6 +179,15 @@ class LastExecutedQueryTest(TestCase):
        last_sql = cursor.db.ops.last_executed_query(cursor, sql, params)
        self.assertTrue(isinstance(last_sql, six.text_type))

    @unittest.skipUnless(connection.vendor == 'sqlite',
                         "This test is specific to SQLite.")
    def test_no_interpolation_on_sqlite(self):
        # Regression for #17158
        # This shouldn't raise an exception
        query = "SELECT strftime('%Y', 'now');"
        connection.cursor().execute(query)
        self.assertEqual(connection.queries[-1]['sql'],
            str_prefix("QUERY = %(_)s\"SELECT strftime('%%Y', 'now');\" - PARAMS = ()"))

class ParameterHandlingTest(TestCase):
    def test_bad_parameter_count(self):