From 521679010bdb2efbbeec6710ddfcb40ad44e9ff4 Mon Sep 17 00:00:00 2001 From: Makoto Shinohara Date: Wed, 3 Dec 2025 16:19:54 +0900 Subject: [PATCH] fix: Add AS alias to semantic view query to preserve column names When using bind variables with identifier(?) in SEMANTIC_VIEW queries, Snowflake returns numeric column names instead of the actual dimension/ metric/fact names. This makes WHERE and ORDER BY clauses fail because they reference non-existent column names. This fix adds AS alias to each identifier: - identifier(?) AS {expr.name} This preserves the column names while maintaining the security benefits of using bind variables for the identifier values. --- mcp_server_snowflake/semantic_manager/tools.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mcp_server_snowflake/semantic_manager/tools.py b/mcp_server_snowflake/semantic_manager/tools.py index 98ff864..dbd4eb0 100644 --- a/mcp_server_snowflake/semantic_manager/tools.py +++ b/mcp_server_snowflake/semantic_manager/tools.py @@ -185,11 +185,12 @@ def write_semantic_view_query( bindvars = [f"{database_name}.{schema_name}.{view_name}"] # Add clauses in order (affects output column order) + # Use AS alias to preserve column names when using bind variables if dimensions: statement += " DIMENSIONS" for index, expr in enumerate(dimensions): is_last = index == len(dimensions) - 1 - statement += " identifier(?)" + statement += f" identifier(?) AS {expr.name}" bindvars.extend([f"{expr.table}.{expr.name}"]) if not is_last: statement += "," @@ -198,7 +199,7 @@ def write_semantic_view_query( statement += " METRICS" for index, expr in enumerate(metrics): is_last = index == len(metrics) - 1 - statement += " identifier(?)" + statement += f" identifier(?) AS {expr.name}" bindvars.extend([f"{expr.table}.{expr.name}"]) if not is_last: statement += "," @@ -207,7 +208,7 @@ def write_semantic_view_query( statement += " FACTS" for index, expr in enumerate(facts): is_last = index == len(facts) - 1 - statement += " identifier(?)" + statement += f" identifier(?) AS {expr.name}" bindvars.extend([f"{expr.table}.{expr.name}"]) if not is_last: statement += ","