[CP] [CP] Fix enumset in-subquery missing wrap type to string expr
This commit is contained in:
@ -95,6 +95,8 @@ int ObRawExprDeduceType::visit(ObQueryRefRawExpr& expr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// for enumset query ref `is_set`, need warp enum_to_str/set_to_str expr at
|
||||||
|
// `ObRawExprWrapEnumSet::visit_query_ref_expr`
|
||||||
expr.set_data_type(ObIntType);
|
expr.set_data_type(ObIntType);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@ -230,6 +230,8 @@ int ObRawExprWrapEnumSet::visit(ObVarRawExpr& expr)
|
|||||||
int ObRawExprWrapEnumSet::visit(ObQueryRefRawExpr& expr)
|
int ObRawExprWrapEnumSet::visit(ObQueryRefRawExpr& expr)
|
||||||
{
|
{
|
||||||
UNUSED(expr);
|
UNUSED(expr);
|
||||||
|
// QueryRef expr for the children of `ObOpRawExpr` will be visited at `visit_query_ref_expr`.
|
||||||
|
// because it depends on the input_type of the parent node.
|
||||||
return OB_SUCCESS;
|
return OB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,8 +295,14 @@ int ObRawExprWrapEnumSet::visit(ObOpRawExpr& expr)
|
|||||||
ObRawExpr* param_expr = expr.get_param_expr(i);
|
ObRawExpr* param_expr = expr.get_param_expr(i);
|
||||||
ObObjType calc_type = expr.get_input_types().at(i).get_calc_type();
|
ObObjType calc_type = expr.get_input_types().at(i).get_calc_type();
|
||||||
ObSysFunRawExpr* new_expr = NULL;
|
ObSysFunRawExpr* new_expr = NULL;
|
||||||
if (OB_FAIL(
|
if (param_expr->is_query_ref_expr() && !ob_is_enumset_tc(param_expr->get_data_type())) {
|
||||||
wrap_type_to_str_if_necessary(param_expr, calc_type, get_current_level(), is_same_need, new_expr))) {
|
ObQueryRefRawExpr *query_ref_expr = static_cast<ObQueryRefRawExpr *>(param_expr);
|
||||||
|
OZ(visit_query_ref_expr(*query_ref_expr, calc_type, is_same_need));
|
||||||
|
} else if (OB_FAIL(wrap_type_to_str_if_necessary(param_expr,
|
||||||
|
calc_type,
|
||||||
|
get_current_level(),
|
||||||
|
is_same_need,
|
||||||
|
new_expr))) {
|
||||||
LOG_WARN("failed to wrap_type_to_str_if_necessary", K(i), K(ret));
|
LOG_WARN("failed to wrap_type_to_str_if_necessary", K(i), K(ret));
|
||||||
} else if ((NULL != new_expr) && OB_FAIL(expr.replace_param_expr(i, new_expr))) {
|
} else if ((NULL != new_expr) && OB_FAIL(expr.replace_param_expr(i, new_expr))) {
|
||||||
LOG_WARN("replace param expr failed", K(ret));
|
LOG_WARN("replace param expr failed", K(ret));
|
||||||
@ -830,5 +838,38 @@ int ObRawExprWrapEnumSet::wrap_nullif_expr(ObSysFunRawExpr& expr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObRawExprWrapEnumSet::visit_query_ref_expr(
|
||||||
|
ObQueryRefRawExpr &expr, const ObObjType dest_type, const bool is_same_need)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
if (!expr.has_enum_set_column()) {
|
||||||
|
// no-op if expr doesn't have enumset column
|
||||||
|
} else if (1 == expr.get_output_column() && expr.is_set() &&
|
||||||
|
ob_is_enumset_tc(expr.get_column_types().at(0).get_type())) {
|
||||||
|
ObSelectStmt *ref_stmt = expr.get_ref_stmt();
|
||||||
|
if (OB_ISNULL(ref_stmt)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("ref_stmt should not be NULL", K(expr), K(ret));
|
||||||
|
} else if (OB_UNLIKELY(1 != ref_stmt->get_select_item_size())) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("select item size should be 1", "size", ref_stmt->get_select_item_size(), K(expr), K(ret));
|
||||||
|
} else if (OB_ISNULL(ref_stmt->get_select_item(0).expr_)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("expr of select item is NULL", K(expr), K(ret));
|
||||||
|
} else {
|
||||||
|
ObRawExpr *enumset_expr = ref_stmt->get_select_item(0).expr_;
|
||||||
|
ObSysFunRawExpr *new_expr = NULL;
|
||||||
|
if (OB_FAIL(
|
||||||
|
wrap_type_to_str_if_necessary(enumset_expr, dest_type, get_current_level(), is_same_need, new_expr))) {
|
||||||
|
LOG_WARN("failed to wrap_type_to_str_if_necessary", K(ret));
|
||||||
|
} else if (NULL != new_expr) {
|
||||||
|
// replace with new wrapped expr
|
||||||
|
ref_stmt->get_select_item(0).expr_ = new_expr;
|
||||||
|
} else { /*do nothing*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
} // namespace sql
|
} // namespace sql
|
||||||
} // namespace oceanbase
|
} // namespace oceanbase
|
||||||
|
|||||||
@ -60,6 +60,9 @@ private:
|
|||||||
int wrap_sub_select(ObInsertStmt& stmt);
|
int wrap_sub_select(ObInsertStmt& stmt);
|
||||||
int wrap_value_vector(ObInsertStmt& stmt);
|
int wrap_value_vector(ObInsertStmt& stmt);
|
||||||
int wrap_nullif_expr(ObSysFunRawExpr& expr);
|
int wrap_nullif_expr(ObSysFunRawExpr& expr);
|
||||||
|
int visit_query_ref_expr(ObQueryRefRawExpr &expr,
|
||||||
|
const common::ObObjType dest_type,
|
||||||
|
const bool is_same_need);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int32_t current_level_;
|
int32_t current_level_;
|
||||||
|
|||||||
Reference in New Issue
Block a user