diff --git a/src/sql/engine/expr/ob_datum_cast.cpp b/src/sql/engine/expr/ob_datum_cast.cpp index 154d3e4374..ea598666fa 100644 --- a/src/sql/engine/expr/ob_datum_cast.cpp +++ b/src/sql/engine/expr/ob_datum_cast.cpp @@ -7720,7 +7720,8 @@ int cast_to_udt_not_support(const sql::ObExpr &expr, sql::ObEvalCtx &ctx, sql::O // other udts // ORA-00932: inconsistent datatypes: expected PLSQL INDEX TABLE got NUMBER // currently other types to udt not supported - ret = OB_ERR_INVALID_TYPE_FOR_OP; + ret = OB_ERR_INVALID_XML_DATATYPE; + LOG_USER_ERROR(OB_ERR_INVALID_XML_DATATYPE, "ANYDATA", ob_obj_type_str(in_obj_meta.get_type())); LOG_WARN_RET(ret, "not expected obj type convert", K(in_obj_meta), K(out_obj_meta), K(out_obj_meta.get_subschema_id()), K(expr.extra_)); } @@ -7753,6 +7754,17 @@ int cast_udt_to_other_not_support(const sql::ObExpr &expr, sql::ObEvalCtx &ctx, return ret; } +//////////////////////////////////////////////////////////// +// str -> udt; +CAST_FUNC_NAME(string, udt) +{ + EVAL_STRING_ARG() + { + ret = OB_NOT_SUPPORTED; + } + return ret; +} + CAST_FUNC_NAME(udt, string) { // udt(xmltype) can be null: select dump(xmlparse(document NULL)) from dual; @@ -9818,7 +9830,7 @@ ObExpr::EvalFunc OB_DATUM_CAST_ORACLE_IMPLICIT[ObMaxTC][ObMaxTC] = string_lob,/*lob*/ string_json,/*json*/ cast_not_support,/*geometry*/ - cast_to_udt_not_support,/*udt*/ + string_udt,/*udt*/ }, { /*extend -> XXX*/ @@ -10524,7 +10536,7 @@ ObExpr::EvalFunc OB_DATUM_CAST_ORACLE_EXPLICIT[ObMaxTC][ObMaxTC] = cast_inconsistent_types,/*lob*/ cast_inconsistent_types,/*json*/ cast_not_support,/*geometry*/ - cast_to_udt_not_support,/*udt*/ + string_udt,/*udt*/ }, { /*extend -> XXX*/ @@ -12539,6 +12551,9 @@ int ObDatumCaster::setup_cast_expr(const ObDatumMeta &dst_type, } } // implicit cast donot use these, so we set it all invalid. + if (ob_is_user_defined_pl_type(src_expr.obj_meta_.get_type()) && dst_type.type_ == ObUserDefinedSQLType) { + cast_expr.obj_meta_.set_sql_udt(ObXMLSqlType); + } cast_expr.parents_ = NULL; cast_expr.parent_cnt_ = 0; cast_expr.basic_funcs_ = NULL; diff --git a/src/sql/engine/expr/ob_expr_update_xml.cpp b/src/sql/engine/expr/ob_expr_update_xml.cpp index 0bedbbdbae..3c83284ddc 100644 --- a/src/sql/engine/expr/ob_expr_update_xml.cpp +++ b/src/sql/engine/expr/ob_expr_update_xml.cpp @@ -28,7 +28,7 @@ namespace sql { ObExprUpdateXml::ObExprUpdateXml(common::ObIAllocator &alloc) - : ObFuncExprOperator(alloc, T_FUN_SYS_UPDATE_XML, N_UPDATEXML, MORE_THAN_TWO, NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) + : ObFuncExprOperator(alloc, T_FUN_SYS_UPDATE_XML, N_UPDATEXML, MORE_THAN_TWO, VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) { } diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 076b9dc359..d0ec1bf387 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -6461,10 +6461,7 @@ int ObTransformPreProcess::replace_udt_assignment_exprs(ObDMLStmt *stmt, } if (OB_SUCC(ret) && assign.column_expr_->is_xml_column()) { ObRawExpr *new_value_expr = NULL; - if (value_expr->is_const_raw_expr() && - OB_FAIL(transform_udt_column_value_xml_parse(table_info, value_expr, value_expr))) { - LOG_WARN("failed to transform udt value exprs", K(ret)); - } else if (OB_FAIL(transform_udt_column_value_expr(stmt, table_info, value_expr, new_value_expr))){ + if (OB_FAIL(transform_udt_column_value_expr(stmt, table_info, value_expr, new_value_expr))){ LOG_WARN("failed to transform udt value exprs", K(ret)); } else if (OB_FAIL(ObRawExprUtils::build_column_conv_expr(*ctx_->expr_factory_, *ctx_->allocator_, @@ -6942,18 +6939,6 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray *value_desc, *hidd_col))) { LOG_WARN("failed to push back column conv exprs", K(ret)); } - for (int64_t j = 0; OB_SUCC(ret) && j < row_count; ++j) { - ObRawExpr *value_expr = value_vector.at(i + j * column_count); - ObRawExpr *new_value_expr = NULL; - if (OB_FAIL(transform_udt_column_value_xml_parse(insert_stmt->get_insert_table_info(), - value_expr, - new_value_expr))) { - LOG_WARN("failed to transform udt value exprs", K(ret)); - } else { - value_vector.at(i + j * column_count) = new_value_expr; - trans_happened = true; - } - } } } } @@ -6961,109 +6946,6 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray return ret; } -int ObTransformPreProcess::transform_udt_column_value_xml_parse(ObDmlTableInfo &table_info, ObRawExpr *old_expr, ObRawExpr *&new_expr) -{ - int ret = OB_SUCCESS; - // param 0 indicate type is document or content - // param 1 is xml text for parsing - // param 2 indicate wellformed or not - // param 3 is output format only used with xmlagg, should be removed when xml binary ready - ObSysFunRawExpr *make_xml_expr = NULL; - ObConstRawExpr *type_expr = NULL; - ObConstRawExpr *form_expr = NULL; - ObConstRawExpr *in_agg_expr = NULL; - - ObObjParam old_expr_type; - if (old_expr->get_expr_type() == T_QUESTIONMARK) { - const ParamStore ¶m_store = ctx_->exec_ctx_->get_physical_plan_ctx()->get_param_store(); - ObConstRawExpr *param_expr = static_cast(old_expr); - int64_t param_idx = param_expr->get_value().get_unknown(); - if (param_idx < 0 || param_idx >= param_store.count()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("param_idx is invalid", K(ret), K(param_idx)); - } else { - old_expr_type = param_store.at(param_idx); - } - } else { - old_expr_type.set_meta_type(old_expr->get_result_meta()); - old_expr_type.set_accuracy(old_expr->get_accuracy()); - } - - if (OB_FAIL(ret)) { - } else if (old_expr->is_xml_expr() || ob_is_user_defined_sql_type(old_expr_type.get_type())) { - // do nothing - new_expr = old_expr; - } else if (ob_is_xml_pl_type(old_expr_type.get_type(), old_expr_type.get_udt_id())) { - // add implicit cast to sql xmltype - ObCastMode cast_mode = CM_NONE; - ObExprResType sql_udt_type; - sql_udt_type.set_sql_udt(ObXMLSqlType); // set subschema id - if (OB_FAIL(ObSQLUtils::get_default_cast_mode(ctx_->session_info_, cast_mode))) { - LOG_WARN("get default cast mode failed", K(ret)); - } else if (OB_FAIL(ObRawExprUtils::try_add_cast_expr_above( - ctx_->expr_factory_, ctx_->session_info_, - *old_expr, sql_udt_type, cast_mode, new_expr))) { - LOG_WARN("try add cast expr above failed", K(ret)); - } else if (OB_FAIL(new_expr->add_flag(IS_OP_OPERAND_IMPLICIT_CAST))) { - LOG_WARN("failed to add flag", K(ret)); - } - } else if (old_expr_type.is_clob()) { - // for oracle compatibility - ret = OB_ERR_INVALID_XML_DATATYPE; - LOG_USER_ERROR(OB_ERR_INVALID_XML_DATATYPE, "ANYDATA", "CLOB"); - LOG_WARN("invalid type, expect ANYDATA", K(ret), K(old_expr_type.get_type())); - } else if (OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret)); - } else if (OB_FAIL(ctx_->expr_factory_->create_raw_expr(T_FUN_SYS_XMLPARSE, make_xml_expr))) { - LOG_WARN("failed to create fun make xml binary expr", K(ret)); - } else if (OB_ISNULL(make_xml_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("xml expr is null", K(ret)); - } else if (OB_FAIL(ctx_->expr_factory_->create_raw_expr(T_INT, type_expr))) { - LOG_WARN("create dest type expr failed", K(ret)); - } else if (OB_FAIL(ctx_->expr_factory_->create_raw_expr(T_INT, form_expr))) { - LOG_WARN("create dest type expr failed", K(ret)); - } else if (OB_FAIL(ctx_->expr_factory_->create_raw_expr(T_INT, in_agg_expr))) { - LOG_WARN("create dest type expr failed", K(ret)); - } else if (OB_ISNULL(type_expr) || OB_ISNULL(form_expr) || OB_ISNULL(in_agg_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("const expr is null", K(type_expr), K(form_expr), K(in_agg_expr)); - } else { - ObObj val; - val.set_int(0); //ObExprXmlparse::OB_XML_DOCUMENT - type_expr->set_value(val); - type_expr->set_param(val); - ObObj well_form; - well_form.set_int(0); // OB_XML_NOT_WELLFORMED - form_expr->set_value(well_form); - form_expr->set_param(well_form); - ObObj in_agg; - in_agg.set_int(0); - in_agg_expr->set_value(in_agg); - in_agg_expr->set_param(in_agg); - - if (OB_FAIL(make_xml_expr->add_param_expr(type_expr))) { - LOG_WARN("fail to add param expr", K(ret)); - } else if (OB_FAIL(make_xml_expr->add_param_expr(old_expr))) { - LOG_WARN("fail to add param expr", K(ret)); - } else if (OB_FAIL(make_xml_expr->add_param_expr(form_expr))) { - LOG_WARN("fail to add param expr", K(ret)); - } else if (OB_FAIL(make_xml_expr->add_param_expr(in_agg_expr))) { - LOG_WARN("fail to add param expr", K(ret)); - } else { - make_xml_expr->set_func_name(ObString::make_string(N_XMLPARSE)); - if (OB_FAIL(make_xml_expr->formalize(ctx_->session_info_))) { - LOG_WARN("make xml epxr formlize fail", K(ret)); - } else if (OB_FAIL(ObTransformUtils::add_const_param_constraints(make_xml_expr, ctx_))) { - LOG_WARN("failed to add const param constraints", K(ret)); - } - new_expr = make_xml_expr; - } - } - return ret; -} - int ObTransformPreProcess::transformer_rowid_expr(ObDMLStmt *stmt, bool &trans_happened) { diff --git a/src/sql/rewrite/ob_transform_pre_process.h b/src/sql/rewrite/ob_transform_pre_process.h index 6df50d7db7..02843169fa 100644 --- a/src/sql/rewrite/ob_transform_pre_process.h +++ b/src/sql/rewrite/ob_transform_pre_process.h @@ -448,7 +448,6 @@ struct DistinctObjMeta int transform_xml_binary(ObRawExpr *hidden_blob_expr, ObRawExpr *&new_expr); int transform_udt_column_value_expr(ObDMLStmt *stmt, ObDmlTableInfo &table_info, ObRawExpr *old_expr, ObRawExpr *&new_expr, ObRawExpr *hidd_expr = NULL); int transform_udt_column_conv_param_expr(ObDmlTableInfo &table_info, ObRawExpr *old_expr, ObRawExpr *&new_expr); - int transform_udt_column_value_xml_parse(ObDmlTableInfo &table_info, ObRawExpr *old_expr, ObRawExpr *&new_expr); int replace_udt_assignment_exprs(ObDMLStmt *stmt, ObDmlTableInfo &table_info, ObIArray &assignments, bool &trans_happened); int set_hidd_col_not_null_attr(const ObColumnRefRawExpr &udt_col, ObIArray &column_exprs); int check_skip_child_select_view(const ObIArray &parent_stmts, ObDMLStmt *stmt, bool &skip_for_view_table);