fix shared expr allocation bug

This commit is contained in:
yinyj17 2024-10-14 05:17:00 +00:00 committed by ob-robot
parent c39b2dc314
commit a87ff1d5d6
19 changed files with 166 additions and 65 deletions

View File

@ -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<IndexDMLInfo *> &index_dml_infos,
bool &is_fixed)
{
int ret = OB_SUCCESS;
const ObIArray<IndexDMLInfo *> &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));
}
}

View File

@ -335,7 +335,7 @@ public:
int replace_dml_info_exprs(
ObRawExprReplacer &replacer,
const ObIArray<IndexDMLInfo *> &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<ObRawExpr *> &dml_new_values,
ObRawExpr *cur_value,
ObRawExpr *&new_value);
int is_dml_fixed_expr(const ObRawExpr *expr,
const ObIArray<IndexDMLInfo *> &index_dml_infos,
bool &is_fixed);
static int get_update_exprs(const IndexDMLInfo &dml_info,
ObIArray<ObRawExpr *> &dml_columns,

View File

@ -111,6 +111,15 @@ int ObLogDelete::get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -31,6 +31,7 @@ public:
virtual int do_re_est_cost(EstimateCostInfo &param, double &card, double &op_cost, double &cost) override;
int inner_est_cost(double child_card, double &op_cost);
virtual int get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -181,6 +181,23 @@ int ObLogInsert::get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -59,6 +59,7 @@ public:
return is_overwrite_;
}
virtual int get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -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;
}
}
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;
}

View File

@ -197,6 +197,7 @@ namespace sql
// 左侧的 GI 看到这个 partition id 后会以 producer 的身份生成列
int generate_join_partition_id_expr();
virtual int get_op_exprs(ObIArray<ObRawExpr*> &all_exprs) override;
virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override;
int get_connect_by_exprs(ObIArray<ObRawExpr*> &all_exprs);
virtual int allocate_granule_post(AllocGIContext &ctx) override;
virtual int allocate_granule_pre(AllocGIContext &ctx) override;

View File

@ -144,6 +144,23 @@ int ObLogMerge::get_op_exprs(ObIArray<ObRawExpr*> &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<uint64_t> &index_tids)
{
int ret = OB_SUCCESS;

View File

@ -29,6 +29,7 @@ public:
{ }
virtual ~ObLogMerge() {}
virtual int get_op_exprs(ObIArray<ObRawExpr*> &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<ObRawExpr *> &get_insert_condition() const;

View File

@ -110,6 +110,15 @@ int ObLogUpdate::get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -30,6 +30,7 @@ public:
virtual int do_re_est_cost(EstimateCostInfo &param, double &card, double &op_cost, double &cost) override;
int inner_est_cost(double child_card, double &op_cost);
virtual int get_op_exprs(ObIArray<ObRawExpr*> &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;

View File

@ -675,7 +675,7 @@ int ObLogWindowFunction::get_rd_sort_keys(common::ObIArray<OrderItem> &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;
}

View File

@ -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<ObRawExpr*, 4> exprs;
uint64_t producer_id = OB_INVALID_ID;
if (OB_FAIL(static_cast<ObLogSort*>(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))) {

View File

@ -1249,12 +1249,11 @@ public:
int extract_non_const_exprs(const ObIArray<ObRawExpr*> &input_exprs,
ObIArray<ObRawExpr*> &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<ObRawExpr*> &exprs,

View File

@ -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

View File

@ -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],