diff --git a/debug_toolbar/panels/sql/forms.py b/debug_toolbar/panels/sql/forms.py
index 6cc1554a1..ac17e68ec 100644
--- a/debug_toolbar/panels/sql/forms.py
+++ b/debug_toolbar/panels/sql/forms.py
@@ -77,7 +77,7 @@ def clean_hash(self):
return hash
def reformat_sql(self):
- return reformat_sql(self.cleaned_data["sql"])
+ return reformat_sql(self.cleaned_data["sql"], with_toggle=False)
def make_hash(self, data):
m = hmac.new(key=force_bytes(settings.SECRET_KEY), digestmod=hashlib.sha1)
diff --git a/debug_toolbar/panels/sql/panel.py b/debug_toolbar/panels/sql/panel.py
index fac9c473b..075bc9324 100644
--- a/debug_toolbar/panels/sql/panel.py
+++ b/debug_toolbar/panels/sql/panel.py
@@ -213,7 +213,7 @@ def duplicate_key(query):
query["form"] = SQLSelectForm(auto_id=None, initial=copy(query))
if query["sql"]:
- query["sql"] = reformat_sql(query["sql"])
+ query["sql"] = reformat_sql(query["sql"], with_toggle=True)
query["rgb_color"] = self._databases[alias]["rgb_color"]
try:
query["width_ratio"] = (query["duration"] / self._sql_time) * 100
diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py
index 5babe15d2..e22c9ab09 100644
--- a/debug_toolbar/panels/sql/utils.py
+++ b/debug_toolbar/panels/sql/utils.py
@@ -21,22 +21,32 @@ def process(self, stream):
yield T.Text, ""
-def reformat_sql(sql):
+def reformat_sql(sql, with_toggle=False):
+ formatted = parse_sql(sql, aligned_indent=True)
+ if not with_toggle:
+ return formatted
+ simple = simplify(parse_sql(sql, aligned_indent=False))
+ uncollapsed = '{}'.format(simple)
+ collapsed = '{}'.format(formatted)
+ return collapsed + uncollapsed
+
+
+def parse_sql(sql, aligned_indent=False):
stack = sqlparse.engine.FilterStack()
+ stack.enable_grouping()
+ if aligned_indent:
+ stack.stmtprocess.append(
+ sqlparse.filters.AlignedIndentFilter(char=" ", n="
")
+ )
stack.preprocess.append(BoldKeywordFilter()) # add our custom filter
stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings
- return swap_fields("".join(stack.run(sql)))
+ return "".join(stack.run(sql))
-def swap_fields(sql):
+def simplify(sql):
expr = r"SELECT (...........*?) FROM"
- subs = (
- r"SELECT "
- r'••• '
- r'\1 '
- r"FROM"
- )
- return re.sub(expr, subs, sql)
+ sub = r"SELECT ••• FROM"
+ return re.sub(expr, sub, sql)
def contrasting_color_generator():