fix an exec_param and a expr copy_on_replace bugs
This commit is contained in:
@ -65,6 +65,7 @@ public:
|
||||
const ObIArray<ObRawExpr *> &to_exprs);
|
||||
int add_replace_exprs(const ObIArray<std::pair<ObRawExpr *, ObRawExpr *>> &to_replace_exprs);
|
||||
int append_replace_exprs(const ObRawExprReplacer &other);
|
||||
int check_need_replace(const ObRawExpr *old_expr, ObRawExpr *&new_expr, bool &need_replace);
|
||||
|
||||
private:
|
||||
// types and constants
|
||||
@ -76,9 +77,6 @@ private:
|
||||
const bool overwrite,
|
||||
bool &is_existed);
|
||||
int check_skip_expr(const ObRawExpr &expr, bool &skip_expr);
|
||||
int check_need_replace(const ObRawExpr *old_expr,
|
||||
ObRawExpr *&new_expr,
|
||||
bool &need_replace);
|
||||
// disallow copy
|
||||
DISALLOW_COPY_AND_ASSIGN(ObRawExprReplacer);
|
||||
// function members
|
||||
|
||||
@ -4576,29 +4576,52 @@ int ObRawExprUtils::get_exec_param_expr(ObRawExprFactory &expr_factory,
|
||||
// we create a new one here
|
||||
if (OB_SUCC(ret) && NULL == param_expr) {
|
||||
ObExecParamRawExpr *exec_param = NULL;
|
||||
if (OB_FAIL(expr_factory.create_raw_expr(T_QUESTIONMARK, exec_param))) {
|
||||
LOG_WARN("failed to create raw expr", K(ret));
|
||||
} else if (OB_ISNULL(exec_param)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("exec param is null", K(ret), K(exec_param));
|
||||
if (OB_FAIL(ObRawExprUtils::create_new_exec_param(expr_factory,
|
||||
outer_val_expr,
|
||||
exec_param,
|
||||
false))) {
|
||||
LOG_WARN("failed to create new exec param", K(ret));
|
||||
} else if (OB_FAIL(query_ref->add_exec_param_expr(exec_param))) {
|
||||
LOG_WARN("failed to add exec param expr", K(ret));
|
||||
} else if (OB_FAIL(exec_param->set_enum_set_values(outer_val_expr->get_enum_set_values()))) {
|
||||
LOG_WARN("failed to set enum set values", K(ret));
|
||||
} else if (OB_FAIL(exec_param->add_flag(IS_CONST))) {
|
||||
LOG_WARN("failed to add flag", K(ret));
|
||||
} else if (OB_FAIL(exec_param->add_flag(IS_DYNAMIC_PARAM))) {
|
||||
LOG_WARN("failed to add flag", K(ret));
|
||||
} else {
|
||||
exec_param->set_ref_expr(outer_val_expr);
|
||||
exec_param->set_param_index(-1);
|
||||
exec_param->set_result_type(outer_val_expr->get_result_type());
|
||||
param_expr = exec_param;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObRawExprUtils::create_new_exec_param(ObRawExprFactory &expr_factory,
|
||||
ObRawExpr *ref_expr,
|
||||
ObExecParamRawExpr *&exec_param,
|
||||
bool is_onetime /*=false*/)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
exec_param = NULL;
|
||||
if (OB_ISNULL(ref_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expr is null", K(ret), K(ref_expr));
|
||||
} else if (OB_FAIL(expr_factory.create_raw_expr(T_QUESTIONMARK, exec_param))) {
|
||||
LOG_WARN("failed to create exec param expr", K(ret));
|
||||
} else if (OB_ISNULL(exec_param)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("exec param is null", K(ret), K(exec_param));
|
||||
} else if (OB_FAIL(exec_param->set_enum_set_values(ref_expr->get_enum_set_values()))) {
|
||||
LOG_WARN("failed to set enum set values", K(ret));
|
||||
} else if (OB_FAIL(exec_param->add_flag(IS_CONST))) {
|
||||
LOG_WARN("failed to add flag", K(ret));
|
||||
} else if (OB_FAIL(exec_param->add_flag(IS_DYNAMIC_PARAM))) {
|
||||
LOG_WARN("failed to add flag", K(ret));
|
||||
} else {
|
||||
exec_param->set_ref_expr(ref_expr, is_onetime);
|
||||
exec_param->set_param_index(-1);
|
||||
exec_param->set_result_type(ref_expr->get_result_type());
|
||||
if (is_onetime) {
|
||||
exec_param->add_flag(IS_ONETIME);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObRawExprUtils::create_new_exec_param(ObQueryCtx *query_ctx,
|
||||
ObRawExprFactory &expr_factory,
|
||||
ObRawExpr *&expr,
|
||||
|
||||
@ -557,11 +557,10 @@ public:
|
||||
ObRawExprFactory &expr_factory,
|
||||
ObRawExpr *&expr,
|
||||
bool is_onetime = false);
|
||||
|
||||
static int create_exec_param_expr(ObQueryCtx *query_ctx,
|
||||
ObRawExprFactory &expr_factory,
|
||||
ObRawExpr *&src_expr,
|
||||
std::pair<int64_t, ObRawExpr*> &init_expr);
|
||||
static int create_new_exec_param(ObRawExprFactory &expr_factory,
|
||||
ObRawExpr *ref_expr,
|
||||
ObExecParamRawExpr *&exec_param,
|
||||
bool is_onetime = false);
|
||||
static int create_param_expr(ObRawExprFactory &expr_factory, int64_t param_idx, ObRawExpr *&expr);
|
||||
static int build_trim_expr(const share::schema::ObColumnSchemaV2 *column_schema,
|
||||
ObRawExprFactory &expr_factory,
|
||||
|
||||
Reference in New Issue
Block a user