From a87ff1d5d654e8fd27a4ef34f6d30e1e1e916241 Mon Sep 17 00:00:00 2001 From: yinyj17 Date: Mon, 14 Oct 2024 05:17:00 +0000 Subject: [PATCH] fix shared expr allocation bug --- src/sql/optimizer/ob_log_del_upd.cpp | 16 ++++-- src/sql/optimizer/ob_log_del_upd.h | 5 +- src/sql/optimizer/ob_log_delete.cpp | 9 ++++ src/sql/optimizer/ob_log_delete.h | 1 + src/sql/optimizer/ob_log_exchange.cpp | 22 ++++++-- src/sql/optimizer/ob_log_group_by.cpp | 5 +- src/sql/optimizer/ob_log_insert.cpp | 17 ++++++ src/sql/optimizer/ob_log_insert.h | 1 + src/sql/optimizer/ob_log_join.cpp | 33 +++++++++++- src/sql/optimizer/ob_log_join.h | 1 + src/sql/optimizer/ob_log_merge.cpp | 17 ++++++ src/sql/optimizer/ob_log_merge.h | 1 + src/sql/optimizer/ob_log_update.cpp | 9 ++++ src/sql/optimizer/ob_log_update.h | 1 + src/sql/optimizer/ob_log_window_function.cpp | 2 +- src/sql/optimizer/ob_logical_operator.cpp | 54 ++++++++----------- src/sql/optimizer/ob_logical_operator.h | 3 +- tools/deploy/mysql_test/r/mysql/topk.result | 30 +++++------ .../subquery/r/mysql/subquery.result | 4 +- 19 files changed, 166 insertions(+), 65 deletions(-) diff --git a/src/sql/optimizer/ob_log_del_upd.cpp b/src/sql/optimizer/ob_log_del_upd.cpp index c891692f2..92b854654 100644 --- a/src/sql/optimizer/ob_log_del_upd.cpp +++ b/src/sql/optimizer/ob_log_del_upd.cpp @@ -1696,15 +1696,21 @@ int ObLogDelUpd::print_used_hint(PlanText &plan_text) return ret; } -int ObLogDelUpd::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +int ObLogDelUpd::is_dml_fixed_expr(const ObRawExpr *expr, + const ObIArray &index_dml_infos, + bool &is_fixed) { int ret = OB_SUCCESS; - const ObIArray &index_dml_infos = get_index_dml_infos(); + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } for (int64_t i = 0; OB_SUCC(ret) && !is_fixed && i < index_dml_infos.count(); ++i) { - if (OB_ISNULL(index_dml_infos.at(i))) { + const IndexDMLInfo *index_dml_info = index_dml_infos.at(i); + if (OB_ISNULL(index_dml_info)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("index dml info is null", K(ret)); - } else if (OB_FAIL(index_dml_infos.at(i)->is_new_row_expr(expr, is_fixed))) { + LOG_WARN("get unexpected null", K(ret)); + } else if (OB_FAIL(index_dml_info->is_new_row_expr(expr, is_fixed))) { LOG_WARN("failed to check is new row expr", K(ret)); } } diff --git a/src/sql/optimizer/ob_log_del_upd.h b/src/sql/optimizer/ob_log_del_upd.h index 5b76641e5..fadbe18e0 100644 --- a/src/sql/optimizer/ob_log_del_upd.h +++ b/src/sql/optimizer/ob_log_del_upd.h @@ -335,7 +335,7 @@ public: int replace_dml_info_exprs( ObRawExprReplacer &replacer, const ObIArray &index_dml_infos); - virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override = 0; virtual int check_use_child_ordering(bool &used, int64_t &inherit_child_ordering_index)override; protected: virtual int generate_rowid_expr_for_trigger() = 0; @@ -359,6 +359,9 @@ protected: const ObIArray &dml_new_values, ObRawExpr *cur_value, ObRawExpr *&new_value); + int is_dml_fixed_expr(const ObRawExpr *expr, + const ObIArray &index_dml_infos, + bool &is_fixed); static int get_update_exprs(const IndexDMLInfo &dml_info, ObIArray &dml_columns, diff --git a/src/sql/optimizer/ob_log_delete.cpp b/src/sql/optimizer/ob_log_delete.cpp index 691678c0a..4cf222e84 100644 --- a/src/sql/optimizer/ob_log_delete.cpp +++ b/src/sql/optimizer/ob_log_delete.cpp @@ -111,6 +111,15 @@ int ObLogDelete::get_op_exprs(ObIArray &all_exprs) return ret; } +int ObLogDelete::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(is_dml_fixed_expr(expr, get_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } + return ret; +} + int ObLogDelete::generate_multi_part_partition_id_expr() { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_delete.h b/src/sql/optimizer/ob_log_delete.h index 5d84e4a77..868663140 100644 --- a/src/sql/optimizer/ob_log_delete.h +++ b/src/sql/optimizer/ob_log_delete.h @@ -31,6 +31,7 @@ public: virtual int do_re_est_cost(EstimateCostInfo ¶m, double &card, double &op_cost, double &cost) override; int inner_est_cost(double child_card, double &op_cost); virtual int get_op_exprs(ObIArray &all_exprs) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; virtual const char *get_name() const; virtual int get_plan_item_info(PlanText &plan_text, ObSqlPlanItem &plan_item) override; diff --git a/src/sql/optimizer/ob_log_exchange.cpp b/src/sql/optimizer/ob_log_exchange.cpp index aae4841e5..67d6239f0 100644 --- a/src/sql/optimizer/ob_log_exchange.cpp +++ b/src/sql/optimizer/ob_log_exchange.cpp @@ -1043,10 +1043,24 @@ int ObLogExchange::allocate_startup_expr_post() int ObLogExchange::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) { int ret = OB_SUCCESS; - is_fixed = expr == calc_part_id_expr_ || - expr == partition_id_expr_ || - expr == ddl_slice_id_expr_ || - expr == random_expr_; + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else { + is_fixed = expr == calc_part_id_expr_ || + expr == partition_id_expr_ || + expr == ddl_slice_id_expr_ || + expr == random_expr_ || + T_OP_OUTPUT_PACK == expr->get_expr_type(); + for (int64_t i = 0; OB_SUCC(ret) && !is_fixed && i < hash_dist_exprs_.count(); i++) { + if (OB_ISNULL(hash_dist_exprs_.at(i).expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else { + is_fixed = expr == hash_dist_exprs_.at(i).expr_; + } + } + } return OB_SUCCESS; } diff --git a/src/sql/optimizer/ob_log_group_by.cpp b/src/sql/optimizer/ob_log_group_by.cpp index 49df0d1b5..831ee3122 100644 --- a/src/sql/optimizer/ob_log_group_by.cpp +++ b/src/sql/optimizer/ob_log_group_by.cpp @@ -879,7 +879,10 @@ int ObLogGroupBy::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) LOG_WARN("unexpected null", K(ret)); } else { is_fixed = ObOptimizerUtil::find_item(aggr_exprs_, expr) || - (T_FUN_SYS_REMOVE_CONST == expr->get_expr_type() && ObOptimizerUtil::find_item(rollup_exprs_, expr)); + ObOptimizerUtil::find_item(rollup_exprs_, expr) || + expr == three_stage_info_.aggr_code_expr_ || + expr == rollup_adaptive_info_.rollup_id_expr_ || + (is_first_stage() && T_PSEUDO_DUP_EXPR == expr->get_expr_type()); } return ret; } diff --git a/src/sql/optimizer/ob_log_insert.cpp b/src/sql/optimizer/ob_log_insert.cpp index ef8f571fb..6cc13fe94 100644 --- a/src/sql/optimizer/ob_log_insert.cpp +++ b/src/sql/optimizer/ob_log_insert.cpp @@ -181,6 +181,23 @@ int ObLogInsert::get_op_exprs(ObIArray &all_exprs) return ret; } +int ObLogInsert::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(is_dml_fixed_expr(expr, get_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } else if (is_fixed) { + // do nothing + } else if (OB_FAIL(is_dml_fixed_expr(expr, get_replace_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } else if (is_fixed) { + // do nothing + } else if (OB_FAIL(is_dml_fixed_expr(expr, get_insert_up_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } + return ret; +} + int ObLogInsert::compute_sharding_info() { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_insert.h b/src/sql/optimizer/ob_log_insert.h index 1bcd93fe8..47714ac94 100644 --- a/src/sql/optimizer/ob_log_insert.h +++ b/src/sql/optimizer/ob_log_insert.h @@ -59,6 +59,7 @@ public: return is_overwrite_; } virtual int get_op_exprs(ObIArray &all_exprs) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; void set_insert_up(bool insert_up) { insert_up_ = insert_up; diff --git a/src/sql/optimizer/ob_log_join.cpp b/src/sql/optimizer/ob_log_join.cpp index ef1ccc195..7e2eafbf9 100644 --- a/src/sql/optimizer/ob_log_join.cpp +++ b/src/sql/optimizer/ob_log_join.cpp @@ -1552,4 +1552,35 @@ int ObLogJoin::check_use_child_ordering(bool &used, int64_t &inherit_child_order inherit_child_ordering_index = first_child; } return ret; -} \ No newline at end of file +} + +int ObLogJoin::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +{ + int ret = OB_SUCCESS; + ObLogicalOperator *left_child = NULL; + ObLogicalOperator *right_child = NULL; + is_fixed = false; + if (OB_ISNULL(expr) || + OB_ISNULL(left_child = get_child(first_child)) || + OB_ISNULL(right_child = get_child(second_child))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else if (LEFT_OUTER_JOIN == join_type_) { + is_fixed = expr->get_relation_ids().overlap(right_child->get_table_set()); + } else if (RIGHT_OUTER_JOIN == join_type_) { + is_fixed = expr->get_relation_ids().overlap(left_child->get_table_set()); + } else if (FULL_OUTER_JOIN == join_type_) { + is_fixed = expr->get_relation_ids().overlap(left_child->get_table_set()) || + expr->get_relation_ids().overlap(right_child->get_table_set()); + } else if (CONNECT_BY_JOIN == join_type_) { + is_fixed = ObOptimizerUtil::find_item(connect_by_root_exprs_, expr) || + ObOptimizerUtil::find_item(sys_connect_by_path_exprs_, expr) || + ObOptimizerUtil::find_item(prior_exprs_, expr) || + ObOptimizerUtil::find_item(connect_by_pseudo_columns_, expr) || + ObOptimizerUtil::find_item(connect_by_prior_exprs_, expr) || + ObOptimizerUtil::find_item(connect_by_extra_exprs_, expr); + } else { + // do nothing for inner/semi/anti join + } + return ret; +} diff --git a/src/sql/optimizer/ob_log_join.h b/src/sql/optimizer/ob_log_join.h index a6b3c1d7e..4df48201d 100644 --- a/src/sql/optimizer/ob_log_join.h +++ b/src/sql/optimizer/ob_log_join.h @@ -197,6 +197,7 @@ namespace sql // 左侧的 GI 看到这个 partition id 后会以 producer 的身份生成列 int generate_join_partition_id_expr(); virtual int get_op_exprs(ObIArray &all_exprs) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; int get_connect_by_exprs(ObIArray &all_exprs); virtual int allocate_granule_post(AllocGIContext &ctx) override; virtual int allocate_granule_pre(AllocGIContext &ctx) override; diff --git a/src/sql/optimizer/ob_log_merge.cpp b/src/sql/optimizer/ob_log_merge.cpp index c0c3fb55c..e892f5168 100644 --- a/src/sql/optimizer/ob_log_merge.cpp +++ b/src/sql/optimizer/ob_log_merge.cpp @@ -144,6 +144,23 @@ int ObLogMerge::get_op_exprs(ObIArray &all_exprs) return ret; } +int ObLogMerge::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(is_dml_fixed_expr(expr, get_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } else if (is_fixed) { + // do nothing + } else if (OB_FAIL(is_dml_fixed_expr(expr, get_update_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } else if (is_fixed) { + // do nothing + } else if (OB_FAIL(is_dml_fixed_expr(expr, get_delete_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } + return ret; +} + int ObLogMerge::get_modified_index_id(common::ObIArray &index_tids) { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_merge.h b/src/sql/optimizer/ob_log_merge.h index 986c62ba4..7e00374d8 100644 --- a/src/sql/optimizer/ob_log_merge.h +++ b/src/sql/optimizer/ob_log_merge.h @@ -29,6 +29,7 @@ public: { } virtual ~ObLogMerge() {} virtual int get_op_exprs(ObIArray &all_exprs) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; virtual int compute_sharding_info() override; const common::ObIArray &get_insert_condition() const; diff --git a/src/sql/optimizer/ob_log_update.cpp b/src/sql/optimizer/ob_log_update.cpp index f8b02c3c0..1776350bb 100644 --- a/src/sql/optimizer/ob_log_update.cpp +++ b/src/sql/optimizer/ob_log_update.cpp @@ -110,6 +110,15 @@ int ObLogUpdate::get_op_exprs(ObIArray &all_exprs) return ret; } +int ObLogUpdate::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(is_dml_fixed_expr(expr, get_index_dml_infos(), is_fixed))) { + LOG_WARN("failed to check is my fixed expr", K(ret)); + } + return ret; +} + int ObLogUpdate::est_cost() { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_update.h b/src/sql/optimizer/ob_log_update.h index e522aad3f..015ad0c7f 100644 --- a/src/sql/optimizer/ob_log_update.h +++ b/src/sql/optimizer/ob_log_update.h @@ -30,6 +30,7 @@ public: virtual int do_re_est_cost(EstimateCostInfo ¶m, double &card, double &op_cost, double &cost) override; int inner_est_cost(double child_card, double &op_cost); virtual int get_op_exprs(ObIArray &all_exprs) override; + virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override; virtual const char *get_name() const override; virtual int get_plan_item_info(PlanText &plan_text, ObSqlPlanItem &plan_item) override; diff --git a/src/sql/optimizer/ob_log_window_function.cpp b/src/sql/optimizer/ob_log_window_function.cpp index 981e0efa5..b4437f02c 100644 --- a/src/sql/optimizer/ob_log_window_function.cpp +++ b/src/sql/optimizer/ob_log_window_function.cpp @@ -675,7 +675,7 @@ int ObLogWindowFunction::get_rd_sort_keys(common::ObIArray &rd_sort_k int ObLogWindowFunction::is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) { - is_fixed = ObOptimizerUtil::find_item(win_exprs_, expr); + is_fixed = ObOptimizerUtil::find_item(win_exprs_, expr) || expr == wf_aggr_status_expr_; return OB_SUCCESS; } diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index fa2bb3217..03d73935f 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -1840,8 +1840,6 @@ int ObLogicalOperator::allocate_expr_pre(ObAllocExprContext &ctx) LOG_WARN("failed to extract const exprs", K(ret)); } else if (OB_FAIL(add_exprs_to_ctx(ctx, op_exprs_))) { LOG_WARN("failed to add exprs to ctx", K(ret)); - } else if (OB_FAIL(force_pushdown_exprs(ctx))) { - LOG_WARN("failed to pushdown exprs", K(ret)); } else { LOG_TRACE("succeed to allocate expr pre", K(id_), K(op_exprs_.count()), K(op_exprs_), K(get_name()), K(is_plan_root())); @@ -2242,20 +2240,28 @@ int ObLogicalOperator::find_producer_id_for_shared_expr(const ObRawExpr *expr, } // check whether need pushdown expr according to the plan tree structure -int ObLogicalOperator::check_need_pushdown_expr(const bool producer_id, +int ObLogicalOperator::check_need_pushdown_expr(const uint64_t producer_id, bool &need_pushdown) { int ret = OB_SUCCESS; - need_pushdown = true; + need_pushdown = false; if (producer_id < id_ ) { - need_pushdown = false; + // do nothing } else if (child_.empty()) { - need_pushdown = false; - } else if (OB_ISNULL(child_.at(0))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } else if (child_.at(0)->is_expr_operator()) { - need_pushdown = false; + // do nothing + } else if (ObLogOpType::LOG_GROUP_BY == get_type() || + ObLogOpType::LOG_SORT == get_type() || + ObLogOpType::LOG_JOIN == get_type() || + ObLogOpType::LOG_DISTINCT == get_type() || + ObLogOpType::LOG_UPDATE == get_type() || + ObLogOpType::LOG_DELETE == get_type() || + ObLogOpType::LOG_INSERT == get_type() || + ObLogOpType::LOG_WINDOW_FUNCTION == get_type() || + ObLogOpType::LOG_SELECT_INTO == get_type() || + ObLogOpType::LOG_TOPK == get_type() || + ObLogOpType::LOG_COUNT == get_type() || + ObLogOpType::LOG_MERGE == get_type()) { + need_pushdown = true; } return ret; } @@ -2272,6 +2278,8 @@ int ObLogicalOperator::check_can_pushdown_expr(const ObRawExpr *expr, LOG_WARN("unexpected null expr", K(ret)); } else if (expr->is_const_expr()) { // do nothing + } else if (child_.count() > 1 && expr->has_flag(CNT_OP_PSEUDO_COLUMN)) { + // do nothing, I have no idea to pushdown the op pseudo column into which child op } else if (OB_FAIL(contain_my_fixed_expr(expr, is_contain))) { LOG_WARN("failed to check contain my fixed expr", K(ret)); } else if (!is_contain) { @@ -2305,28 +2313,6 @@ int ObLogicalOperator::contain_my_fixed_expr(const ObRawExpr *expr, return ret; } -int ObLogicalOperator::force_pushdown_exprs(ObAllocExprContext &ctx) -{ - int ret = OB_SUCCESS; - if (ObLogOpType::LOG_SORT != get_type()) { - // do nothing - } else { - ObSEArray exprs; - uint64_t producer_id = OB_INVALID_ID; - if (OB_FAIL(static_cast(this)->get_sort_exprs(exprs))) { - LOG_WARN("failed to get sort exprs", K(ret)); - } else if (OB_FAIL(get_pushdown_producer_id(producer_id))) { - LOG_WARN("failed to get pushdown producer id", K(ret)); - } else if (OB_INVALID_ID == producer_id) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unable to get pushdown producer id", K(producer_id), K(ret)); - } else if (OB_FAIL(add_exprs_to_ctx(ctx, exprs, producer_id))) { - LOG_WARN("failed to add exprs to ctx"); - } - } - return ret; -} - int ObLogicalOperator::get_pushdown_producer_id(const ObRawExpr *expr, uint64_t &producer_id) { int ret = OB_SUCCESS; @@ -2341,6 +2327,8 @@ int ObLogicalOperator::get_pushdown_producer_id(const ObRawExpr *expr, uint64_t if (OB_ISNULL(node)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null child op", K(ret)); + } else if (node->is_expr_operator()) { + // do nothing } else if (!expr->get_relation_ids().is_subset(node->get_table_set())) { // do nothing } else if (OB_FAIL(get_next_producer_id(node, producer_id))) { diff --git a/src/sql/optimizer/ob_logical_operator.h b/src/sql/optimizer/ob_logical_operator.h index 62d41795a..52f1218d8 100644 --- a/src/sql/optimizer/ob_logical_operator.h +++ b/src/sql/optimizer/ob_logical_operator.h @@ -1249,12 +1249,11 @@ public: int extract_non_const_exprs(const ObIArray &input_exprs, ObIArray &non_const_exprs); - int check_need_pushdown_expr(const bool producer_id, + int check_need_pushdown_expr(const uint64_t producer_id, bool &need_pushdown); int check_can_pushdown_expr(const ObRawExpr *expr, bool &can_pushdown); int get_pushdown_producer_id(const ObRawExpr *expr, uint64_t &producer_id); - int force_pushdown_exprs(ObAllocExprContext &ctx); int get_pushdown_producer_id(uint64_t &producer_id); int extract_shared_exprs(const ObIArray &exprs, diff --git a/tools/deploy/mysql_test/r/mysql/topk.result b/tools/deploy/mysql_test/r/mysql/topk.result index d6e4eb6ba..1797ca9fd 100644 --- a/tools/deploy/mysql_test/r/mysql/topk.result +++ b/tools/deploy/mysql_test/r/mysql/topk.result @@ -400,9 +400,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 8 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 8 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 9 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 9 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -448,9 +448,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 7 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 7 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 8 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 8 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -486,9 +486,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group(nil), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 5 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 5 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 6 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 6 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -541,7 +541,7 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 9 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 9 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 lock tables(t1) 10 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 force partition granule @@ -594,9 +594,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 8 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 8 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 9 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 9 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -643,9 +643,9 @@ Outputs & filters: [T_FUN_COUNT(t1.c1)]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)]) - 8 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 8 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 9 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 9 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -696,9 +696,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 8 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 8 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 9 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 9 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -795,9 +795,9 @@ Outputs & filters: DOUBLE(-1, -1)))]), filter(nil), rowset=16 group([t1.c2]), agg_func([T_FUN_SUM(t1.c1)], [T_FUN_COUNT(t1.c1)], [T_FUN_SUM(t1.c2)], [T_FUN_COUNT(t1.c2)], [T_FUN_SUM(cast(t1.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1.c3, DOUBLE(-1, -1)))]) - 13 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 + 13 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter(nil), rowset=16 force partition granule - 14 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 < 10]), rowset=16 + 14 - output([t1.c1], [t1.c2], [cast(t1.c3, DOUBLE(-1, -1))]), filter([t1.c2 < 10]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-1]) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true diff --git a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery.result b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery.result index 3eface87d..3dc291e9b 100644 --- a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery.result +++ b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery.result @@ -624,7 +624,7 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])], [UNION([4])]), filter(nil), rowset=16 1 - output([t1.c1 + 1], [t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16 equal_conds([t1.c1 + 1 = t2.c2]), other_conds(nil) - 2 - output([t1.c1]), filter([t1.c2 = 2]), rowset=16 + 2 - output([t1.c1 + 1]), filter([t1.c2 = 2]), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1]), range(MIN ; MAX)always true @@ -641,7 +641,7 @@ Outputs & filters: access([t2.c1], [t2.c2], [t2.c3]), partitions(p0) is_index_back=false, is_global_index=false, range_key([t2.c1]), range(MIN ; MAX)always true - 7 - output([t1.c1]), filter(nil), rowset=16 + 7 - output([t1.c1 + 1]), filter(nil), rowset=16 8 - output([t1.c1]), filter([t1.c2 = 2]), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) is_index_back=false, is_global_index=false, filter_before_indexback[false],