|
14 | 14 | from django.db.utils import DatabaseError |
15 | 15 | from django.shortcuts import render |
16 | 16 | from django.test.utils import override_settings |
| 17 | +from sqlparse.exceptions import SQLParseError |
17 | 18 |
|
18 | 19 | import debug_toolbar.panels.sql.tracking as sql_tracking |
19 | 20 | from debug_toolbar import settings as dt_settings |
20 | 21 | from debug_toolbar.models import HistoryEntry |
21 | 22 | from debug_toolbar.panels.sql import SQLPanel, tracking |
| 23 | +from debug_toolbar.panels.sql.utils import parse_sql |
22 | 24 |
|
23 | 25 | try: |
24 | 26 | import psycopg |
@@ -869,6 +871,33 @@ def test_explain_with_union(self): |
869 | 871 | query = self.panel._queries[0] |
870 | 872 | self.assertTrue(query["is_select"]) |
871 | 873 |
|
| 874 | + @override_settings(DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True}) |
| 875 | + def test_sql_parse_error_graceful_degradation(self): |
| 876 | + """ |
| 877 | + Test that SQLParseError is handled gracefully by disabling grouping. |
| 878 | + """ |
| 879 | + parse_sql.cache_clear() |
| 880 | + |
| 881 | + def run_side_effect(sql): |
| 882 | + if mock_stack.run.call_count == 1: |
| 883 | + raise SQLParseError("Token limit exceeded") |
| 884 | + return [sql] |
| 885 | + |
| 886 | + with patch("debug_toolbar.panels.sql.utils.get_filter_stack") as mock_get_stack: |
| 887 | + mock_stack = mock_get_stack.return_value |
| 888 | + mock_stack.run.side_effect = run_side_effect |
| 889 | + mock_stack._grouping = True |
| 890 | + |
| 891 | + result = parse_sql("SELECT * FROM test") |
| 892 | + |
| 893 | + # Should have been called twice (once for error, once for retry) |
| 894 | + self.assertEqual(mock_stack.run.call_count, 2) |
| 895 | + # On retry, _grouping should be set to False |
| 896 | + self.assertFalse(mock_stack._grouping) |
| 897 | + self.assertIn("SELECT", result) |
| 898 | + |
| 899 | + parse_sql.cache_clear() |
| 900 | + |
872 | 901 |
|
873 | 902 | class SQLPanelMultiDBTestCase(BaseMultiDBTestCase): |
874 | 903 | panel_id = SQLPanel.panel_id |
|
0 commit comments