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 | //  --> 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 | //  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 | //  sum_c3 = case when cnt_c3 + d_cnt_c3 = 0 then null | ||||||
| //                when cnt_c3 = 0 then d_sum_c3 | //                else nvl(d_sum_c3, 0) + nvl(sum_c3) end, | ||||||
| //                when d_cnt_c3 = 0 then sum_c3 |  | ||||||
| //                else d_sum_c3 + sum_c3 end, |  | ||||||
| int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count, | int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count, | ||||||
|                                                      ObRawExpr *source_count, |                                                      ObRawExpr *source_count, | ||||||
|                                                      ObRawExpr *target_sum, |                                                      ObRawExpr *target_sum, | ||||||
| @ -579,6 +577,8 @@ int ObMVPrinter::gen_calc_expr_for_update_clause_sum(ObRawExpr *target_count, | |||||||
|   ObOpRawExpr *add_expr = NULL; |   ObOpRawExpr *add_expr = NULL; | ||||||
|   ObRawExpr *when_expr = NULL; |   ObRawExpr *when_expr = NULL; | ||||||
|   ObCaseOpRawExpr *case_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)) { |   if (OB_ISNULL(target_count) || OB_ISNULL(source_count) || OB_ISNULL(target_sum) || OB_ISNULL(source_sum)) { | ||||||
|     ret = OB_ERR_UNEXPECTED; |     ret = OB_ERR_UNEXPECTED; | ||||||
|     LOG_WARN("unexpected params", K(ret), K(target_count), K(source_count), K(target_sum), K(source_sum)); |     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_when_param_expr(when_expr)) | ||||||
|              || OB_FAIL(case_when_expr->add_then_param_expr(exprs_.null_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)); |     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)) |   } else if (OB_FAIL(add_nvl_above_exprs(target_sum, exprs_.int_zero_, nvl_target_sum)) | ||||||
|              || OB_FAIL(case_when_expr->add_when_param_expr(when_expr)) |              || OB_FAIL(add_nvl_above_exprs(source_sum, exprs_.int_zero_, nvl_source_sum))) { | ||||||
|              || OB_FAIL(case_when_expr->add_then_param_expr(source_sum))) { |     LOG_WARN("failed to add nvl above exprs", K(ret)); | ||||||
|     LOG_WARN("failed to build and add when/then exprs", K(ret)); |   } else if (OB_FAIL(ObRawExprUtils::build_add_expr(expr_factory_, nvl_target_sum, nvl_source_sum, add_expr))) { | ||||||
|   } 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))) { |  | ||||||
|     LOG_WARN("failed to build add expr", K(ret)); |     LOG_WARN("failed to build add expr", K(ret)); | ||||||
|   } else { |   } else { | ||||||
|     case_when_expr->set_default_param_expr(add_expr); |     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)); |     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()) { |   } else if (T_FUN_COUNT != aggr_expr.get_expr_type() || !mv_checker_.get_stmt().is_scala_group_by()) { | ||||||
|     aggr_print_expr = new_aggr_expr; |     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)); |     LOG_WARN("failed to gen calc expr for scalar count", K(ret)); | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| //  for scalar group by, d_cnt from sum(dml_factor) may get null, need convert null to 0 | int ObMVPrinter::add_nvl_above_exprs(ObRawExpr *expr, ObRawExpr *default_expr, ObRawExpr *&res_expr) | ||||||
| //  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 ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   expr = NULL; |   res_expr = NULL; | ||||||
|   ObSysFunRawExpr *nvl_expr = NULL; |   ObSysFunRawExpr *nvl_expr = NULL; | ||||||
|   if (OB_FAIL(expr_factory_.create_raw_expr(T_FUN_SYS_NVL, nvl_expr))) { |   if (OB_FAIL(expr_factory_.create_raw_expr(T_FUN_SYS_NVL, nvl_expr))) { | ||||||
|     LOG_WARN("fail to create nvl expr", K(ret)); |     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; |     ret = OB_ERR_UNEXPECTED; | ||||||
|     LOG_WARN("unexpected null", K(ret), K(source_expr), K(exprs_.int_zero_), K(nvl_expr)); |     LOG_WARN("unexpected null", K(ret), K(expr), K(default_expr), K(nvl_expr)); | ||||||
|   } else if (OB_FAIL(nvl_expr->add_param_expr(source_expr)) |   } else if (OB_FAIL(nvl_expr->add_param_expr(expr)) | ||||||
|              || OB_FAIL(nvl_expr->add_param_expr(exprs_.int_zero_))) { |              || OB_FAIL(nvl_expr->add_param_expr(default_expr))) { | ||||||
|     LOG_WARN("fail to add param expr", K(ret)); |     LOG_WARN("fail to add param expr", K(ret)); | ||||||
|   } else { |   } else { | ||||||
|     nvl_expr->set_expr_type(T_FUN_SYS_NVL); |     nvl_expr->set_expr_type(T_FUN_SYS_NVL); | ||||||
|     nvl_expr->set_func_name(ObString::make_string(N_NVL)); |     nvl_expr->set_func_name(ObString::make_string(N_NVL)); | ||||||
|     expr = nvl_expr; |     res_expr = nvl_expr; | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -157,7 +157,7 @@ private: | |||||||
|                           ObRawExpr *dml_factor, |                           ObRawExpr *dml_factor, | ||||||
|                           ObAggFunRawExpr &aggr_expr, |                           ObAggFunRawExpr &aggr_expr, | ||||||
|                           ObRawExpr *&aggr_print_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, |   int gen_simple_mav_delta_mv_filter(ObRawExprCopier &copier, | ||||||
|                                      const TableItem &table_item, |                                      const TableItem &table_item, | ||||||
|                                      ObIArray<ObRawExpr*> &filters); |                                      ObIArray<ObRawExpr*> &filters); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 chimyue
					chimyue