diff --git a/src/share/datum/ob_datum_funcs.cpp b/src/share/datum/ob_datum_funcs.cpp index 4b6f7cb80c..95b31b63ab 100644 --- a/src/share/datum/ob_datum_funcs.cpp +++ b/src/share/datum/ob_datum_funcs.cpp @@ -525,18 +525,12 @@ struct DatumUDTHashCalculator : public DefHashMethod { static int calc_datum_hash(const ObDatum &datum, const uint64_t seed, uint64_t &res) { - UNUSED(datum); - UNUSED(seed); - UNUSED(res); - return OB_NOT_SUPPORTED; + return datum_lob_locator_hash(datum, CS_TYPE_UTF8MB4_BIN, seed, T::is_varchar_hash ? T::hash : NULL, res); } static int calc_datum_hash_v2(const ObDatum &datum, const uint64_t seed, uint64_t &res) { - UNUSED(datum); - UNUSED(seed); - UNUSED(res); - return OB_NOT_SUPPORTED; + return datum_lob_locator_hash(datum, CS_TYPE_UTF8MB4_BIN, seed, T::is_varchar_hash ? T::hash : NULL, res); } }; diff --git a/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp b/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp index 5fc8051f56..6481ef73a8 100644 --- a/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp +++ b/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp @@ -599,6 +599,7 @@ int ObMultiTableInsertResolver::mock_values_column_ref(const ObColumnRefRawExpr value_desc->set_dependant_expr(const_cast(column_ref->get_dependant_expr())); value_desc->set_ref_id(table_info.table_id_, column_ref->get_column_id()); value_desc->set_column_attr(ObString::make_string(OB_VALUES), column_ref->get_column_name()); + value_desc->set_udt_set_id(column_ref->get_udt_set_id()); if (ob_is_enumset_tc(column_ref->get_result_type().get_type ()) && OB_FAIL(value_desc->set_enum_set_values(column_ref->get_enum_set_values()))) { LOG_WARN("failed to set_enum_set_values", K(*column_ref), K(ret)); diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 7c25f89cc7..f7664d0c32 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -1966,6 +1966,8 @@ int ObRawExprDeduceType::check_group_aggr_param(ObAggFunRawExpr &expr) && T_FUN_GROUP_CONCAT != expr.get_expr_type() && T_FUN_GROUP_PERCENT_RANK != expr.get_expr_type() && T_FUN_GROUP_RANK != expr.get_expr_type())) + && !(ob_is_user_defined_sql_type(param_expr->get_data_type()) + && (T_FUN_APPROX_COUNT_DISTINCT == expr.get_expr_type() || T_FUN_APPROX_COUNT_DISTINCT_SYNOPSIS == expr.get_expr_type())) && !(T_FUN_COUNT == expr.get_expr_type() && ob_is_json(param_expr->get_data_type())) && !(T_FUN_COUNT == expr.get_expr_type() && (ob_is_user_defined_sql_type(param_expr->get_data_type()) || ob_is_user_defined_pl_type(param_expr->get_data_type()))) @@ -3024,10 +3026,16 @@ int ObRawExprDeduceType::set_xmlagg_result_type(ObAggFunRawExpr &expr, ret = OB_ERR_NO_ORDER_MAP_SQL; LOG_WARN("cannot ORDER objects without MAP or ORDER method", K(ret)); } - } else if (order_expr->get_result_type().get_type() == ObUserDefinedSQLType - || order_expr->get_result_type().get_type() == ObExtendType) { - ret = OB_ERR_NO_ORDER_MAP_SQL; - LOG_WARN("cannot ORDER objects without MAP or ORDER method", K(ret)); + } else { + ObObjType result_type = order_expr->get_result_type().get_type(); + if (result_type == ObUserDefinedSQLType || result_type == ObExtendType) { + ret = OB_ERR_NO_ORDER_MAP_SQL; + LOG_WARN("cannot ORDER objects without MAP or ORDER method", K(ret)); + } else if (ob_is_text_tc(result_type) || + ob_is_lob_tc(result_type)) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("Column of LOB type cannot be used for sorting", K(ret)); + } } } diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index d85d45f1d0..6645ddd015 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -6932,23 +6932,36 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray LOG_TRACE("succeed to do const propagation for assignment expr", K(is_happened)); } - } else if (stmt->get_stmt_type() == stmt::T_INSERT) { - ObInsertStmt *insert_stmt = static_cast(stmt); - common::ObIArray &value_vector = insert_stmt->get_values_vector(); - int64_t column_count = insert_stmt->get_values_desc().count(); - int64_t row_count = insert_stmt->get_values_vector().count() / column_count; + } else if (stmt->get_stmt_type() == stmt::T_INSERT || stmt->get_stmt_type() == stmt::T_INSERT_ALL) { + ObDelUpdStmt *insert_stmt = static_cast(stmt); + // common::ObIArray &value_vector = insert_stmt->get_values_vector(); + // int64_t column_count = insert_stmt->get_values_desc().count(); + // int64_t row_count = insert_stmt->get_values_vector().count() / column_count; + ObInsertAllStmt *insert_all_stmt = static_cast(stmt); + ObInsertStmt *single_insert_stmt = static_cast(stmt); + common::ObArray table_info_arr; + if (stmt->get_stmt_type() == stmt::T_INSERT) { + table_info_arr.push_back(&(single_insert_stmt->get_insert_table_info())); + } else { + ObIArray &table_infos = insert_all_stmt->get_insert_all_table_info(); + for (int64_t i = 0; i < table_infos.count(); i++) { + table_info_arr.push_back(table_infos.at(i)); + } + } - for (int64_t i = 0; OB_SUCC(ret) && i < insert_stmt->get_insert_table_info().column_exprs_.count(); ++i) { - ObColumnRefRawExpr *col = insert_stmt->get_insert_table_info().column_exprs_.at(i); + for (int64_t count = 0; OB_SUCC(ret) && count < table_info_arr.count(); ++count) { + ObInsertTableInfo *table_info = table_info_arr.at(count); + for (int64_t i = 0; OB_SUCC(ret) && i < table_info->column_exprs_.count(); ++i) { + ObColumnRefRawExpr *col = table_info->column_exprs_.at(i); if (col->is_xml_column()) { - if (OB_FAIL(set_hidd_col_not_null_attr(*col, insert_stmt->get_insert_table_info().column_exprs_))) { + if (OB_FAIL(set_hidd_col_not_null_attr(*col, table_info->column_exprs_))) { LOG_WARN("failed to set hidden column not null attr", K(ret)); } } } - for (int64_t i = 0; OB_SUCC(ret) && i < insert_stmt->get_values_desc().count(); ++i) { - ObColumnRefRawExpr *value_desc = insert_stmt->get_values_desc().at(i); + for (int64_t i = 0; OB_SUCC(ret) && i < table_info->values_desc_.count(); ++i) { + ObColumnRefRawExpr *value_desc = table_info->values_desc_.at(i); if (value_desc->is_xml_column()) { ObColumnRefRawExpr *hidd_col = NULL; bool need_transform = false; @@ -6960,8 +6973,8 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray LOG_WARN("failed to create udt hidden exprs", K(ret)); } else if (need_transform == false) { // do nothing - } else if (OB_FAIL(transform_udt_column_conv_function(insert_stmt->get_insert_table_info(), - insert_stmt->get_column_conv_exprs(), + } else if (OB_FAIL(transform_udt_column_conv_function(*table_info, + table_info->column_conv_exprs_, *value_desc, *hidd_col))) { LOG_WARN("failed to push back column conv exprs", K(ret)); } @@ -6969,8 +6982,8 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray } // process returning exprs if (OB_SUCC(ret) && insert_stmt->is_returning()) { - ObIArray &column_convert = insert_stmt->get_column_conv_exprs(); - const ObIArray &table_columns = insert_stmt->get_insert_table_info().column_exprs_; + ObIArray &column_convert = table_info->column_conv_exprs_; + const ObIArray &table_columns = table_info->column_exprs_; ObSEArray, 8> xml_col_idxs; // use pair to store xml col idx and its hidden col idx for (int64_t i = 0; OB_SUCC(ret) && i < table_columns.count(); i++) { ObColumnRefRawExpr *ref_col = table_columns.at(i); @@ -7009,6 +7022,7 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray } } // end if } + } } return ret; }