cherry-pick one simple MAV fast refresh bugfix from opt_mview feature
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user