Skip to content

Commit d29cba3

Browse files
stereodamagepre-commit-ci[bot]albertyw
authored
Fix double EXPLAIN when calling explain on queryset (#654)
* Fix double EXPLAIN when calling explain on queryset * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Albert Wang <git@albertyw.com>
1 parent aa0335b commit d29cba3

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

project/tests/test_execute_sql.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ def mock_sql(mock_query_params):
3232
spec_set=['supports_explaining_query_execution'],
3333
supports_explaining_query_execution=True
3434
),
35-
ops=NonCallableMock(spec_set=['explain_query_prefix']),
35+
ops=NonCallableMock(spec_set=['explain_query_prefix'],
36+
explain_query_prefix=Mock(return_value='')),
3637
)
3738

3839
return mock_sql_query, mock_query_params
@@ -131,6 +132,7 @@ def test_explain_simple(self):
131132
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
132133
sql.connection.ops.explain_query_prefix.return_value = prefix
133134
execute_sql(sql)
135+
self.assertNotIn(prefix, params)
134136
params = tuple(force_str(param) for param in params)
135137
mock_cursor.execute.assert_called_once_with(f"{prefix} {_simple_mock_query_sql}", params)
136138

@@ -141,6 +143,7 @@ def test_explain_unicode(self):
141143
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
142144
sql.connection.ops.explain_query_prefix.return_value = prefix
143145
execute_sql(sql)
146+
self.assertNotIn(prefix, params)
144147
params = tuple(force_str(param) for param in params)
145148
mock_cursor.execute.assert_called_once_with(f"{prefix} {_simple_mock_query_sql}", params)
146149

@@ -151,4 +154,5 @@ def test_explain_non_unicode(self):
151154
mock_cursor = sql.connection.cursor.return_value.__enter__.return_value
152155
sql.connection.ops.explain_query_prefix.return_value = prefix
153156
execute_sql(sql)
157+
self.assertNotIn(prefix, params)
154158
self.assertFalse(mock_cursor.execute.called)

silk/sql.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ def _explain_query(connection, q, params):
5353

5454
# currently we cannot use explain() method
5555
# for queries other than `select`
56-
prefixed_query = f"{prefix} {q}"
56+
if q.upper().startswith(prefix.upper()):
57+
# to avoid "EXPLAIN EXPLAIN", do not add prefix
58+
prefixed_query = q
59+
else:
60+
prefixed_query = f"{prefix} {q}"
5761
with connection.cursor() as cur:
5862
try:
5963
params_str = tuple(force_str(param) for param in params)

0 commit comments

Comments
 (0)