Commit 40bfd856 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #20420 -- Normalized query counts on Oracle.

This is achieved by inserting a fake entry in connection.queries when
not releasing a savepoint (since Oracle doesn't support that operation.)

Also removed the can_release_savepoints feature that was recently added,
but is superseded by this solution.
parent 127218b9
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -73,6 +73,10 @@ class BaseDatabaseWrapper(object):
        self.allow_thread_sharing = allow_thread_sharing
        self._thread_ident = thread.get_ident()

    @property
    def queries_logged(self):
        return self.use_debug_cursor or settings.DEBUG

    @property
    def queries(self):
        if len(self.queries_log) == self.queries_log.maxlen:
@@ -156,7 +160,7 @@ class BaseDatabaseWrapper(object):
        Creates a cursor, opening a connection if necessary.
        """
        self.validate_thread_sharing()
        if self.use_debug_cursor or settings.DEBUG:
        if self.queries_logged:
            cursor = self.make_debug_cursor(self._cursor())
        else:
            cursor = self.make_cursor(self._cursor())
@@ -493,7 +497,6 @@ class BaseDatabaseFeatures(object):
    can_return_id_from_insert = False
    has_bulk_insert = False
    uses_savepoints = False
    can_release_savepoints = True
    can_combine_inserts_with_and_without_auto_increment_pk = False

    # If True, don't use integer foreign keys referring to, e.g., positive
+7 −3
Original line number Diff line number Diff line
@@ -96,7 +96,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
    needs_datetime_string_cast = False
    interprets_empty_strings_as_nulls = True
    uses_savepoints = True
    can_release_savepoints = False
    has_select_for_update = True
    has_select_for_update_nowait = True
    can_return_id_from_insert = True
@@ -691,9 +690,14 @@ class DatabaseWrapper(BaseDatabaseWrapper):
        "Returns a new instance of this backend's SchemaEditor"
        return DatabaseSchemaEditor(self, *args, **kwargs)

    # Oracle doesn't support savepoint commits.  Ignore them.
    # Oracle doesn't support releasing savepoints. But we fake them when query
    # logging is enabled to keep query counts consistent with other backends.
    def _savepoint_commit(self, sid):
        pass
        if self.queries_logged:
            self.queries_log.append({
                'sql': '-- RELEASE SAVEPOINT %s (faked)' % self.ops.quote_name(sid),
                'time': '0.000',
            })

    def _set_autocommit(self, autocommit):
        with self.wrap_database_errors:
+2 −11
Original line number Diff line number Diff line
@@ -3960,11 +3960,7 @@ class UserAdminTest(TestCase):
        # Don't depend on a warm cache, see #17377.
        ContentType.objects.clear_cache()

        expected_queries = 10
        if not connection.features.can_release_savepoints:
            expected_queries -= 1

        with self.assertNumQueries(expected_queries):
        with self.assertNumQueries(10):
            response = self.client.get('/test_admin/admin/auth/user/%s/' % u.pk)
            self.assertEqual(response.status_code, 200)

@@ -4001,12 +3997,7 @@ class GroupAdminTest(TestCase):

    def test_group_permission_performance(self):
        g = Group.objects.create(name="test_group")

        expected_queries = 8
        if not connection.features.can_release_savepoints:
            expected_queries -= 1

        with self.assertNumQueries(expected_queries):
        with self.assertNumQueries(8):
            response = self.client.get('/test_admin/admin/auth/group/%s/' % g.pk)
            self.assertEqual(response.status_code, 200)