From c1d282d2f9cce528ec6240dc299cf6060af3ba43 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 16 Aug 2023 05:10:31 +0000 Subject: [PATCH] [xml bugfix] nvl bugfix --- src/sql/engine/expr/ob_expr_nvl_promotion.map | 2 +- src/sql/ob_spi.cpp | 3 ++- src/sql/resolver/dml/ob_dml_resolver.cpp | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_nvl_promotion.map b/src/sql/engine/expr/ob_expr_nvl_promotion.map index c93aeeda30..1089c5c155 100644 --- a/src/sql/engine/expr/ob_expr_nvl_promotion.map +++ b/src/sql/engine/expr/ob_expr_nvl_promotion.map @@ -1351,7 +1351,7 @@ static const ObObjType NVL_TYPE_PROMOTION_ORACLE[ObMaxTC][ObMaxTC] = }, { /*User Defined Type -> XXX*/ - ObMaxType, /*null*/ + ObUserDefinedSQLType, /*null*/ ObMaxType, /*int*/ ObMaxType, /*uint*/ ObMaxType, /*float*/ diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 56450221c9..234b1a249e 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7254,7 +7254,8 @@ int ObSPIService::convert_obj(ObPLExecCtx *ctx, } else if (!(obj.is_pl_extend() || obj.is_user_defined_sql_type() || (obj.is_null() && current_type.at(i).get_meta_type().is_user_defined_sql_type())) - && result_types[i].get_meta_type().is_ext()) { + && result_types[i].get_meta_type().is_ext() + && !ob_is_xml_pl_type(result_types[i].get_obj_type(), result_types[i].get_udt_id())) { // sql udt can cast to pl extend, null from sql udt type can cast to pl extend(xmltype) // but null may not cast to other pl extends (return error 4016 in store_datums) // support: select extract(xmlparse(document 'a'), '/b') into xml_data from dual; diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 5059f6c1d0..00a449d8f8 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -2202,6 +2202,11 @@ int ObDMLResolver::resolve_into_variables(const ParseNode *node, value_expr->get_collation_type(), into_pl_type.get_data_type()->get_obj_type(), into_pl_type.get_data_type()->get_collation_type())); + } else if (value_expr->get_data_type() == ObUserDefinedSQLType && into_pl_type.is_opaque_type()) { + // sql udt to pl extend, only support xmltype currently, dest collation type is not used + OX (is_compatible = cast_supported(value_expr->get_data_type(), + value_expr->get_collation_type(), + ObExtendType, CS_TYPE_BINARY)); } else if (value_expr->get_data_type() == ObExtendType && (!into_pl_type.is_obj_type() || (into_pl_type.get_data_type() != NULL && into_pl_type.get_data_type()->get_meta_type().is_ext()))) {