codeant-ai-for-open-source[bot] commented on code in PR #37371:
URL: https://github.com/apache/superset/pull/37371#discussion_r3510807709
##########
superset/security/manager.py:
##########
@@ -520,48 +530,240 @@ def _native_filter_request_modified(query_context:
"QueryContext") -> bool:
)
+def _get_form_data_item_label(item: Any, is_metric: bool) -> str | None:
+ """
+ Return the result-key label Superset uses for a column or metric
definition.
+ """
+ label: Any
+ try:
+ label = get_metric_name(item) if is_metric else get_column_name(item)
+ except (AttributeError, KeyError, TypeError, ValueError):
+ return None
+ return label if isinstance(label, str) and label else None
+
+
+def _is_hidden_table_column(column_config: Any, name: str) -> bool:
+ """
+ Whether Table column_config marks a result column as hidden.
+ """
+ config = column_config.get(name) if isinstance(column_config, dict) else
None
+ return isinstance(config, dict) and config.get("visible") is False
+
+
+def _stored_sort_target_identifiers(item: Any, is_metric: bool) -> set[str]:
+ """
+ Identifiers that can refer to a stored column/metric in orderby.
+
+ The exact frozen value preserves dict-shaped adhoc references. The label
+ matches result keys sent by Table server pagination and labels accepted by
+ SQL query building for adhoc columns/metrics.
+ """
+ identifiers = {freeze_value(item)}
+ if label := _get_form_data_item_label(item, is_metric=is_metric):
+ identifiers.add(freeze_value(label))
+ return identifiers
+
+
+def _requested_sort_target_identifiers(item: Any) -> set[str]:
+ """
+ Identifiers a requested orderby term may use.
+
+ String terms are result keys. Dict-shaped terms carry expression bodies, so
+ they authorize only by exact stored identity and never by a reused label.
+ """
+ if isinstance(item, (str, dict)):
+ return {freeze_value(item)}
+ return set()
+
+
+def _add_visible_sort_targets(
+ allowed: set[str],
+ values: Any,
+ column_config: Any,
+ *,
+ is_metric: bool,
+) -> None:
+ """
+ Add visible column/metric orderby identifiers from a stored control value.
+ """
+ if not isinstance(values, (list, tuple)):
+ return
+ for value in values:
+ label = _get_form_data_item_label(value, is_metric=is_metric)
+ if label is not None and _is_hidden_table_column(column_config, label):
+ continue
+ allowed.update(_stored_sort_target_identifiers(value,
is_metric=is_metric))
+
+
def _collect_sortable_identifiers(
stored_chart: "Slice",
stored_query_context: Optional[dict[str, Any]],
) -> set[str]:
"""
- Frozen column names and metric labels/definitions a guest may legitimately
- sort by: every column or metric the stored chart already references.
-
- Order-by only changes the ordering of the result, not which data is read,
so
- any column or metric already part of the chart is a safe sort target. A
term
- that is not present in the stored chart (for example a free-form
``random()``
- expression) cannot be validated and must be rejected. Order-by entries are
- ``(column_or_metric, ascending)`` pairs, so only their first element is
- collected.
+ Identifiers a guest may use for a new sort target.
+
+ These are the visible columns/metrics the stored chart exposes. Exact
+ owner-defined orderby replay is handled separately because saved orderby
may
+ intentionally reference a non-visible helper term, while guest-initiated
+ sorting should be limited to visible result columns.
"""
allowed: set[str] = set()
+ params = stored_chart.params_dict
+ column_config = params.get("column_config")
+
+ for key in ("columns", "groupby", "all_columns"):
+ _add_visible_sort_targets(
+ allowed,
+ params.get(key),
+ column_config,
+ is_metric=False,
+ )
+ _add_visible_sort_targets(
+ allowed,
+ params.get("metrics"),
+ column_config,
+ is_metric=True,
+ )
+ # Legacy charts store a single metric under the singular ``metric`` key.
+ if params.get("metric") is not None:
+ _add_visible_sort_targets(
+ allowed,
+ [params["metric"]],
+ column_config,
+ is_metric=True,
+ )
+
+ if stored_query_context:
+ for query in stored_query_context.get("queries") or []:
+ for key in ("columns", "groupby", "all_columns"):
+ _add_visible_sort_targets(
+ allowed,
+ query.get(key),
+ column_config,
+ is_metric=False,
+ )
+ _add_visible_sort_targets(
+ allowed,
+ query.get("metrics"),
+ column_config,
+ is_metric=True,
+ )
+
+ return allowed
+
+
+def _collect_stored_orderby_entries(
+ stored_chart: "Slice",
+ stored_query_context: Optional[dict[str, Any]],
+) -> set[str]:
+ """
+ Frozen saved orderby entries a guest may replay exactly.
+ """
+ allowed = {
+ freeze_value(entry) for entry in
stored_chart.params_dict.get("orderby") or []
+ }
+ if stored_query_context:
+ for query in stored_query_context.get("queries") or []:
+ allowed.update(freeze_value(entry) for entry in
query.get("orderby") or [])
+ return allowed
+
+
+def _metric_control_values(value: Any) -> list[Any]:
+ """
+ Return non-empty values from a metric-valued control.
+ """
+ if value is None or value == "":
+ return []
+ if isinstance(value, (list, tuple)):
+ return [item for item in value if item is not None and item != ""]
+ return [value]
- def add(values: Any) -> None:
- for value in values or []:
- allowed.add(freeze_value(value))
- def add_orderby(entries: Any) -> None:
- for entry in entries or []:
- if isinstance(entry, (list, tuple)) and entry:
- allowed.add(freeze_value(entry[0]))
+def _add_frozen_metric_control_values(allowed: set[str], value: Any) -> None:
+ """
+ Add exact metric-control values to an authorization set.
+ """
+ allowed.update(freeze_value(metric) for metric in
_metric_control_values(value))
+
+def _collect_stored_series_limit_metric_identifiers(
+ stored_chart: "Slice",
+ stored_query_context: Optional[dict[str, Any]],
+) -> set[str]:
+ """
+ Exact metric selectors a guest may use for series limiting.
+ """
+ allowed: set[str] = set()
params = stored_chart.params_dict
- for key in ("columns", "groupby", "metrics", "all_columns"):
- add(params.get(key))
- # Legacy charts store a single metric under the singular ``metric`` key.
- add([params["metric"]] if params.get("metric") is not None else None)
- add_orderby(params.get("orderby"))
+
+ _add_frozen_metric_control_values(allowed, params.get("metrics"))
+ _add_frozen_metric_control_values(allowed, params.get("metric"))
+ for key in ("series_limit_metric", "timeseries_limit_metric"):
+ _add_frozen_metric_control_values(allowed, params.get(key))
if stored_query_context:
for query in stored_query_context.get("queries") or []:
- for key in ("columns", "groupby", "metrics", "all_columns"):
- add(query.get(key))
- add_orderby(query.get("orderby"))
+ _add_frozen_metric_control_values(allowed, query.get("metrics"))
+ for key in ("series_limit_metric", "timeseries_limit_metric"):
+ _add_frozen_metric_control_values(allowed, query.get(key))
return allowed
+def _series_limit_metric_value_modified(value: Any, allowed: set[str]) -> bool:
+ """
+ Whether a requested series-limit metric is absent from stored metric
controls.
+ """
+ for metric in _metric_control_values(value):
+ if not isinstance(metric, (str, dict)) or not metric:
+ return True
+ if freeze_value(metric) not in allowed:
+ return True
+ return False
+
+
+def _series_limit_metric_modified(
+ query_context: "QueryContext",
+ form_data: dict[str, Any],
+ stored_chart: "Slice",
+ stored_query_context: Optional[dict[str, Any]],
+) -> bool:
+ """
+ Whether series-limit metric selectors introduce a metric not stored on
chart.
+
+ Series limiting uses the selector to rank top-N groups, so guest requests
may
+ only reuse stored metric controls. Dict-shaped selectors must match
exactly;
+ labels are not an authorization key for expression objects.
+ """
+ allowed = _collect_stored_series_limit_metric_identifiers(
+ stored_chart,
+ stored_query_context,
+ )
Review Comment:
**Suggestion:** Annotate this local variable with its concrete type instead
of relying on inference in newly added logic. [custom_rule]
**Severity Level:** Minor ⚠️
<details>
<summary><b>Why it matters? 🤔 </b></summary>
This new local variable is unannotated even though its type is clear from
context (`set[str]`). The custom rule flags modified Python code that omits
type hints on variables that can be annotated.
</details>
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=d5e8fd35efb644aaab7ed7a9f50880ec&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=d5e8fd35efb644aaab7ed7a9f50880ec&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
*(Use Cmd/Ctrl + Click for best experience)*
<details>
<summary><b>Prompt for AI Agent 🤖 </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset/security/manager.py
**Line:** 738:741
**Comment:**
*Custom Rule: Annotate this local variable with its concrete type
instead of relying on inference in newly added logic.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=29fa054d85bfad0dacc1685b09a2c663dd5c87866a7f1a6c9d44933032036edb&reaction=like'>👍</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=29fa054d85bfad0dacc1685b09a2c663dd5c87866a7f1a6c9d44933032036edb&reaction=dislike'>👎</a>
##########
superset/security/manager.py:
##########
@@ -520,48 +530,240 @@ def _native_filter_request_modified(query_context:
"QueryContext") -> bool:
)
+def _get_form_data_item_label(item: Any, is_metric: bool) -> str | None:
+ """
+ Return the result-key label Superset uses for a column or metric
definition.
+ """
+ label: Any
+ try:
+ label = get_metric_name(item) if is_metric else get_column_name(item)
+ except (AttributeError, KeyError, TypeError, ValueError):
+ return None
+ return label if isinstance(label, str) and label else None
+
+
+def _is_hidden_table_column(column_config: Any, name: str) -> bool:
+ """
+ Whether Table column_config marks a result column as hidden.
+ """
+ config = column_config.get(name) if isinstance(column_config, dict) else
None
+ return isinstance(config, dict) and config.get("visible") is False
+
+
+def _stored_sort_target_identifiers(item: Any, is_metric: bool) -> set[str]:
+ """
+ Identifiers that can refer to a stored column/metric in orderby.
+
+ The exact frozen value preserves dict-shaped adhoc references. The label
+ matches result keys sent by Table server pagination and labels accepted by
+ SQL query building for adhoc columns/metrics.
+ """
+ identifiers = {freeze_value(item)}
+ if label := _get_form_data_item_label(item, is_metric=is_metric):
+ identifiers.add(freeze_value(label))
+ return identifiers
+
+
+def _requested_sort_target_identifiers(item: Any) -> set[str]:
+ """
+ Identifiers a requested orderby term may use.
+
+ String terms are result keys. Dict-shaped terms carry expression bodies, so
+ they authorize only by exact stored identity and never by a reused label.
+ """
+ if isinstance(item, (str, dict)):
+ return {freeze_value(item)}
+ return set()
+
+
+def _add_visible_sort_targets(
+ allowed: set[str],
+ values: Any,
+ column_config: Any,
+ *,
+ is_metric: bool,
+) -> None:
+ """
+ Add visible column/metric orderby identifiers from a stored control value.
+ """
+ if not isinstance(values, (list, tuple)):
+ return
+ for value in values:
+ label = _get_form_data_item_label(value, is_metric=is_metric)
+ if label is not None and _is_hidden_table_column(column_config, label):
+ continue
+ allowed.update(_stored_sort_target_identifiers(value,
is_metric=is_metric))
+
+
def _collect_sortable_identifiers(
stored_chart: "Slice",
stored_query_context: Optional[dict[str, Any]],
) -> set[str]:
"""
- Frozen column names and metric labels/definitions a guest may legitimately
- sort by: every column or metric the stored chart already references.
-
- Order-by only changes the ordering of the result, not which data is read,
so
- any column or metric already part of the chart is a safe sort target. A
term
- that is not present in the stored chart (for example a free-form
``random()``
- expression) cannot be validated and must be rejected. Order-by entries are
- ``(column_or_metric, ascending)`` pairs, so only their first element is
- collected.
+ Identifiers a guest may use for a new sort target.
+
+ These are the visible columns/metrics the stored chart exposes. Exact
+ owner-defined orderby replay is handled separately because saved orderby
may
+ intentionally reference a non-visible helper term, while guest-initiated
+ sorting should be limited to visible result columns.
"""
allowed: set[str] = set()
+ params = stored_chart.params_dict
+ column_config = params.get("column_config")
+
+ for key in ("columns", "groupby", "all_columns"):
+ _add_visible_sort_targets(
+ allowed,
+ params.get(key),
+ column_config,
+ is_metric=False,
+ )
+ _add_visible_sort_targets(
+ allowed,
+ params.get("metrics"),
+ column_config,
+ is_metric=True,
+ )
+ # Legacy charts store a single metric under the singular ``metric`` key.
+ if params.get("metric") is not None:
+ _add_visible_sort_targets(
+ allowed,
+ [params["metric"]],
+ column_config,
+ is_metric=True,
+ )
+
+ if stored_query_context:
+ for query in stored_query_context.get("queries") or []:
+ for key in ("columns", "groupby", "all_columns"):
+ _add_visible_sort_targets(
+ allowed,
+ query.get(key),
+ column_config,
+ is_metric=False,
+ )
+ _add_visible_sort_targets(
+ allowed,
+ query.get("metrics"),
+ column_config,
+ is_metric=True,
+ )
+
+ return allowed
+
+
+def _collect_stored_orderby_entries(
+ stored_chart: "Slice",
+ stored_query_context: Optional[dict[str, Any]],
+) -> set[str]:
+ """
+ Frozen saved orderby entries a guest may replay exactly.
+ """
+ allowed = {
+ freeze_value(entry) for entry in
stored_chart.params_dict.get("orderby") or []
+ }
Review Comment:
**Suggestion:** Add an explicit type annotation for this newly introduced
local set so the modified code fully complies with the type-hint requirement.
[custom_rule]
**Severity Level:** Minor ⚠️
<details>
<summary><b>Why it matters? 🤔 </b></summary>
This is newly added Python code, and the local set `allowed` is inferable
but not explicitly typed. That matches the custom rule requiring type hints on
relevant variables that can be annotated.
</details>
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=77097125f90d45da8590479716db9087&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=77097125f90d45da8590479716db9087&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
*(Use Cmd/Ctrl + Click for best experience)*
<details>
<summary><b>Prompt for AI Agent 🤖 </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset/security/manager.py
**Line:** 662:664
**Comment:**
*Custom Rule: Add an explicit type annotation for this newly introduced
local set so the modified code fully complies with the type-hint requirement.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=97e8b582d8e085cbeff8558aa9dac96e077a48c8b6fbb37774fe0ea0995556c0&reaction=like'>👍</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=97e8b582d8e085cbeff8558aa9dac96e077a48c8b6fbb37774fe0ea0995556c0&reaction=dislike'>👎</a>
##########
superset/security/manager.py:
##########
@@ -575,28 +777,35 @@ def _orderby_modified(
metrics is legitimate and must not read as tampering; introducing a new
expression is not, and is rejected.
"""
- allowed = _collect_sortable_identifiers(stored_chart, stored_query_context)
+ visible_targets = _collect_sortable_identifiers(stored_chart,
stored_query_context)
+ stored_orderby_entries = _collect_stored_orderby_entries(
+ stored_chart, stored_query_context
+ )
form_data = query_context.form_data or {}
# Both ``form_data`` and each ``QueryObject`` can carry an order-by, and in
# the common frontend path they carry the same one. Either source could
# smuggle an unauthorized term, so validate the union of both rather than
# trusting one over the other; the duplication is harmless.
- requested = list(form_data.get("orderby") or [])
+ form_orderby = form_data.get("orderby")
+ if form_orderby is not None and not isinstance(form_orderby, list):
+ return True
+ requested = list(form_orderby or [])
Review Comment:
**Suggestion:** Add a type annotation to this newly added local list
variable to satisfy the enforced type-hint rule for modified code. [custom_rule]
**Severity Level:** Minor ⚠️
<details>
<summary><b>Why it matters? 🤔 </b></summary>
This is a newly introduced local list in modified Python code and it lacks
an explicit type hint, so it violates the type-hint requirement.
</details>
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=5fd72981f91c42b8aa5b722bc7599cad&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=5fd72981f91c42b8aa5b722bc7599cad&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
*(Use Cmd/Ctrl + Click for best experience)*
<details>
<summary><b>Prompt for AI Agent 🤖 </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset/security/manager.py
**Line:** 792:792
**Comment:**
*Custom Rule: Add a type annotation to this newly added local list
variable to satisfy the enforced type-hint rule for modified code.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=de5b69cf7302450f34531bf8d924f5a1146ce696bcba014c83082273d49735a3&reaction=like'>👍</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=de5b69cf7302450f34531bf8d924f5a1146ce696bcba014c83082273d49735a3&reaction=dislike'>👎</a>
##########
tests/unit_tests/security/manager_test.py:
##########
@@ -1412,6 +1444,31 @@ def test_query_context_modified_time_grain_native_filter(
assert not query_context_modified(query_context)
+def test_query_context_modified_orderby_visible_column_allowed(
+ mocker: MockerFixture,
+) -> None:
+ """
+ Test that guest user can sort by a visible column (whitelist approach).
+ """
+ query_context = mocker.MagicMock()
Review Comment:
**Suggestion:** Add an explicit type annotation for this local mock context
variable to satisfy the type-hint requirement for relevant variables.
[custom_rule]
**Severity Level:** Minor ⚠️
<details>
<summary><b>Why it matters? 🤔 </b></summary>
This is a real violation of the type-hint rule: the new test helper and
several new test cases introduce local variables like `query_context` without
any annotation, even though they are relevant variables that can be annotated.
</details>
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=1d32ff307fe8499bb3696dc4973dd3fd&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=1d32ff307fe8499bb3696dc4973dd3fd&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
*(Use Cmd/Ctrl + Click for best experience)*
<details>
<summary><b>Prompt for AI Agent 🤖 </b></summary>
```mdx
This is a comment left during a code review.
**Path:** tests/unit_tests/security/manager_test.py
**Line:** 1453:1453
**Comment:**
*Custom Rule: Add an explicit type annotation for this local mock
context variable to satisfy the type-hint requirement for relevant variables.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=4102f21c91a6746f2d5ed6deed6fc424b89574b5fd0816f403f1108445615f56&reaction=like'>👍</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=4102f21c91a6746f2d5ed6deed6fc424b89574b5fd0816f403f1108445615f56&reaction=dislike'>👎</a>
##########
tests/unit_tests/models/helpers_test.py:
##########
@@ -2057,6 +2057,102 @@ def test_orderby_adhoc_column(database: Database) ->
None:
assert "ORDER BY" in sql.upper()
+def test_orderby_adhoc_column_label_takes_precedence_over_saved_metric(
+ database: Database,
+) -> None:
+ """
+ Test that orderby by an adhoc column label resolves to the selected column.
+ """
+ from superset.connectors.sqla.models import SqlaTable, SqlMetric,
TableColumn
+
+ table = SqlaTable(
Review Comment:
**Suggestion:** Add an explicit type annotation to `table` so the new test
keeps local variables typed consistently with the type-hint rule. [custom_rule]
**Severity Level:** Minor ⚠️
<details>
<summary><b>Why it matters? 🤔 </b></summary>
The new test introduces a local variable initialized with `SqlaTable(...)`
and leaves it unannotated. This is a newly added Python variable that can be
typed explicitly, so it matches the type-hint rule.
</details>
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=d808cf08c37f4dc2b3ed3cb5c5e01eeb&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=d808cf08c37f4dc2b3ed3cb5c5e01eeb&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
*(Use Cmd/Ctrl + Click for best experience)*
<details>
<summary><b>Prompt for AI Agent 🤖 </b></summary>
```mdx
This is a comment left during a code review.
**Path:** tests/unit_tests/models/helpers_test.py
**Line:** 2068:2068
**Comment:**
*Custom Rule: Add an explicit type annotation to `table` so the new
test keeps local variables typed consistently with the type-hint rule.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=8b092cf48a4a8069cd2abd1f0cf282b0af6237ce000f66f1ce9d01ae8d0b9fb6&reaction=like'>👍</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F37371&comment_hash=8b092cf48a4a8069cd2abd1f0cf282b0af6237ce000f66f1ce9d01ae8d0b9fb6&reaction=dislike'>👎</a>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]