diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index b1956e1a9b..86b8658992 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -8719,17 +8719,30 @@ int ObDMLResolver::resolve_json_table_regular_column(const ParseNode &parse_tree ret = OB_ERR_UNEXPECTED; LOG_WARN("json table error node should not be null", K(ret)); } else { - const ParseNode* error_node = on_err_node->children_[2]; - const ParseNode* empty_node = on_err_node->children_[0]; + ParseNode* error_node = NULL; + ParseNode* empty_node = NULL; + ParseNode *empty_default_value = NULL; + ParseNode *error_default_value = NULL; + if (on_err_node->children_[0]->is_input_quoted_ == 1) { // empty error clause order + empty_node = on_err_node->children_[2]; + empty_default_value = on_err_node->children_[3]; + error_node = on_err_node->children_[0]; + error_default_value = on_err_node->children_[1]; + } else { + empty_node = on_err_node->children_[0]; + empty_default_value = on_err_node->children_[1]; + error_node = on_err_node->children_[2]; + error_default_value = on_err_node->children_[3]; + } const ParseNode* mismatch_node = on_err_node->children_[4]; - if (OB_ISNULL(error_node) || OB_ISNULL(empty_node) || OB_ISNULL(mismatch_node)) { + if (OB_ISNULL(error_node) || OB_ISNULL(empty_node) + || OB_ISNULL(mismatch_node) + || OB_ISNULL(empty_default_value) + || OB_ISNULL(error_default_value)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("error node is null", K(ret)); } else if (error_node->value_ == 2) { - if (OB_ISNULL(on_err_node->children_[3])) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("default expr node is null", K(ret)); - } else if (OB_FAIL(resolve_sql_expr(*(on_err_node->children_[3]), error_expr))) { + if (OB_FAIL(resolve_sql_expr(*(error_default_value), error_expr))) { LOG_WARN("resolver sql expr fail", K(ret)); } else if (OB_ISNULL(error_expr)) { ret = OB_ERR_UNEXPECTED; @@ -8762,10 +8775,7 @@ int ObDMLResolver::resolve_json_table_regular_column(const ParseNode &parse_tree // empty default value if (OB_FAIL(ret)) { } else if (empty_node->value_ == 2) { - if (OB_ISNULL(on_err_node->children_[1])) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("default empty node is null", K(ret)); - } else if (OB_FAIL(resolve_sql_expr(*(on_err_node->children_[1]), empty_expr))) { + if (OB_FAIL(resolve_sql_expr(*(empty_default_value), empty_expr))) { LOG_WARN("resolver sql expr fail", K(ret)); } else { uint64_t extra = empty_expr->get_extra(); diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index cf3d29edb7..d182a2186a 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -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)); }