cherry-pick one simple MAV fast refresh bugfix from opt_mview feature

This commit is contained in:
chimyue
2024-04-09 07:24:37 +00:00
committed by ob-robot
parent 69541b8b16
commit bda30950ee
2 changed files with 19 additions and 24 deletions

View File

@ -565,9 +565,7 @@ int ObMVPrinter::gen_calc_expr_for_insert_clause_sum(ObRawExpr *source_count,
// --> d_cnt_c3 and d_sum_c3 is output from merge source_table view
// case when d_cnt_c3 = 0 then null else d_sum_c3 end
// sum_c3 = case when cnt_c3 + d_cnt_c3 = 0 then null
// when cnt_c3 = 0 then d_sum_c3
// when d_cnt_c3 = 0 then sum_c3
// else d_sum_c3 + sum_c3 end,
// else nvl(d_sum_c3, 0) + nvl(sum_c3) end,
int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count,
ObRawExpr *source_count,
ObRawExpr *target_sum,
@ -579,6 +577,8 @@ int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count,
ObOpRawExpr *add_expr = NULL;
ObRawExpr *when_expr = NULL;
ObCaseOpRawExpr *case_when_expr = NULL;
ObRawExpr *nvl_target_sum = NULL;
ObRawExpr *nvl_source_sum = NULL;
if (OB_ISNULL(target_count) || OB_ISNULL(source_count) || OB_ISNULL(target_sum) || OB_ISNULL(source_sum)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected params", K(ret), K(target_count), K(source_count), K(target_sum), K(source_sum));
@ -592,15 +592,10 @@ int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count,
|| OB_FAIL(case_when_expr->add_when_param_expr(when_expr))
|| OB_FAIL(case_when_expr->add_then_param_expr(exprs_.null_expr_))) {
LOG_WARN("failed to build and add when/then exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::build_common_binary_op_expr(expr_factory_, T_OP_EQ, target_count, exprs_.int_zero_, when_expr))
|| OB_FAIL(case_when_expr->add_when_param_expr(when_expr))
|| OB_FAIL(case_when_expr->add_then_param_expr(source_sum))) {
LOG_WARN("failed to build and add when/then exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::build_common_binary_op_expr(expr_factory_, T_OP_EQ, source_count, exprs_.int_zero_, when_expr))
|| OB_FAIL(case_when_expr->add_when_param_expr(when_expr))
|| OB_FAIL(case_when_expr->add_then_param_expr(target_sum))) {
LOG_WARN("failed to build and add when/then exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::build_add_expr(expr_factory_, target_sum, source_sum, add_expr))) {
} else if (OB_FAIL(add_nvl_above_exprs(target_sum, exprs_.int_zero_, nvl_target_sum))
|| OB_FAIL(add_nvl_above_exprs(source_sum, exprs_.int_zero_, nvl_source_sum))) {
LOG_WARN("failed to add nvl above exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::build_add_expr(expr_factory_, nvl_target_sum, nvl_source_sum, add_expr))) {
LOG_WARN("failed to build add expr", K(ret));
} else {
case_when_expr->set_default_param_expr(add_expr);
@ -987,32 +982,32 @@ int ObMVPrinter::gen_basic_aggr_expr(ObRawExprCopier &copier,
LOG_WARN("failed to add param expr to agg expr", K(ret));
} else if (T_FUN_COUNT != aggr_expr.get_expr_type() || !mv_checker_.get_stmt().is_scala_group_by()) {
aggr_print_expr = new_aggr_expr;
} else if (OB_FAIL(add_nvl_default_zero_above_expr(new_aggr_expr, aggr_print_expr))) {
} else if (OB_FAIL(add_nvl_above_exprs(new_aggr_expr, exprs_.int_zero_, aggr_print_expr))) {
// for scalar group by, d_cnt from sum(dml_factor) may get null, need convert null to 0
// count(*) --> nvl(d_cnt, 0)
// count(c3) --> nvl(d_cnt_3, 0)
LOG_WARN("failed to gen calc expr for scalar count", K(ret));
}
return ret;
}
// for scalar group by, d_cnt from sum(dml_factor) may get null, need convert null to 0
// count(*) --> nvl(d_cnt, 0)
// count(c3) --> nvl(d_cnt_3, 0)
int ObMVPrinter::add_nvl_default_zero_above_expr(ObRawExpr *source_expr, ObRawExpr *&expr)
int ObMVPrinter::add_nvl_above_exprs(ObRawExpr *expr, ObRawExpr *default_expr, ObRawExpr *&res_expr)
{
int ret = OB_SUCCESS;
expr = NULL;
res_expr = NULL;
ObSysFunRawExpr *nvl_expr = NULL;
if (OB_FAIL(expr_factory_.create_raw_expr(T_FUN_SYS_NVL, nvl_expr))) {
LOG_WARN("fail to create nvl expr", K(ret));
} else if (OB_ISNULL(source_expr) || OB_ISNULL(exprs_.int_zero_) || OB_ISNULL(nvl_expr)) {
} else if (OB_ISNULL(expr) || OB_ISNULL(default_expr) || OB_ISNULL(nvl_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null", K(ret), K(source_expr), K(exprs_.int_zero_), K(nvl_expr));
} else if (OB_FAIL(nvl_expr->add_param_expr(source_expr))
|| OB_FAIL(nvl_expr->add_param_expr(exprs_.int_zero_))) {
LOG_WARN("unexpected null", K(ret), K(expr), K(default_expr), K(nvl_expr));
} else if (OB_FAIL(nvl_expr->add_param_expr(expr))
|| OB_FAIL(nvl_expr->add_param_expr(default_expr))) {
LOG_WARN("fail to add param expr", K(ret));
} else {
nvl_expr->set_expr_type(T_FUN_SYS_NVL);
nvl_expr->set_func_name(ObString::make_string(N_NVL));
expr = nvl_expr;
res_expr = nvl_expr;
}
return ret;
}

View File

@ -157,7 +157,7 @@ private:
ObRawExpr *dml_factor,
ObAggFunRawExpr &aggr_expr,
ObRawExpr *&aggr_print_expr);
int add_nvl_default_zero_above_expr(ObRawExpr *source_expr, ObRawExpr *&expr);
int add_nvl_above_exprs(ObRawExpr *expr, ObRawExpr *default_expr, ObRawExpr *&res_expr);
int gen_simple_mav_delta_mv_filter(ObRawExprCopier &copier,
const TableItem &table_item,
ObIArray<ObRawExpr*> &filters);