This is an automated email from the ASF dual-hosted git repository.

eschutho pushed a commit to branch 
fix/backport-query-object-factory-deprecated-fields
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 6ee8fd1d3bfc60104389000c19870277d280e99d
Author: Elizabeth Thompson <[email protected]>
AuthorDate: Sat Jul 25 18:06:45 2026 +0000

    fix(query_object_factory): preserve truthy-override precedence for 
deprecated fields
    
    setdefault() let an already-present canonical field win over a truthy
    deprecated value, reversing QueryObject._rename_deprecated_fields's
    historical precedence (deprecated value always overrides when truthy).
    That's what test_time_offsets_accuracy and
    test_time_offsets_in_query_object_no_limit were catching in CI.
    
    Per richardfogaca's review.
---
 superset/common/query_object_factory.py              | 4 +++-
 tests/unit_tests/common/test_query_object_factory.py | 7 ++++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/superset/common/query_object_factory.py 
b/superset/common/query_object_factory.py
index ffd282b210b..e8f5ca544a0 100644
--- a/superset/common/query_object_factory.py
+++ b/superset/common/query_object_factory.py
@@ -68,9 +68,11 @@ class QueryObjectFactory:  # pylint: 
disable=too-few-public-methods
 
         # Rename deprecated kwargs before any processing so that downstream 
code
         # (time-range resolution, QueryObject) only ever sees the canonical 
names.
+        # A truthy deprecated value always overrides the canonical field, 
matching
+        # the historical QueryObject._rename_deprecated_fields precedence.
         for field in DEPRECATED_FIELDS:
             if old_val := kwargs.pop(field.old_name, None):
-                kwargs.setdefault(field.new_name, old_val)
+                kwargs[field.new_name] = old_val
 
         # Process row limit taking server pagination into account
         row_limit = self._process_row_limit(
diff --git a/tests/unit_tests/common/test_query_object_factory.py 
b/tests/unit_tests/common/test_query_object_factory.py
index 9202f1f722f..52ca86ef52d 100644
--- a/tests/unit_tests/common/test_query_object_factory.py
+++ b/tests/unit_tests/common/test_query_object_factory.py
@@ -154,19 +154,20 @@ class TestQueryObjectFactory:
         assert query_object.columns == ["name", "gender"]
         assert not hasattr(query_object, "groupby")
 
-    def test_deprecated_groupby_does_not_overwrite_columns(
+    def test_deprecated_groupby_overwrites_columns(
         self,
         query_object_factory: QueryObjectFactory,
         raw_query_context: dict[str, Any],
     ):
-        """When both groupby and columns are present, columns takes 
precedence."""
+        """A truthy deprecated groupby overrides an already-present columns,
+        matching the historical QueryObject._rename_deprecated_fields 
precedence."""
         raw_query_object = raw_query_context["queries"][0]
         raw_query_object["columns"] = ["state"]
         raw_query_object["groupby"] = ["name", "gender"]
         query_object = query_object_factory.create(
             raw_query_context["result_type"], **raw_query_object
         )
-        assert query_object.columns == ["state"]
+        assert query_object.columns == ["name", "gender"]
 
     def test_deprecated_groupby_empty_list_is_ignored(
         self,

Reply via email to