Bugfix for dynamic evaluated questionmark
This commit is contained in:
@ -3772,7 +3772,7 @@ int ObRawExprDeduceType::try_replace_casts_with_questionmarks_ora(ObRawExpr *row
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObRawExprDeduceType::try_replace_cast_with_questionmark_ora(ObRawExpr &parent, ObRawExpr *cast_expr, int param_idx)
|
||||
int ObRawExprDeduceType::try_replace_cast_with_questionmark_ora(ObRawExpr &parent, ObRawExpr *cast_expr, int child_idx)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_ISNULL(cast_expr)) {
|
||||
@ -3791,14 +3791,24 @@ int ObRawExprDeduceType::try_replace_cast_with_questionmark_ora(ObRawExpr &paren
|
||||
bool is_nmb2decint = param_expr->get_result_type().is_number() && cast_expr->get_result_type().is_decimal_int();
|
||||
bool is_decint2decint = param_expr->get_result_type().is_decimal_int() && cast_expr->get_result_type().is_decimal_int();
|
||||
if (param_expr->is_static_const_expr() && param_expr->get_expr_type() == T_QUESTIONMARK
|
||||
&& !static_cast<ObConstRawExpr *>(param_expr)->is_dynamic_eval_questionmark() // already replaced
|
||||
&& (is_decint2nmb || is_nmb2decint || is_decint2decint)) {
|
||||
ObConstRawExpr *c_expr = static_cast<ObConstRawExpr *>(param_expr);
|
||||
ObExprResType res_type = cast_expr->get_result_type();
|
||||
res_type.add_cast_mode(cast_expr->get_extra());
|
||||
ret = static_cast<ObConstRawExpr *>(param_expr)->set_dynamic_eval_questionmark(res_type);
|
||||
if (OB_FAIL(ret)) {
|
||||
int64_t param_idx = 0;
|
||||
if (OB_ISNULL(expr_factory_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null raw expr", K(ret));
|
||||
} else if (OB_FAIL(c_expr->get_value().get_unknown(param_idx))) {
|
||||
LOG_WARN("get param idx failed", K(ret));
|
||||
} else if (OB_FAIL(ObRawExprUtils::create_param_expr(*expr_factory_, param_idx, param_expr))) {
|
||||
// create new param store to avoid unexpected problem
|
||||
LOG_WARN("create param expr failed", K(ret));
|
||||
} else if (OB_FAIL(static_cast<ObConstRawExpr *>(param_expr)->set_dynamic_eval_questionmark(res_type))){
|
||||
LOG_WARN("set dynamic eval question mark failed", K(ret));
|
||||
} else {
|
||||
parent.get_param_expr(param_idx) = param_expr;
|
||||
parent.get_param_expr(child_idx) = param_expr;
|
||||
}
|
||||
}
|
||||
LOG_DEBUG("replace cast with questionmark", K(*cast_expr), K(is_decint2nmb), K(is_nmb2decint),
|
||||
|
||||
Reference in New Issue
Block a user