From ddc5264b1e689f446757db3cf8aeafe72789bcb1 Mon Sep 17 00:00:00 2001 From: collerek Date: Thu, 7 May 2026 22:17:29 +0200 Subject: [PATCH] Silence sqlglot warnings from internal sub-parser body re-rendering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NestedResolver._body_sql re-renders subquery bodies via sqlglot's generator and feeds the result to a sub-Parser. Because the generator defaulted to ErrorLevel.WARN, unsupported-feature warnings (e.g. T-SQL FOR XML PATH) leaked to end users even though the regenerated SQL is purely internal. Switch to ErrorLevel.IGNORE — same rationale as the existing parse-side silencing in DialectParser._parse_with_dialect. Resolves #261. --- sql_metadata/nested_resolver.py | 9 ++++++++- test/test_mssql_server.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/sql_metadata/nested_resolver.py b/sql_metadata/nested_resolver.py index 771fd0b9..3efa9ef2 100644 --- a/sql_metadata/nested_resolver.py +++ b/sql_metadata/nested_resolver.py @@ -15,6 +15,7 @@ from sql_metadata.parser import Parser from sqlglot import exp +from sqlglot.errors import ErrorLevel from sqlglot.generator import Generator from sql_metadata.utils import ( @@ -678,7 +679,13 @@ def _body_sql(node: exp.Expression) -> str: body = node.copy() for ident in body.find_all(exp.Identifier): ident.set("quoted", False) - return _PreservingGenerator().generate(body, copy=False) + # IGNORE unsupported-feature warnings: the rendered SQL is only fed + # back into a sub-Parser and never shown to the user, so warnings + # about constructs sqlglot can't faithfully re-emit (e.g. T-SQL + # FOR XML PATH) are noise. + return _PreservingGenerator(unsupported_level=ErrorLevel.IGNORE).generate( + body, copy=False + ) @staticmethod def _walk_subqueries( diff --git a/test/test_mssql_server.py b/test/test_mssql_server.py index 82081082..1035b4eb 100644 --- a/test/test_mssql_server.py +++ b/test/test_mssql_server.py @@ -187,3 +187,19 @@ def test_mssql_catalog_double_dot(): """SQL Server three-part name with empty db: catalog..table.""" p = Parser("SELECT * FROM mydb..orders") assert "mydb..orders" in p.tables + + +def test_for_xml_path_does_not_emit_sqlglot_warning(caplog): + # Test for issue #261: T-SQL FOR XML PATH queries parsed cleanly but + # sqlglot leaked "Unsupported query option." warnings when + # NestedResolver re-rendered subquery bodies internally. + # https://github.com/macbre/sql-metadata/issues/261 + query = """ + SELECT B.id, STUFF((SELECT ', ' + A.[name] + FROM (SELECT id, name FROM table_enc) A + WHERE A.id = B.[id] FOR XML PATH('')), 1, 1, '') AS [output] + FROM (SELECT id FROM table_enc) B + """ + with caplog.at_level("WARNING", logger="sqlglot"): + Parser(query).columns # .columns drives NestedResolver._body_sql + assert caplog.records == []