disable expr pullup and const propagate with var assign
This commit is contained in:
		@ -227,16 +227,16 @@ int ObTransformConstPropagate::do_transform(ObDMLStmt *stmt,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObSharedExprChecker shared_expr_checker;
 | 
					  ObSharedExprChecker shared_expr_checker;
 | 
				
			||||||
  bool hint_allowed_trans = false;
 | 
					  bool allow_trans = false;
 | 
				
			||||||
  if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->session_info_)) {
 | 
					  if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->session_info_)) {
 | 
				
			||||||
    ret = OB_ERR_UNEXPECTED;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
    LOG_WARN("invalid parameter", K(ret));
 | 
					    LOG_WARN("invalid parameter", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(ObTransformRule::check_hint_status(*stmt, hint_allowed_trans))) {
 | 
					  } else if (OB_FAIL(check_allow_trans(stmt, allow_trans))) {
 | 
				
			||||||
    LOG_WARN("failed to check_hint_status", K(ret));
 | 
					    LOG_WARN("failed to check trans allowed", K(ret));
 | 
				
			||||||
  } else if (!stmt->is_insert_stmt() && OB_FAIL(shared_expr_checker.init(*stmt))) {
 | 
					  } else if (!stmt->is_insert_stmt() && OB_FAIL(shared_expr_checker.init(*stmt))) {
 | 
				
			||||||
    LOG_WARN("failed to init shared expr checker", K(ret));
 | 
					    LOG_WARN("failed to init shared expr checker", K(ret));
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    ConstInfoContext const_ctx(shared_expr_checker, hint_allowed_trans);
 | 
					    ConstInfoContext const_ctx(shared_expr_checker, allow_trans);
 | 
				
			||||||
    bool has_rollup_or_groupingsets = false;
 | 
					    bool has_rollup_or_groupingsets = false;
 | 
				
			||||||
    bool is_happened = false;
 | 
					    bool is_happened = false;
 | 
				
			||||||
    if (OB_SUCC(ret)) {
 | 
					    if (OB_SUCC(ret)) {
 | 
				
			||||||
@ -487,6 +487,22 @@ int ObTransformConstPropagate::do_transform(ObDMLStmt *stmt,
 | 
				
			|||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const info is always collected even if transform is not allowed
 | 
				
			||||||
 | 
					int ObTransformConstPropagate::check_allow_trans(ObDMLStmt *stmt, bool &allow_trans)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  bool hint_allowed_trans = false;
 | 
				
			||||||
 | 
					  if (OB_ISNULL(stmt)) {
 | 
				
			||||||
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
 | 
					    LOG_WARN("invalid parameter", K(ret));
 | 
				
			||||||
 | 
					  } else if (OB_FAIL(ObTransformRule::check_hint_status(*stmt, hint_allowed_trans))) {
 | 
				
			||||||
 | 
					    LOG_WARN("failed to check_hint_status", K(ret));
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    allow_trans = hint_allowed_trans && !stmt->is_contains_assignment();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ObTransformConstPropagate::exclude_redundancy_join_cond(ObIArray<ObRawExpr*> &condition_exprs,
 | 
					int ObTransformConstPropagate::exclude_redundancy_join_cond(ObIArray<ObRawExpr*> &condition_exprs,
 | 
				
			||||||
                                                            ObIArray<ExprConstInfo> &expr_const_infos,
 | 
					                                                            ObIArray<ExprConstInfo> &expr_const_infos,
 | 
				
			||||||
                                                            ObIArray<ObRawExpr*> &excluded_exprs)
 | 
					                                                            ObIArray<ObRawExpr*> &excluded_exprs)
 | 
				
			||||||
@ -644,7 +660,7 @@ int ObTransformConstPropagate::recursive_collect_const_info_from_table(ObDMLStmt
 | 
				
			|||||||
    if (LEFT_OUTER_JOIN == joined_table->joined_type_ ||
 | 
					    if (LEFT_OUTER_JOIN == joined_table->joined_type_ ||
 | 
				
			||||||
        RIGHT_OUTER_JOIN == joined_table->joined_type_) {
 | 
					        RIGHT_OUTER_JOIN == joined_table->joined_type_) {
 | 
				
			||||||
      // FULL_OUT_JOIN is not transformed because may eliminate all equal join conditions
 | 
					      // FULL_OUT_JOIN is not transformed because may eliminate all equal join conditions
 | 
				
			||||||
      ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.hint_allowed_trans_);
 | 
					      ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.allow_trans_);
 | 
				
			||||||
      bool left_happened = false;
 | 
					      bool left_happened = false;
 | 
				
			||||||
      bool right_happened = false;
 | 
					      bool right_happened = false;
 | 
				
			||||||
      bool condition_happened = false;
 | 
					      bool condition_happened = false;
 | 
				
			||||||
@ -1058,7 +1074,7 @@ int ObTransformConstPropagate::replace_expr_internal(ObRawExpr *&cur_expr,
 | 
				
			|||||||
                                                     bool used_in_compare)
 | 
					                                                     bool used_in_compare)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  if (const_ctx.hint_allowed_trans_) {
 | 
					  if (const_ctx.allow_trans_) {
 | 
				
			||||||
    ObSEArray<ObRawExpr *, 8> parent_exprs;
 | 
					    ObSEArray<ObRawExpr *, 8> parent_exprs;
 | 
				
			||||||
    if (OB_FAIL(recursive_replace_expr(cur_expr,
 | 
					    if (OB_FAIL(recursive_replace_expr(cur_expr,
 | 
				
			||||||
                                      parent_exprs,
 | 
					                                      parent_exprs,
 | 
				
			||||||
@ -1850,7 +1866,7 @@ int ObTransformConstPropagate::recursive_collect_equal_pair_from_condition(ObDML
 | 
				
			|||||||
  } else if (T_OP_OR == expr->get_expr_type()) {
 | 
					  } else if (T_OP_OR == expr->get_expr_type()) {
 | 
				
			||||||
    ObArray<ExprConstInfo> complex_infos;
 | 
					    ObArray<ExprConstInfo> complex_infos;
 | 
				
			||||||
    for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) {
 | 
					    for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) {
 | 
				
			||||||
      ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.hint_allowed_trans_);
 | 
					      ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.allow_trans_);
 | 
				
			||||||
      bool child_happened = false;
 | 
					      bool child_happened = false;
 | 
				
			||||||
      bool current_happened = false;
 | 
					      bool current_happened = false;
 | 
				
			||||||
      if (OB_FAIL(SMART_CALL(recursive_collect_equal_pair_from_condition(stmt,
 | 
					      if (OB_FAIL(SMART_CALL(recursive_collect_equal_pair_from_condition(stmt,
 | 
				
			||||||
@ -1962,7 +1978,7 @@ int ObTransformConstPropagate::replace_check_constraint_exprs(ObDMLStmt *stmt,
 | 
				
			|||||||
  if (OB_ISNULL(stmt)) {
 | 
					  if (OB_ISNULL(stmt)) {
 | 
				
			||||||
    ret = OB_ERR_UNEXPECTED;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
    LOG_WARN("get unexpected null", K(ret), K(stmt));
 | 
					    LOG_WARN("get unexpected null", K(ret), K(stmt));
 | 
				
			||||||
  } else if (!const_ctx.hint_allowed_trans_) {
 | 
					  } else if (!const_ctx.allow_trans_) {
 | 
				
			||||||
    /* do nothing */
 | 
					    /* do nothing */
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    LOG_TRACE("begin replace check constraint exprs", K(const_ctx), K(stmt->get_check_constraint_items()));
 | 
					    LOG_TRACE("begin replace check constraint exprs", K(const_ctx), K(stmt->get_check_constraint_items()));
 | 
				
			||||||
 | 
				
			|||||||
@ -91,10 +91,10 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  struct ConstInfoContext {
 | 
					  struct ConstInfoContext {
 | 
				
			||||||
    ConstInfoContext(const ObSharedExprChecker &shared_expr_checker,
 | 
					    ConstInfoContext(const ObSharedExprChecker &shared_expr_checker,
 | 
				
			||||||
                     bool hint_allowed_trans) : active_const_infos_(),
 | 
					                     bool allow_trans) : active_const_infos_(),
 | 
				
			||||||
                         expired_const_infos_(),
 | 
					                         expired_const_infos_(),
 | 
				
			||||||
                         extra_excluded_exprs_(),
 | 
					                         extra_excluded_exprs_(),
 | 
				
			||||||
                         hint_allowed_trans_(hint_allowed_trans),
 | 
					                         allow_trans_(allow_trans),
 | 
				
			||||||
                         shared_expr_checker_(shared_expr_checker)
 | 
					                         shared_expr_checker_(shared_expr_checker)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -109,13 +109,13 @@ private:
 | 
				
			|||||||
    common::ObSEArray<ExprConstInfo, 4> active_const_infos_;
 | 
					    common::ObSEArray<ExprConstInfo, 4> active_const_infos_;
 | 
				
			||||||
    common::ObSEArray<ExprConstInfo, 4> expired_const_infos_;
 | 
					    common::ObSEArray<ExprConstInfo, 4> expired_const_infos_;
 | 
				
			||||||
    common::ObSEArray<ObRawExpr *, 4> extra_excluded_exprs_;
 | 
					    common::ObSEArray<ObRawExpr *, 4> extra_excluded_exprs_;
 | 
				
			||||||
    bool hint_allowed_trans_;
 | 
					    bool allow_trans_;
 | 
				
			||||||
    const ObSharedExprChecker &shared_expr_checker_;
 | 
					    const ObSharedExprChecker &shared_expr_checker_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TO_STRING_KV(K_(active_const_infos),
 | 
					    TO_STRING_KV(K_(active_const_infos),
 | 
				
			||||||
                 K_(expired_const_infos),
 | 
					                 K_(expired_const_infos),
 | 
				
			||||||
                 K_(extra_excluded_exprs),
 | 
					                 K_(extra_excluded_exprs),
 | 
				
			||||||
                 K_(hint_allowed_trans));
 | 
					                 K_(allow_trans));
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  struct PullupConstInfo {
 | 
					  struct PullupConstInfo {
 | 
				
			||||||
@ -139,6 +139,8 @@ private:
 | 
				
			|||||||
                 K_(need_add_constraint));
 | 
					                 K_(need_add_constraint));
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int check_allow_trans(ObDMLStmt *stmt, bool &allow_trans);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int recursive_collect_const_info_from_table(ObDMLStmt *stmt,
 | 
					  int recursive_collect_const_info_from_table(ObDMLStmt *stmt,
 | 
				
			||||||
                                              TableItem *table_item,
 | 
					                                              TableItem *table_item,
 | 
				
			||||||
                                              ConstInfoContext &const_ctx,
 | 
					                                              ConstInfoContext &const_ctx,
 | 
				
			||||||
 | 
				
			|||||||
@ -493,7 +493,8 @@ bool ObTransformExprPullup::is_view_acceptable_for_rewrite(TableItem &view)
 | 
				
			|||||||
      && !view.ref_query_->is_hierarchical_query()
 | 
					      && !view.ref_query_->is_hierarchical_query()
 | 
				
			||||||
      && !view.ref_query_->has_select_into()
 | 
					      && !view.ref_query_->has_select_into()
 | 
				
			||||||
      && !view.ref_query_->is_set_stmt()
 | 
					      && !view.ref_query_->is_set_stmt()
 | 
				
			||||||
      && !view.ref_query_->is_distinct();
 | 
					      && !view.ref_query_->is_distinct()
 | 
				
			||||||
 | 
					      && !view.ref_query_->is_contains_assignment();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ObTransformExprPullup::check_stmt_validity(const ObDMLStmt *stmt, bool &is_valid)
 | 
					int ObTransformExprPullup::check_stmt_validity(const ObDMLStmt *stmt, bool &is_valid)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user