diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py index 7b04f0346..be607cec6 100644 --- a/debug_toolbar/panels/sql/utils.py +++ b/debug_toolbar/panels/sql/utils.py @@ -1,4 +1,5 @@ import re +from functools import lru_cache import sqlparse from django.utils.html import escape @@ -32,8 +33,23 @@ def reformat_sql(sql, with_toggle=False): def parse_sql(sql, aligned_indent=False): + return _parse_sql( + sql, + dt_settings.get_config()["PRETTIFY_SQL"], + aligned_indent, + ) + + +@lru_cache(maxsize=128) +def _parse_sql(sql, pretty, aligned_indent): + stack = get_filter_stack(pretty, aligned_indent) + return "".join(stack.run(sql)) + + +@lru_cache(maxsize=None) +def get_filter_stack(prettify, aligned_indent): stack = sqlparse.engine.FilterStack() - if dt_settings.get_config()["PRETTIFY_SQL"]: + if prettify: stack.enable_grouping() if aligned_indent: stack.stmtprocess.append( @@ -41,13 +57,14 @@ def parse_sql(sql, aligned_indent=False): ) stack.preprocess.append(BoldKeywordFilter()) # add our custom filter stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings - return "".join(stack.run(sql)) + return stack + + +simplify_re = re.compile(r"SELECT (...........*?) FROM") def simplify(sql): - expr = r"SELECT (...........*?) FROM" - sub = r"SELECT ••• FROM" - return re.sub(expr, sub, sql) + return simplify_re.sub(r"SELECT ••• FROM", sql) def contrasting_color_generator(): diff --git a/docs/changes.rst b/docs/changes.rst index 5433326c1..3be8dad78 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -11,7 +11,7 @@ Next version * Reset settings when overridden in tests. Packages or projects using django-debug-toolbar can now use Django’s test settings tools, like ``@override_settings``, to reconfigure the toolbar during tests. -* Optimize rendering of SQL panel, saving about 15% of its run time. +* Optimize rendering of SQL panel, saving about 30% of its run time. 3.2.4 (2021-12-15) ------------------