bugfix : [49581233]oracle json fast parse and normal parse mismatch && xmltype cast need deep copy[49490646]

This commit is contained in:
obdev
2023-05-10 13:40:09 +00:00
committed by ob-robot
parent b28cf9ee94
commit 39e9b1b0d7
2 changed files with 53 additions and 20 deletions

View File

@ -5507,11 +5507,25 @@ int ObRawExprResolverImpl::process_json_value_node(const ParseNode *node, ObRawE
}
}
}
// if use defualt, value should not be null
// empty type i, error type i + 3 , distinct empty and error clause
ParseNode *empty_type = NULL;
ParseNode *empty_default_value = NULL;
ParseNode *error_type = NULL;
ParseNode *error_default_value = NULL;
if (node->children_[4]->is_input_quoted_ == 1) {
empty_type = node->children_[6];
empty_default_value = node->children_[7];
error_type = node->children_[4];
error_default_value = node->children_[5];
} else {
empty_type = node->children_[4];
empty_default_value = node->children_[5];
error_type = node->children_[6];
error_default_value = node->children_[7];
}
// if use defualt, value should not be null , support
if (OB_SUCC(ret)) {
const ParseNode *empty_type = node->children_[4];
if (OB_NOT_NULL(empty_type) && empty_type->value_ == 2) {
const ParseNode *empty_default_value = node->children_[5];
if (OB_NOT_NULL(empty_default_value) && empty_default_value->type_ == T_NULL) {
if (lib::is_oracle_mode()) {
ret = OB_ERR_DEFAULT_VALUE_NOT_LITERAL;
@ -5520,9 +5534,7 @@ int ObRawExprResolverImpl::process_json_value_node(const ParseNode *node, ObRawE
}
}
}
const ParseNode *error_type = node->children_[6];
if (OB_SUCC(ret) && OB_NOT_NULL(error_type) && error_type->value_ == 2) {
const ParseNode *error_default_value = node->children_[7];
if (OB_NOT_NULL(error_default_value) && error_default_value->type_ == T_NULL) {
if (lib::is_oracle_mode()) {
ret = OB_ERR_DEFAULT_VALUE_NOT_LITERAL;
@ -5547,19 +5559,30 @@ int ObRawExprResolverImpl::process_json_value_node(const ParseNode *node, ObRawE
LOG_WARN("parse mismatch has error", K(ret), K(mismatch_arr.size()));
} else {
// [json_text][json_path][returning_type][empty_type][empty_default_value][error_type][error_default_value]
ParseNode *cur_node = NULL;
for (int32_t i = 0; OB_SUCC(ret) && i < num; i++) {
cur_node = node->children_[i];
if (i == 4) {
cur_node = empty_type;
} else if (i == 5) {
cur_node = empty_default_value;
} else if (i == 6) {
cur_node = error_type;
} else if (i == 7) {
cur_node = error_default_value;
}
if (node->children_[i]->type_ == T_LINK_NODE || node->children_[i]->type_ == T_VALUE_VECTOR) {
} else {
ObRawExpr *para_expr = NULL;
CK(OB_NOT_NULL(node->children_[i]));
OZ(SMART_CALL(recursive_resolve(node->children_[i], para_expr)));
CK(OB_NOT_NULL(cur_node));
OZ(SMART_CALL(recursive_resolve(cur_node, para_expr)));
CK(OB_NOT_NULL(para_expr));
OZ(func_expr->add_param_expr(para_expr));
}
if (OB_SUCC(ret) && (i == 5 || i == 7)) {
ObRawExpr *para_expr = NULL;
CK(OB_NOT_NULL(node->children_[i]));
OZ(SMART_CALL(recursive_resolve(node->children_[i], para_expr)));
CK(OB_NOT_NULL(cur_node));
OZ(SMART_CALL(recursive_resolve(cur_node, para_expr)));
CK(OB_NOT_NULL(para_expr));
OZ(func_expr->add_param_expr(para_expr));
}