)]}'
{
  "commit": "5fe87f46dbb4f69d44d92e478c911c730020e1a3",
  "tree": "745f18be50cf222735e7116fa4ff1e391064a9cf",
  "parents": [
    "f39a88add26326827c9ec3cf8e06383ebc1262ec"
  ],
  "author": {
    "name": "Mryange",
    "email": "yanxuecheng@selectdb.com",
    "time": "Mon Sep 21 16:31:14 2026 +0800"
  },
  "committer": {
    "name": "englefly",
    "email": "zhouminghong@selectdb.com",
    "time": "Tue Sep 22 14:43:55 2026 +0800"
  },
  "message": "[improvement](fe) Skip Group Join without aggregate functions\n\n### What problem does this PR solve?\n\nIssue Number: None\n\nRelated PR: None\n\nProblem Summary: Pure GROUP BY and DISTINCT queries could be fused into Group Join even though they contain no aggregate functions. The current Group Join execution path still pays its entry and count maintenance costs for this shape and can regress high-cardinality queries. Keep these queries on the regular HashJoin plus Aggregate plan, and add a BE validation guard against malformed Group Join nodes with no aggregate functions.\n\n### Release note\n\nPure GROUP BY and DISTINCT queries no longer use Group Join fusion.\n\n### Check List (For Author)\n\n- Test: Regression test / Unit Test / Manual test\n    - Release BE build\n    - FE build and Checkstyle\n    - GroupJoinOperatorUtilsTest\n    - test_group_join_no_agg\n    - test_group_join_fusion_rf\n    - test_group_join_build_distribution\n- Behavior changed: Yes, Group Join fusion now requires at least one aggregate function\n- Does this need documentation: No\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "55c9e0a5e135738c09a99e66bf350ce9229e3c84",
      "old_mode": 33188,
      "old_path": "be/src/exec/operator/groupjoin_operator_utils.cpp",
      "new_id": "2b7951780cbfc0f578f8dc7919767b380a18cd48",
      "new_mode": 33188,
      "new_path": "be/src/exec/operator/groupjoin_operator_utils.cpp"
    },
    {
      "type": "modify",
      "old_id": "a70768564e68ab2cec97f06d3594fbe8584292ad",
      "old_mode": 33188,
      "old_path": "be/test/exec/operator/groupjoin_operator_utils_test.cpp",
      "new_id": "954c5d5bfa6cdc464ba2610d518dfb78b24a0671",
      "new_mode": 33188,
      "new_path": "be/test/exec/operator/groupjoin_operator_utils_test.cpp"
    },
    {
      "type": "modify",
      "old_id": "81903f6847c54e27f4703725e92cd6a7d919b221",
      "old_mode": 33188,
      "old_path": "fe/fe-core/src/main/java/org/apache/doris/nereids/util/GroupJoinFusionUtils.java",
      "new_id": "fb7f6c905d9089e73e9333b4891045a823ac2c74",
      "new_mode": 33188,
      "new_path": "fe/fe-core/src/main/java/org/apache/doris/nereids/util/GroupJoinFusionUtils.java"
    },
    {
      "type": "modify",
      "old_id": "5e07b1969c9715445a695260f687590933be1d2f",
      "old_mode": 33188,
      "old_path": "regression-test/suites/group_join_fusion_p0/test_group_join_build_distribution.groovy",
      "new_id": "2a7e5c021b9b43d6290198615d31b0789045926d",
      "new_mode": 33188,
      "new_path": "regression-test/suites/group_join_fusion_p0/test_group_join_build_distribution.groovy"
    },
    {
      "type": "modify",
      "old_id": "7e403ea9bc35280fd7bcb21b2ce441d2f0f4c4fc",
      "old_mode": 33188,
      "old_path": "regression-test/suites/group_join_fusion_p0/test_group_join_fusion_rf.groovy",
      "new_id": "9e6ef5b5ea424069b8793c792ce31b329fbd8535",
      "new_mode": 33188,
      "new_path": "regression-test/suites/group_join_fusion_p0/test_group_join_fusion_rf.groovy"
    },
    {
      "type": "modify",
      "old_id": "8c3734f7be78e930a5bc623af7d19026fb5ff7de",
      "old_mode": 33188,
      "old_path": "regression-test/suites/group_join_fusion_p0/test_group_join_no_agg.groovy",
      "new_id": "5523314aacf72a0c7713a0a571e5f57a47e553b6",
      "new_mode": 33188,
      "new_path": "regression-test/suites/group_join_fusion_p0/test_group_join_no_agg.groovy"
    }
  ]
}
