This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new e029e420aef branch-2.1: [fix](nereids) fix calc repeat property stack
overflow #52159 (#52188)
e029e420aef is described below
commit e029e420aef65a3ef4b0bdf0478117642762ff60
Author: yujun <[email protected]>
AuthorDate: Sat Jun 28 10:22:48 2025 +0800
branch-2.1: [fix](nereids) fix calc repeat property stack overflow #52159
(#52188)
cherry pick from #52159
---
.../doris/nereids/trees/plans/algebra/Repeat.java | 4 +-
.../nereids_p0/test_repeat_no_stackflow.groovy | 429 +++++++++++++++++++++
2 files changed, 431 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Repeat.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Repeat.java
index 8925e597850..06a1c7d47ff 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Repeat.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Repeat.java
@@ -111,8 +111,8 @@ public interface Repeat<CHILD_PLAN extends Plan> extends
Aggregate<CHILD_PLAN> {
Iterator<List<Expression>> iterator = groupingSets.iterator();
Set<Expression> commonGroupingExpressions =
Sets.newLinkedHashSet(iterator.next());
while (iterator.hasNext()) {
- commonGroupingExpressions =
- Sets.intersection(commonGroupingExpressions,
Sets.newLinkedHashSet(iterator.next()));
+ commonGroupingExpressions =
Sets.intersection(commonGroupingExpressions,
+ Sets.newLinkedHashSet(iterator.next())).immutableCopy();
if (commonGroupingExpressions.isEmpty()) {
break;
}
diff --git a/regression-test/suites/nereids_p0/test_repeat_no_stackflow.groovy
b/regression-test/suites/nereids_p0/test_repeat_no_stackflow.groovy
new file mode 100644
index 00000000000..2e045237131
--- /dev/null
+++ b/regression-test/suites/nereids_p0/test_repeat_no_stackflow.groovy
@@ -0,0 +1,429 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite('test_repeat_no_stackflow') {
+ multi_sql '''
+ SET disable_nereids_rules="PRUNE_EMPTY_PARTITION";
+
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t1 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t2 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t3 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t4 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t5 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t6 FORCE;
+
+ CREATE TABLE `test_repeat_no_stackflow_t1` (
+ `id` int NOT NULL,
+ `agent_id` int NOT NULL,
+ `site_id` int NULL ,
+ `tdate` varchar(255) NOT NULL ,
+ `money` decimal(32,3) NOT NULL DEFAULT "0.000" ,
+ `monies` decimal(13,3) NOT NULL DEFAULT "0.000" ,
+ `account` decimal(13,3) NOT NULL DEFAULT "0.000" ,
+ `reward_cost` decimal(13,3) NOT NULL DEFAULT "0.000" ,
+ `finance_cost` decimal(13,3) NOT NULL DEFAULT "0.000" ,
+ `ad_type` tinyint NOT NULL ,
+ `agent_type` tinyint NULL ,
+ `pay_type` tinyint NOT NULL ,
+ `pay_date` varchar(255) NOT NULL,
+ `memo` text NULL,
+ `aorder` varchar(20) NULL,
+ `plat_id` tinyint NOT NULL DEFAULT "1",
+ `game_id` int NOT NULL DEFAULT "0",
+ `add_type` tinyint NOT NULL DEFAULT "0" ,
+ `company_id` tinyint NOT NULL DEFAULT "0",
+ `nature` tinyint NOT NULL DEFAULT "0" ,
+ `s_date` varchar(255) NOT NULL ,
+ `e_date` varchar(255) NOT NULL ,
+ `author` varchar(50) NULL ,
+ `game_sign` varchar(64) NOT NULL DEFAULT "" ,
+ `agent` varchar(64) NOT NULL DEFAULT "" ,
+ `media` varchar(64) NOT NULL DEFAULT "" ,
+ `company` varchar(16) NOT NULL DEFAULT "" ,
+ `company_type` varchar(16) NOT NULL DEFAULT "self" ,
+ `other` tinyint NOT NULL DEFAULT "0" ,
+ `is_delete` tinyint NOT NULL DEFAULT "0" ,
+ `created_at` varchar(255) NOT NULL,
+ `updated_at` varchar(255) NOT NULL
+) ENGINE=OLAP
+UNIQUE KEY(`id`)
+DISTRIBUTED BY HASH(`id`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+
+CREATE TABLE `test_repeat_no_stackflow_t2` (
+ `uid` varchar(255) NULL ,
+ `game_sign` varchar(255) NULL ,
+ `register_date` date NOT NULL ,
+ `agent_id` varchar(255) NULL ,
+ `site_id` varchar(255) NULL ,
+ `game_id` varchar(255) NULL ,
+ `guid` varchar(255) NOT NULL ,
+ `openid` text NULL,
+ `mobile_phone` varchar(255) NULL ,
+ `user_name` varchar(255) NULL ,
+ `imei` text NULL ,
+ `long_id` varchar(255) NULL ,
+ `mtype` varchar(30) NULL ,
+ `package` varchar(255) NULL ,
+ `reg_time` varchar(255) NULL ,
+ `logined` varchar(30) NULL ,
+ `reg_type` varchar(30) NULL ,
+ `os` varchar(20) NULL ,
+ `game_aweme_id` varchar(255) NULL ,
+ `match_type` varchar(30) NULL ,
+ `network` varchar(255) NULL ,
+ `idfv` text NULL ,
+ `system` varchar(255) NULL ,
+ `model` varchar(255) NULL ,
+ `come_back_user` varchar(10) NULL ,
+ `ip` varchar(255) NULL ,
+ `ipv6` varchar(255) NULL ,
+ `oaid` varchar(255) NULL ,
+ `adinfo` text NULL ,
+ `ad_device` text NULL ,
+ `wx_platform` varchar(255) NULL ,
+ `original_imei` varchar(255) NULL ,
+ `total_reg_num` varchar(255) NULL ,
+ `reg_hour` varchar(10) NOT NULL ,
+ `reg_date_hour` varchar(128) NOT NULL
+) ENGINE=OLAP
+UNIQUE KEY(`uid`, `game_sign`, `register_date`)
+DISTRIBUTED BY HASH(`uid`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+
+CREATE TABLE `test_repeat_no_stackflow_t3` (
+ `id` int NOT NULL,
+ `site_id` int NOT NULL DEFAULT "0" ,
+ `site_name` varchar(255) NOT NULL DEFAULT "" ,
+ `agent_id` int NOT NULL,
+ `plat` tinyint NOT NULL DEFAULT "0" ,
+ `plat_id` tinyint NOT NULL DEFAULT "1" ,
+ `chargeman` varchar(128) NOT NULL DEFAULT "" ,
+ `site_url` varchar(128) NULL DEFAULT "" ,
+ `https` tinyint NULL DEFAULT "0" ,
+ `channel` varchar(60) NOT NULL DEFAULT "" ,
+ `addtime` datetime NULL,
+ `edittime` datetime NULL,
+ `isdel` tinyint NOT NULL DEFAULT "0" ,
+ `is_remote` tinyint NOT NULL DEFAULT "0" ,
+ `convert_source_type` varchar(128) NOT NULL DEFAULT "" ,
+ `convert_toolkit` varchar(128) NOT NULL DEFAULT "" ,
+ `anchor_id` int NOT NULL DEFAULT "0" ,
+ `anchor_account` varchar(128) NOT NULL DEFAULT "" ,
+ `anchor_account_id` int NOT NULL DEFAULT "0" ,
+ `create_user` varchar(128) NULL DEFAULT "" ,
+ `update_user` varchar(128) NULL DEFAULT "" ,
+ `action_track_type` int NULL DEFAULT "0"
+) ENGINE=OLAP
+UNIQUE KEY(`id`)
+DISTRIBUTED BY HASH(`id`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+
+CREATE TABLE `test_repeat_no_stackflow_t4` (
+ `id` varchar(255) NULL ,
+ `agent_id` varchar(255) NULL ,
+ `agent_name` varchar(255) NULL ,
+ `group` varchar(255) NULL ,
+ `media` varchar(255) NULL ,
+ `agent` varchar(255) NULL ,
+ `plat_id` varchar(10) NULL ,
+ `reg_date` varchar(64) NULL ,
+ `chargeman` varchar(128) NULL ,
+ `agent_type` varchar(32) NULL ,
+ `department_id` varchar(255) NULL ,
+ `gr_agent_channel` varchar(64) NULL ,
+ `channel_client` varchar(64) NULL ,
+ `account_id` varchar(100) NULL ,
+ `top` varchar(10) NULL ,
+ `activity_at` varchar(64) NULL ,
+ `updated_time` varchar(64) NULL ,
+ `is_tw` varchar(10) NULL ,
+ `system` varchar(32) NULL ,
+ `subject` varchar(32) NULL ,
+ `gr_agent_remarks` text NULL ,
+ `agent_media_name` varchar(64) NULL ,
+ `description` varchar(255) NULL ,
+ `gr_agent_media_channel` varchar(32) NULL ,
+ `callback` varchar(32) NULL ,
+ `type` varchar(255) NULL ,
+ `hot` varchar(10) NULL ,
+ `default_media` varchar(3) NULL ,
+ `agent_channel_name` varchar(32) NULL ,
+ `gr_agent_channel_remarks` text NULL
+) ENGINE=OLAP
+UNIQUE KEY(`id`, `agent_id`)
+DISTRIBUTED BY HASH(`agent_id`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+
+CREATE TABLE `test_repeat_no_stackflow_t5` (
+ `game_id` varchar(255) NULL ,
+ `plat_id` varchar(20) NULL ,
+ `game_app_name` varchar(255) NULL ,
+ `game_sign` varchar(128) NULL ,
+ `game_name` varchar(255) NULL ,
+ `contract_name` varchar(255) NULL ,
+ `company_qualification` varchar(255) NULL ,
+ `system` varchar(64) NULL ,
+ `sync` varchar(10) NULL ,
+ `type` varchar(10) NULL ,
+ `game_product_id` varchar(32) NULL ,
+ `product_name` varchar(255) NULL ,
+ `core_play` varchar(32) NULL ,
+ `story_theme` varchar(32) NULL ,
+ `art_style` varchar(32) NULL ,
+ `contract_company` varchar(32) NULL ,
+ `state` varchar(10) NULL ,
+ `screen_type` varchar(10) NULL ,
+ `float_position` varchar(20) NULL ,
+ `is_open` varchar(10) NULL ,
+ `is_sync` varchar(10) NULL ,
+ `open_game` varchar(4) NULL ,
+ `app_name` varchar(256) NULL ,
+ `app_id` varchar(255) NULL ,
+ `release_state` varchar(10) NULL ,
+ `media_abbr` varchar(64) NULL ,
+ `os` varchar(10) NULL ,
+ `os_two` varchar(10) NULL ,
+ `game_version` varchar(20) NULL ,
+ `channel_show` varchar(10) NULL ,
+ `autologin` varchar(10) NULL ,
+ `relate_game` varchar(255) NULL ,
+ `discount` varchar(32) NULL ,
+ `disable_register` varchar(4) NULL ,
+ `disable_unrelated_login` varchar(4) NULL ,
+ `disable_related_back` varchar(4) NULL ,
+ `disable_back` varchar(4) NULL ,
+ `accept_related_game` varchar(20) NULL ,
+ `disable_pay` varchar(4) NULL ,
+ `tw_plat_id` varchar(4) NULL ,
+ `tw_os` varchar(4) NULL ,
+ `server_sign` varchar(32) NULL ,
+ `objective_id` varchar(32) NULL ,
+ `company_main` varchar(64) NULL ,
+ `business_purpose` varchar(4) NULL ,
+ `agent_sign` varchar(60) NULL ,
+ `icon` varchar(128) NULL ,
+ `package_name_id` varchar(30) NULL ,
+ `server_group_id` varchar(40) NULL ,
+ `client_type` varchar(10) NULL ,
+ `platform` varchar(10) NULL
+) ENGINE=OLAP
+UNIQUE KEY(`game_id`, `plat_id`)
+DISTRIBUTED BY HASH(`game_id`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+
+CREATE TABLE `test_repeat_no_stackflow_t6` (
+ `id` int NOT NULL ,
+ `abbr` varchar(64) NOT NULL ,
+ `name` varchar(64) NOT NULL ,
+ `desc` varchar(255) NULL ,
+ `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ,
+ `created_user` varchar(64) NULL ,
+ `update_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ,
+ `update_user` varchar(64) NULL ,
+ `hot` tinyint NULL ,
+ `usage_status` tinyint NULL DEFAULT "1"
+) ENGINE=OLAP
+UNIQUE KEY(`id`)
+DISTRIBUTED BY HASH(`id`) BUCKETS 10
+PROPERTIES (
+"replication_num" = "1",
+"is_being_synced" = "false",
+"storage_medium" = "hdd",
+"storage_format" = "V2",
+"inverted_index_storage_format" = "V2",
+"enable_unique_key_merge_on_write" = "true",
+"light_schema_change" = "true",
+"disable_auto_compaction" = "false",
+"enable_single_replica_compaction" = "false",
+"group_commit_interval_ms" = "10000",
+"group_commit_data_bytes" = "134217728",
+"enable_mow_light_delete" = "false"
+);
+ '''
+
+ // the logical repeat had a long set intersection chain,
+ // need convert set intersection's result SetView to Set,
+ // otherwise it will cause stackoverflow
+ sql """ explain
+ SELECT
+ agent_dims.game_id,
+ cj.`system`,
+ cj.game_sign,
+ cj.os,
+ cj.os_two,
+ ci.account_id,
+ ci.media,
+ ci.gr_agent_media_channel,
+ cj.game_product_id,
+ ck.site_name,
+ ci.chargeman,
+ agent_dims.agent_id,
+ agent_dims.site_id,
+ ck.anchor_id,
+ cl.abbr,
+ SUM(agent_dims.total_money) AS total_cost,
+ SUM(user_guid_reg_real.guid) AS total_reg_users,
+ CASE
+ WHEN SUM(user_guid_reg_real.guid) = 0 OR SUM(user_guid_reg_real.guid)
IS NULL THEN 0
+ ELSE ROUND(SUM(agent_dims.total_money) /
NULLIF(SUM(user_guid_reg_real.guid), 0), 2)
+ END AS reg_cost
+FROM (
+ SELECT
+ `site_id`,
+ `game_id`,
+ `agent_id`,
+ `game_sign`,
+ tdate,
+ COUNT(1),
+ SUM(`money`) AS total_money
+ FROM test_repeat_no_stackflow_t1
+ WHERE tdate BETWEEN '2025-05-01' AND '2025-05-01'
+ GROUP BY
+ `site_id`,
+ `game_id`,
+ `agent_id`,
+ `game_sign`,
+ tdate
+) AS agent_dims
+LEFT JOIN (
+ SELECT
+ `site_id`,
+ `game_id`,
+ `agent_id`,
+ `game_sign`,
+ register_date,
+ COUNT(DISTINCT guid) AS guid
+ FROM test_repeat_no_stackflow_t2
+ WHERE `register_date` BETWEEN '2025-05-01' AND '2025-05-01'
+ GROUP BY
+ `site_id`,
+ `game_id`,
+ `agent_id`,
+ `game_sign`,
+ register_date
+) AS user_guid_reg_real
+ ON agent_dims.game_id = user_guid_reg_real.game_id
+ AND agent_dims.game_sign = user_guid_reg_real.game_sign
+ AND agent_dims.agent_id = user_guid_reg_real.agent_id
+ AND agent_dims.site_id = user_guid_reg_real.site_id
+ AND agent_dims.tdate = user_guid_reg_real.register_date
+LEFT JOIN `test_repeat_no_stackflow_t3` ck
+ ON agent_dims.site_id = ck.site_id
+LEFT JOIN `test_repeat_no_stackflow_t4` ci
+ ON agent_dims.agent_id = ci.agent_id
+LEFT JOIN `test_repeat_no_stackflow_t5` cj
+ ON agent_dims.game_id = cj.game_id
+LEFT JOIN `test_repeat_no_stackflow_t6` cl
+ ON ci.agent = cl.abbr
+WHERE
+ agent_dims.game_id = '3706'
+ AND agent_dims.site_id = '5100814'
+GROUP BY
+ CUBE(
+ agent_dims.game_id,
+ cj.`system`,
+ cj.game_sign,
+ cj.os,
+ cj.os_two,
+ ci.account_id,
+ ci.media,
+ ci.gr_agent_media_channel,
+ cj.game_product_id,
+ ck.site_name,
+ ci.chargeman,
+ agent_dims.agent_id,
+ agent_dims.site_id,
+ ck.anchor_id,
+ cl.abbr
+ );
+ """
+
+ multi_sql '''
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t1 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t2 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t3 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t4 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t5 FORCE;
+ DROP TABLE IF EXISTS test_repeat_no_stackflow_t6 FORCE;
+ '''
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]