fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)

(cherry picked from commit 7774ec7e3c)
This commit is contained in:
Amin Ghadersohi
2026-04-27 13:41:06 -04:00
committed by Joe Li
parent c23bd3e8b9
commit 9039d1460c
2 changed files with 32 additions and 12 deletions

View File

@@ -62,10 +62,14 @@ class DatabaseFilter(ColumnOperator):
"database_name",
"expose_in_sqllab",
"allow_file_upload",
"created_by_fk",
"changed_by_fk",
] = Field(
...,
description="Column to filter on. Use get_schema(model_type='database') for "
"available filter columns.",
"available filter columns. Use created_by_fk with the user "
"ID from get_instance_info's current_user to find "
"databases created by a specific user.",
)
opr: ColumnOperatorEnum = Field(
...,

View File

@@ -26,7 +26,7 @@ from fastmcp.exceptions import ToolError
from pydantic import ValidationError
from superset.mcp_service.app import mcp
from superset.mcp_service.database.schemas import ListDatabasesRequest
from superset.mcp_service.database.schemas import DatabaseFilter, ListDatabasesRequest
from superset.utils import json
logging.basicConfig(level=logging.DEBUG)
@@ -39,6 +39,25 @@ get_database_info_module = importlib.import_module(
)
class TestDatabaseFilterSchema:
"""Tests for DatabaseFilter schema — filterable columns."""
def test_created_by_fk_is_valid_filter_column(self):
"""created_by_fk must be accepted as a filter column."""
f = DatabaseFilter(col="created_by_fk", opr="eq", value=1)
assert f.col == "created_by_fk"
def test_changed_by_fk_is_valid_filter_column(self):
"""changed_by_fk must be accepted as a filter column."""
f = DatabaseFilter(col="changed_by_fk", opr="eq", value=1)
assert f.col == "changed_by_fk"
def test_invalid_filter_column_rejected(self):
"""Columns not in the Literal set must be rejected."""
with pytest.raises(ValidationError):
DatabaseFilter(col="not_a_real_column", opr="eq", value=1)
def create_mock_database(
database_id: int = 1,
database_name: str = "examples",
@@ -232,18 +251,15 @@ async def test_list_databases_does_not_expose_user_directory_fields(
def test_database_filter_rejects_user_directory_fields() -> None:
"""Test user directory fields cannot be used for database filters."""
with pytest.raises(ValueError, match="created_by_fk"):
ListDatabasesRequest(
filters=[{"col": "created_by_fk", "opr": "eq", "value": 1}],
)
"""Test user directory string fields cannot be used for database filters.
def test_database_filter_rejects_created_by_fk() -> None:
"""created_by_fk is no longer a valid filter column; use created_by_me instead."""
with pytest.raises(ValidationError, match="created_by_fk"):
created_by_fk / changed_by_fk are integer FK IDs and ARE valid filter
columns. The user-directory *string* fields (created_by, created_by_name,
etc.) must still be rejected.
"""
with pytest.raises(ValidationError, match="created_by_name"):
ListDatabasesRequest(
filters=[{"col": "created_by_fk", "opr": "eq", "value": 0}],
filters=[{"col": "created_by_name", "opr": "eq", "value": "admin"}],
)