fix copy shared exec param bug
This commit is contained in:
@ -1322,7 +1322,11 @@ int ObQueryRefRawExpr::inner_deep_copy(ObIRawExprCopier &copier)
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < exec_params_.count(); ++i) {
|
||||
ObRawExpr *exec_param = exec_params_.at(i);
|
||||
ObRawExpr *new_expr = NULL;
|
||||
if (OB_FAIL(copier.do_copy_expr(exec_param, new_expr))) {
|
||||
if (OB_FAIL(copier.find_in_copy_context(exec_param, new_expr))) {
|
||||
LOG_WARN("failed to find in copy context", K(ret));
|
||||
} else if (new_expr != NULL) {
|
||||
exec_params_.at(i) = static_cast<ObExecParamRawExpr *>(new_expr);
|
||||
} else if (OB_FAIL(copier.do_copy_expr(exec_param, new_expr))) {
|
||||
LOG_WARN("failed to copy exec param", K(ret));
|
||||
} else if (OB_ISNULL(new_expr) ||
|
||||
OB_UNLIKELY(!new_expr->is_exec_param_expr())) {
|
||||
|
||||
@ -61,6 +61,14 @@ int ObPLExprCopier::check_need_copy(const ObRawExpr *old_expr,
|
||||
return OB_SUCCESS;
|
||||
}
|
||||
|
||||
int ObPLExprCopier::find_in_copy_context(const ObRawExpr *old_expr,
|
||||
ObRawExpr *&new_expr)
|
||||
{
|
||||
UNUSED(old_expr);
|
||||
new_expr = NULL;
|
||||
return OB_SUCCESS;
|
||||
}
|
||||
|
||||
int ObPLExprCopier::do_copy_expr(const ObRawExpr *old_expr,
|
||||
ObRawExpr *&new_expr)
|
||||
{
|
||||
@ -86,6 +94,23 @@ int ObPLExprCopier::do_copy_expr(const ObRawExpr *old_expr,
|
||||
|
||||
int ObRawExprCopier::check_need_copy(const ObRawExpr *old_expr,
|
||||
ObRawExpr *&new_expr)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
new_expr = NULL;
|
||||
if (OB_FAIL(find_in_copy_context(old_expr, new_expr))) {
|
||||
LOG_WARN("faild to find in copy context", K(ret));
|
||||
} else if (OB_ISNULL(new_expr) &&
|
||||
old_expr->is_exec_param_expr() &&
|
||||
!static_cast<const ObExecParamRawExpr *>(old_expr)->is_onetime()) {
|
||||
// TODO link.zt skip the copy of exec param expr
|
||||
// let the query ref raw expr to copy the expr
|
||||
// to be improved
|
||||
new_expr = const_cast<ObRawExpr *>(old_expr);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObRawExprCopier::find_in_copy_context(const ObRawExpr *old_expr, ObRawExpr *&new_expr)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int tmp = OB_SUCCESS;
|
||||
@ -106,14 +131,6 @@ int ObRawExprCopier::check_need_copy(const ObRawExpr *old_expr,
|
||||
ret = tmp;
|
||||
LOG_WARN("get expr from hash map failed", K(ret));
|
||||
}
|
||||
if (OB_SUCC(ret) && OB_ISNULL(new_expr) &&
|
||||
old_expr->is_exec_param_expr() &&
|
||||
!static_cast<const ObExecParamRawExpr *>(old_expr)->is_onetime()) {
|
||||
// TODO link.zt skip the copy of exec param expr
|
||||
// let the query ref raw expr to copy the expr
|
||||
// to be improved
|
||||
new_expr = const_cast<ObRawExpr *>(old_expr);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -26,6 +26,9 @@ public:
|
||||
|
||||
virtual int check_need_copy(const ObRawExpr *old_expr, ObRawExpr *&new_expr) = 0;
|
||||
|
||||
// check if old expr has already been copied, and if it has been copied, takes it directly.
|
||||
virtual int find_in_copy_context(const ObRawExpr *old_expr, ObRawExpr *&new_expr) = 0;
|
||||
|
||||
virtual int do_copy_expr(const ObRawExpr *old_expr, ObRawExpr *&new_expr) = 0;
|
||||
|
||||
virtual bool deep_copy_attributes() const { return false; }
|
||||
@ -76,6 +79,8 @@ public:
|
||||
int do_copy_expr(const ObRawExpr *old_expr, ObRawExpr *&new_expr) override;
|
||||
|
||||
bool deep_copy_attributes() const { return true; }
|
||||
|
||||
int find_in_copy_context(const ObRawExpr *old_expr, ObRawExpr *&new_expr) override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -154,6 +159,8 @@ public:
|
||||
|
||||
int get_copied_exprs(ObIArray<std::pair<ObRawExpr *, ObRawExpr *>> &from_to_exprs);
|
||||
|
||||
int find_in_copy_context(const ObRawExpr *old_expr, ObRawExpr *&new_expr) override;
|
||||
|
||||
private:
|
||||
|
||||
int add_expr(const ObRawExpr *from, const ObRawExpr *to);
|
||||
|
||||
Reference in New Issue
Block a user