From 771c34c20fbfa68fb0402d9f7d072ff36f3dffb8 Mon Sep 17 00:00:00 2001 From: kudala-bharani Date: Fri, 4 Sep 2026 17:21:54 -0400 Subject: [PATCH] Fix REFRESH statement type detection Recognize REFRESH as a DDL keyword so materialized view refreshes report their statement type and honor keyword formatting. Cover supported query variants and leading comments with regressions for issue797. --- CHANGELOG | 3 ++- sqlparse/keywords.py | 1 + tests/test_regressions.py | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 44d5938e..afa8face 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,8 @@ Development Version ------------------- -Nothing yet. +* Recognize REFRESH as a DDL keyword so that REFRESH MATERIALIZED VIEW + statements are detected and formatted correctly (issue797). Release 0.6.0 (Aug 13, 2026) diff --git a/sqlparse/keywords.py b/sqlparse/keywords.py index dd6e5d15..eac80fc5 100644 --- a/sqlparse/keywords.py +++ b/sqlparse/keywords.py @@ -568,6 +568,7 @@ def find_delimited_spans(text): 'REF': tokens.Keyword, 'REFERENCES': tokens.Keyword, 'REFERENCING': tokens.Keyword, + 'REFRESH': tokens.Keyword.DDL, 'REINDEX': tokens.Keyword, 'RELATIVE': tokens.Keyword, 'RENAME': tokens.Keyword, diff --git a/tests/test_regressions.py b/tests/test_regressions.py index aca7f7b3..fbac9140 100644 --- a/tests/test_regressions.py +++ b/tests/test_regressions.py @@ -477,6 +477,25 @@ def test_materialized_view_issue752(): assert formatted == 'CREATE MATERIALIZED VIEW v AS SELECT 1' +@pytest.mark.parametrize('statement', [ + 'REFRESH MATERIALIZED VIEW order_summary;', + 'refresh materialized view order_summary;', + 'REFRESH MATERIALIZED VIEW CONCURRENTLY public.order_summary;', + 'REFRESH MATERIALIZED VIEW order_summary WITH NO DATA;', + '-- update cached results\nREFRESH MATERIALIZED VIEW order_summary;', +]) +def test_refresh_materialized_view_type_issue797(statement): + parsed = sqlparse.parse(statement)[0] + assert parsed.get_type() == 'REFRESH' + assert str(parsed) == statement + + +def test_refresh_materialized_view_format_issue797(): + formatted = sqlparse.format( + 'refresh materialized view order_summary;', keyword_case='upper') + assert formatted == 'REFRESH MATERIALIZED VIEW order_summary;' + + @pytest.mark.parametrize('sql', [ 'a BETWEEN .03 AND .06', 'a between .03 and .06',