Skip to content

Commit 7475cf0

Browse files
authored
Change the SQL panel to show the select and explain buttons for all queries (#2393)
1 parent 931a234 commit 7475cf0

6 files changed

Lines changed: 12 additions & 28 deletions

File tree

debug_toolbar/panels/sql/forms.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.utils.functional import cached_property
77
from django.utils.translation import gettext_lazy as _
88

9-
from debug_toolbar.panels.sql.utils import is_select_query, reformat_sql
9+
from debug_toolbar.panels.sql.utils import reformat_sql
1010
from debug_toolbar.toolbar import DebugToolbar
1111

1212

@@ -21,14 +21,6 @@ class SQLSelectForm(forms.Form):
2121
request_id = forms.CharField()
2222
djdt_query_id = forms.CharField()
2323

24-
def clean_raw_sql(self):
25-
value = self.cleaned_data["raw_sql"]
26-
27-
if not is_select_query(value):
28-
raise ValidationError("Only 'select' queries are allowed.")
29-
30-
return value
31-
3224
def clean_params(self):
3325
value = self.cleaned_data["params"]
3426

debug_toolbar/panels/sql/panel.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from debug_toolbar.panels.sql.tracking import wrap_cursor
1717
from debug_toolbar.panels.sql.utils import (
1818
contrasting_color_generator,
19-
is_select_query,
2019
reformat_sql,
2120
)
2221
from debug_toolbar.utils import render_stacktrace
@@ -271,7 +270,6 @@ def generate_stats(self, request, response):
271270
query["vendor"], query["trans_status"]
272271
)
273272
query["is_slow"] = query["duration"] > sql_warning_threshold
274-
query["is_select"] = is_select_query(query["raw_sql"])
275273

276274
query["rgb_color"] = self._databases[alias]["rgb_color"]
277275
try:

debug_toolbar/panels/sql/utils.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,6 @@ def process(stmt):
8888
return "".join(escaped_value(token) for token in stmt.flatten())
8989

9090

91-
def is_select_query(sql):
92-
# UNION queries can start with "(".
93-
return sql.lower().lstrip(" (").startswith("select")
94-
95-
9691
def reformat_sql(sql, *, with_toggle=False):
9792
formatted = parse_sql(sql)
9893
if not with_toggle:

debug_toolbar/templates/debug_toolbar/panels/sql.html

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,14 @@
7575
</td>
7676
<td class="djdt-actions">
7777
{% if query.params %}
78-
{% if query.is_select %}
79-
<form method="post">
80-
{{ query.form.as_div }}
81-
<button formaction="{% url 'djdt:sql_select' %}" class="remoteCall">Sel</button>
82-
<button formaction="{% url 'djdt:sql_explain' %}" class="remoteCall">Expl</button>
83-
{% if query.vendor == 'mysql' %}
84-
<button formaction="{% url 'djdt:sql_profile' %}" class="remoteCall">Prof</button>
85-
{% endif %}
86-
</form>
87-
{% endif %}
78+
<form method="post">
79+
{{ query.form.as_div }}
80+
<button formaction="{% url 'djdt:sql_select' %}" class="remoteCall">Sel</button>
81+
<button formaction="{% url 'djdt:sql_explain' %}" class="remoteCall">Expl</button>
82+
{% if query.vendor == 'mysql' %}
83+
<button formaction="{% url 'djdt:sql_profile' %}" class="remoteCall">Prof</button>
84+
{% endif %}
85+
</form>
8886
{% endif %}
8987
</td>
9088
</tr>

docs/changes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ Pending
3333
* Fixed cookie ``expires`` calculation in ``djdt.cookie.set``.
3434
* Account for the new ``CULL_PROBABILITY`` in Django 6.2 in tests.
3535
* Support Django 6.2's handling of booleans for non-PostgreSQL databases.
36+
* Changed the SQL panel to show the "Select" and "Explain" action buttons for
37+
all queries, not just ``SELECT`` statements.
3638

3739
6.3.0 (2026-04-01)
3840
------------------

tests/panels/test_sql.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,8 +875,7 @@ def test_explain_with_union(self):
875875
list(User.objects.filter(id__lt=20).union(User.objects.filter(id__gt=10)))
876876
response = self.panel.process_request(self.request)
877877
self.panel.generate_stats(self.request, response)
878-
query = self.panel._queries[0]
879-
self.assertTrue(query["is_select"])
878+
self.assertIn("Expl", self.panel.content)
880879

881880
@override_settings(DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True})
882881
def test_sql_parse_error_graceful_degradation(self):

0 commit comments

Comments
 (0)