diff --git a/src/sql/engine/expr/ob_expr_extract_value.cpp b/src/sql/engine/expr/ob_expr_extract_value.cpp index b44175c7b6..860dd59feb 100644 --- a/src/sql/engine/expr/ob_expr_extract_value.cpp +++ b/src/sql/engine/expr/ob_expr_extract_value.cpp @@ -70,6 +70,8 @@ int ObExprExtractValue::calc_result_typeN(ObExprResType &type, if (OB_SUCC(ret)) { type.set_type(ObVarcharType); type.set_collation_type(CS_TYPE_UTF8MB4_BIN); + // length == OB_MAX_ORACLE_VARCHAR_LENGTH is not supported by generated key, use OB_MAX_VARCHAR_LENGTH_KEY instead + type.set_length(OB_MAX_VARCHAR_LENGTH_KEY); } } return ret; diff --git a/src/sql/engine/expr/ob_expr_sys_makexml.cpp b/src/sql/engine/expr/ob_expr_sys_makexml.cpp index 9e0552973b..8d614cfcbd 100644 --- a/src/sql/engine/expr/ob_expr_sys_makexml.cpp +++ b/src/sql/engine/expr/ob_expr_sys_makexml.cpp @@ -24,7 +24,7 @@ namespace sql { // Internal expression used for generate xmltype data from blob or udt with schema ObExprSysMakeXML::ObExprSysMakeXML(ObIAllocator &alloc) - : ObFuncExprOperator(alloc, T_FUN_SYS_MAKEXML, N_SYS_MAKEXML, MORE_THAN_ONE, NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) + : ObFuncExprOperator(alloc, T_FUN_SYS_MAKEXML, N_SYS_MAKEXML, MORE_THAN_ONE, VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) { } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index f95a81ebc5..f67843739a 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -1058,7 +1058,6 @@ int ObDMLResolver::check_depth_obj_access_ref(ParseNode *node, int8_t &depth, bo } else if (depth == 2 && OB_FAIL(check_column_udt_type(node))) { // cases like: a.b.fun(), a must be table alias, b must be col name, and b must be udt type LOG_WARN("not an object or REF", K(ret)); - ret = OB_ERR_NOT_OBJ_REF; // error code compatible } else { exist_fun = true; is_fun_sys = true; @@ -1433,7 +1432,7 @@ int ObDMLResolver::check_column_udt_type(ParseNode *root_node) if (OB_FAIL(get_target_column_list(columns_list, tab_str, false, tab_has_alias, table_item, false))) { LOG_WARN("parse table fail"); } else if (OB_ISNULL(table_item) || !tab_has_alias) { - ret = OB_INVALID_ARGUMENT; + ret = OB_ERR_BAD_FIELD_ERROR; LOG_WARN("get invalid table name", K(ret), K(tab_str), K(tab_has_alias)); } else { ColumnItem the_col_item; @@ -1466,25 +1465,26 @@ int ObDMLResolver::get_target_column_list(ObSEArray &target_list, bool &tab_has_alias, TableItem *&tab_item, bool is_col) { int ret = OB_SUCCESS; - ObSelectStmt *select_stmt = static_cast(stmt_); int64_t num = 0; + ObDMLStmt *stmt = static_cast(stmt_); ObArray column_items; - if (OB_ISNULL(select_stmt)) { + if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select stmt is null"); } else { - num = select_stmt->get_table_size(); + num = stmt->get_table_size(); } for (int64_t i = 0; OB_SUCC(ret) && i < num; i++) { - const TableItem *tmp_table_item = select_stmt->get_table_item(i); + const TableItem *tmp_table_item = stmt->get_table_item(i); if (OB_ISNULL(tmp_table_item)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table item is null"); } else if (OB_NOT_NULL(tab_name.ptr()) && !is_col && !all_tab && tmp_table_item->table_name_ != tab_name && tmp_table_item->alias_name_ != tab_name) { // other table should chose } else { - if (tmp_table_item->alias_name_ == tab_name || (num > 1 && tmp_table_item->table_name_ == tab_name)) { + if (tmp_table_item->alias_name_ == tab_name || + (num > 1 && tmp_table_item->table_name_ == tab_name && stmt->get_stmt_type() == stmt::T_SELECT)) { tab_has_alias = true; } 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 a89e79ad3c..c8506b7a00 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -1968,6 +1968,8 @@ int ObRawExprDeduceType::check_group_aggr_param(ObAggFunRawExpr &expr) && T_FUN_ORA_JSON_ARRAYAGG != expr.get_expr_type() && T_FUN_ORA_XMLAGG != 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()))) && T_FUN_MEDIAN != expr.get_expr_type() && T_FUN_GROUP_PERCENTILE_CONT != expr.get_expr_type() && T_FUN_GROUP_PERCENTILE_DISC != expr.get_expr_type()