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 == []