Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
Loading branch information
@@ -73,6 +73,10 @@ def __init__(self, settings_dict, alias=DEFAULT_DB_ALIAS,
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 @@ def cursor(self):
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
@@ -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 @@ def schema_editor(self, *args, **kwargs):
"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 :
@@ -3960,11 +3960,7 @@ def test_user_permission_performance(self):
# 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 @@ def test_save_button(self):
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 )
Toggle all file notes