diff --git a/src/sql/resolver/mv/ob_mv_printer.cpp b/src/sql/resolver/mv/ob_mv_printer.cpp index 08a11e810d..d5443e136f 100644 --- a/src/sql/resolver/mv/ob_mv_printer.cpp +++ b/src/sql/resolver/mv/ob_mv_printer.cpp @@ -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; } diff --git a/src/sql/resolver/mv/ob_mv_printer.h b/src/sql/resolver/mv/ob_mv_printer.h index ea4eafbeb0..71a58dce20 100644 --- a/src/sql/resolver/mv/ob_mv_printer.h +++ b/src/sql/resolver/mv/ob_mv_printer.h @@ -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 &filters);