fix shared expr allocation bug
This commit is contained in:
parent
c39b2dc314
commit
a87ff1d5d6
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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<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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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<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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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))) {
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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],
|
||||
|
Loading…
x
Reference in New Issue
Block a user