You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2026/09/14 16:42:44 UTC
(superset) branch fix-fetch-values-predicate-jinja-undefinederror created (now 5abb8ebb4ce)
This is an automated email from the ASF dual-hosted git repository.
eschutho pushed a change to branch fix-fetch-values-predicate-jinja-undefinederror
in repository https://gitbox.apache.org/repos/asf/superset.git
at 5abb8ebb4ce fix(sqla): move process_template inside try block in get_fetch_values_predicate
This branch includes the following new commits:
new 5abb8ebb4ce fix(sqla): move process_template inside try block in get_fetch_values_predicate
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(superset) 01/01: fix(sqla): move process_template inside try block in get_fetch_values_predicate
Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
eschutho pushed a commit to branch fix-fetch-values-predicate-jinja-undefinederror
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 5abb8ebb4cec8409a26bea704b59c9d3feae32cc
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Mon Sep 14 16:41:57 2026 +0000
fix(sqla): move process_template inside try block in get_fetch_values_predicate
The process_template call was outside the try block that contains the
except (TemplateError, SupersetSyntaxErrorException) handler written
to catch it. A bare jinja2.exceptions.UndefinedError (e.g. from
{{ foo.bar }} attribute access on an undefined variable) would escape
uncaught, producing an opaque 500 instead of a clean 400 with the
intended "Error in jinja expression in fetch values predicate" message.
Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
superset/connectors/sqla/models.py | 8 ++++----
tests/unit_tests/connectors/sqla/models_test.py | 22 ++++++++++++++++++++++
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index f9b063b16ef..eaaf3f3ca8d 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -1859,11 +1859,11 @@ class SqlaTable(
template_processor: BaseTemplateProcessor | None = None,
) -> TextClause:
fetch_values_predicate = self.fetch_values_predicate
- if template_processor:
- fetch_values_predicate = template_processor.process_template(
- fetch_values_predicate
- )
try:
+ if template_processor:
+ fetch_values_predicate = template_processor.process_template(
+ fetch_values_predicate
+ )
# Re-validate the rendered predicate with the same parser policy
# as stored column and metric expressions before embedding it.
validate_stored_expression(
diff --git a/tests/unit_tests/connectors/sqla/models_test.py b/tests/unit_tests/connectors/sqla/models_test.py
index fca6cf038e1..56b4f8d59c6 100644
--- a/tests/unit_tests/connectors/sqla/models_test.py
+++ b/tests/unit_tests/connectors/sqla/models_test.py
@@ -19,6 +19,7 @@ from unittest.mock import MagicMock
import pandas as pd
import pytest
+from jinja2.exceptions import UndefinedError
from pytest_mock import MockerFixture
from sqlalchemy import create_engine
from sqlalchemy.dialects import sqlite
@@ -2001,3 +2002,24 @@ def test_gauge_query_restores_long_sql_metric_label(mocker: MockerFixture) -> No
)
is None
)
+
+
+def test_get_fetch_values_predicate_wraps_undefined_error(
+ mocker: MockerFixture,
+) -> None:
+ """UndefinedError from process_template must be caught and re-raised as
+ QueryObjectValidationError, not bubble as a raw 500."""
+ database = mocker.MagicMock()
+ sqla_table = SqlaTable(
+ table_name="my_sqla_table",
+ columns=[],
+ metrics=[],
+ database=database,
+ )
+ sqla_table.fetch_values_predicate = "{{ foo.bar }} = 1"
+
+ mock_processor = mocker.MagicMock()
+ mock_processor.process_template.side_effect = UndefinedError("'foo' is undefined")
+
+ with pytest.raises(QueryObjectValidationError):
+ sqla_table.get_fetch_values_predicate(template_processor=mock_processor)