diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 2f03bb8d6..57a1e7efd 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -13116,7 +13116,7 @@ int ObDDLService::check_is_offline_ddl(ObAlterTableArg &alter_table_arg, } if (OB_SUCC(ret) && is_double_table_long_running_ddl(ddl_type)) { bool has_index_operation = false; - bool has_fts_index = false; + bool has_fts_or_multivalue_index = false; bool is_adding_constraint = false; bool is_column_store = false; uint64_t table_id = alter_table_arg.alter_table_schema_.get_table_id(); @@ -13133,19 +13133,19 @@ int ObDDLService::check_is_offline_ddl(ObAlterTableArg &alter_table_arg, table_id, has_index_operation))) { LOG_WARN("check has index operation failed", K(ret)); - } else if (OB_FAIL(check_has_fts_index(schema_guard, + } else if (OB_FAIL(check_has_domain_index(schema_guard, tenant_id, table_id, - has_fts_index))) { + has_fts_or_multivalue_index))) { LOG_WARN("check has fts index failed", K(ret)); } else if (OB_FAIL(check_is_adding_constraint(tenant_id, table_id, is_adding_constraint))) { LOG_WARN("failed to call check_is_adding_constraint", K(ret)); } else if (has_index_operation) { ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "The DDL cannot be run concurrently with creating index."); - } else if (has_fts_index) { + } else if (has_fts_or_multivalue_index) { ret = OB_NOT_SUPPORTED; - LOG_USER_ERROR(OB_NOT_SUPPORTED, "Run this DDL operation on table with fulltext search index"); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Run this DDL operation on table with fulltext search index or multivalue index."); } else if (is_adding_constraint) { ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "The DDL cannot be run concurrently with adding constraint."); @@ -13155,7 +13155,7 @@ int ObDDLService::check_is_offline_ddl(ObAlterTableArg &alter_table_arg, return ret; } -int ObDDLService::check_has_fts_index( +int ObDDLService::check_has_domain_index( ObSchemaGetterGuard &schema_guard, const uint64_t tenant_id, const uint64_t data_table_id, @@ -14405,18 +14405,18 @@ int ObDDLService::check_alter_partitions(const ObTableSchema &orig_table_schema, LOG_WARN("split partition in 4.0 not allowed", K(ret), K(tablegroup_id)); LOG_USER_ERROR(OB_OP_NOT_ALLOW, "split partition in 4.0"); } - bool has_fts_index = false; + bool has_fts_or_multivalue_index = false; const int64_t table_id = orig_table_schema.get_table_id(); if (OB_FAIL(ret)) { - } else if (OB_FAIL(check_has_fts_index(schema_guard, + } else if (OB_FAIL(check_has_domain_index(schema_guard, tenant_id, table_id, - has_fts_index))) { + has_fts_or_multivalue_index))) { LOG_WARN("failed to check if have fts index", K(ret), K(table_id)); - } else if (has_fts_index) { + } else if (has_fts_or_multivalue_index) { ret = OB_NOT_SUPPORTED; - LOG_WARN("alter partition operation on table with fts index not supported", K(ret), K(orig_table_schema)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "alter partition operation on table with fts index"); + LOG_WARN("alter partition operation on table with fulltext or multivalue index not supported", K(ret), K(orig_table_schema)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "alter partition operation on table with fulltext or multivalue index"); } if (OB_FAIL(ret)) { diff --git a/src/rootserver/ob_ddl_service.h b/src/rootserver/ob_ddl_service.h index 8bc159a49..92f94b7c7 100644 --- a/src/rootserver/ob_ddl_service.h +++ b/src/rootserver/ob_ddl_service.h @@ -1285,7 +1285,7 @@ private: const ObTableSchema &table_schema, uint64_t &tablet_cnt); - int check_has_fts_index( + int check_has_domain_index( ObSchemaGetterGuard &schema_guard, const uint64_t tenant_id, const uint64_t data_table_id, diff --git a/src/sql/das/ob_das_domain_utils.cpp b/src/sql/das/ob_das_domain_utils.cpp index a7852555e..76456b563 100644 --- a/src/sql/das/ob_das_domain_utils.cpp +++ b/src/sql/das/ob_das_domain_utils.cpp @@ -341,7 +341,6 @@ int ObDASDomainUtils::generate_multivalue_index_rows(ObIAllocator &allocator, if (OB_FAIL(get_pure_mutivalue_data(json_str, data, data_len, record_num))) { LOG_WARN("failed to parse binary.", K(ret), K(json_str)); } else if (record_num == 0) { - ret = OB_ITER_END; } else if (OB_FAIL(calc_save_rowkey_policy(allocator, das_ctdef, row_projector, dml_row, record_num, is_save_rowkey))) { LOG_WARN("failed to calc store policy.", K(ret), K(data_table_rowkey_cnt)); @@ -362,13 +361,19 @@ int ObDASDomainUtils::generate_multivalue_index_rows(ObIAllocator &allocator, } for(uint64_t j = 0; OB_SUCC(ret) && j < column_num; j++) { obj_arr[j].set_nop_value(); - const ObObjMeta &col_type = das_ctdef.column_types_.at(j); + ObObjMeta col_type = das_ctdef.column_types_.at(j); const ObAccuracy &col_accuracy = das_ctdef.column_accuracys_.at(j); int64_t projector_idx = row_projector.at(j); if (multivalue_idx == projector_idx) { if (OB_FAIL(obj_arr[j].deserialize(data, data_len, pos))) { LOG_WARN("failed to deserialize datum.", K(ret), K(json_str)); } else { + if (ob_is_numeric_type(col_type.get_type()) || ob_is_temporal_type(col_type.get_type())) { + col_type.set_collation_level(CS_LEVEL_NUMERIC); + } else { + col_type.set_collation_level(CS_LEVEL_IMPLICIT); + } + obj_arr[j].set_collation_level(col_type.get_collation_level()); obj_arr[j].set_collation_type(col_type.get_collation_type()); obj_arr[j].set_type(col_type.get_type()); diff --git a/src/sql/engine/expr/ob_expr_json_contains.cpp b/src/sql/engine/expr/ob_expr_json_contains.cpp index 401e7d175..7767226b1 100644 --- a/src/sql/engine/expr/ob_expr_json_contains.cpp +++ b/src/sql/engine/expr/ob_expr_json_contains.cpp @@ -49,6 +49,11 @@ int ObExprJsonContains::calc_result_typeN(ObExprResType& type, type.set_precision(DEFAULT_PRECISION_FOR_BOOL); type.set_scale(ObAccuracy::DDL_DEFAULT_ACCURACY[ObIntType].scale_); + if (ob_is_string_type(types_stack[1].get_type())) { + types_stack[1].set_calc_type(ObJsonType); + types_stack[1].set_calc_collation_type(CS_TYPE_UTF8MB4_BIN); + } + // set type for json_path if (OB_SUCC(ret) && param_num == 3) { if (OB_FAIL(ObJsonExprHelper::is_valid_for_path(types_stack, 2))) { diff --git a/src/sql/engine/expr/ob_expr_json_overlaps.cpp b/src/sql/engine/expr/ob_expr_json_overlaps.cpp index 8b461e5e0..ee9e608c5 100644 --- a/src/sql/engine/expr/ob_expr_json_overlaps.cpp +++ b/src/sql/engine/expr/ob_expr_json_overlaps.cpp @@ -43,6 +43,16 @@ int ObExprJsonOverlaps::calc_result_type2(ObExprResType &type, type.set_int32(); type.set_precision(DEFAULT_PRECISION_FOR_BOOL); type.set_scale(ObAccuracy::DDL_DEFAULT_ACCURACY[ObIntType].scale_); + + if (ob_is_string_type(type1.get_type()) && type1.get_collation_type() != CS_TYPE_BINARY) { + type1.set_calc_type(ObJsonType); + type1.set_calc_collation_type(CS_TYPE_UTF8MB4_BIN); + } + + if (ob_is_string_type(type2.get_type()) && type2.get_collation_type() != CS_TYPE_BINARY) { + type2.set_calc_type(ObJsonType); + type2.set_calc_collation_type(CS_TYPE_UTF8MB4_BIN); + } return ret; } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 98fe0eb83..00e94770c 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -17390,11 +17390,11 @@ int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, Joine ret = OB_ERR_UNEXPECTED; STORAGE_FTS_LOG(WARN, "unexpected null", K(ret)); } else if (!left_table->is_basic_table()) { - if (OB_FAIL(ObTransformUtils::check_table_with_fulltext_recursively(const_cast(left_table), + if (OB_FAIL(ObTransformUtils::check_table_with_fts_or_multivalue_recursively(const_cast(left_table), schema_checker_, session_info_, has_table_with_fulltext_index))) { - STORAGE_FTS_LOG(WARN, "fail to check table with fulltext recursively", K(ret)); + STORAGE_FTS_LOG(WARN, "fail to check table with fulltext or mutivalue recursively", K(ret)); } else if (has_table_with_fulltext_index) { ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "complex dml operations on table with fulltext index"); diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 92f9d1d89..fddad0f37 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -4109,8 +4109,8 @@ bool ObSysFunRawExpr::inner_json_expr_same_as( } if (OB_ISNULL(r_param_expr)) { } else if (r_param_expr->is_wrappered_json_extract()) { - r_param_expr = r_param_expr->get_param_expr(0)->get_param_expr(1); r_column_expr = r_param_expr->get_param_expr(0)->get_param_expr(0); + r_param_expr = r_param_expr->get_param_expr(0)->get_param_expr(1); } else if (r_param_expr->get_expr_type() == T_FUN_SYS_JSON_EXTRACT) { r_column_expr = r_param_expr->get_param_expr(0); r_param_expr = r_param_expr->get_param_expr(1); diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 539eba441..abb493201 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -10171,15 +10171,15 @@ int ObTransformPreProcess::disable_complex_dml_for_fulltext_index(ObDMLStmt *stm // do nothing } else { for (int64_t i = 0; OB_SUCC(ret) && !has_table_with_fulltext_index && i < tables_to_check.count(); ++i) { - if (OB_FAIL(ObTransformUtils::check_table_with_fulltext_recursively(tables_to_check.at(i), + if (OB_FAIL(ObTransformUtils::check_table_with_fts_or_multivalue_recursively(tables_to_check.at(i), ctx_->schema_checker_, ctx_->session_info_, has_table_with_fulltext_index))) { - LOG_WARN("failed to check table with fulltext recursively", K(ret)); + LOG_WARN("failed to check table with fulltext or mutivalue recursively", K(ret)); } else if (has_table_with_fulltext_index) { ret = OB_NOT_SUPPORTED; - LOG_USER_ERROR(OB_NOT_SUPPORTED, "complex dml operations on table with fulltext index"); - LOG_WARN("not supported complex dml operations on table with fulltext index", K(ret)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "complex dml operations on table with fulltext or multivalue index"); + LOG_WARN("not supported complex dml operations on table with fulltext or mutivalue index", K(ret)); } } } diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 625bd1a48..ab8365ec1 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -15359,10 +15359,10 @@ bool ObTransformUtils::is_const_null(ObRawExpr &expr) return bret; } -int ObTransformUtils::check_table_with_fulltext_recursively(TableItem *table, +int ObTransformUtils::check_table_with_fts_or_multivalue_recursively(TableItem *table, ObSchemaChecker *schema_checker, ObSQLSessionInfo *session_info, - bool &has_fulltext_index) + bool &has_fts_or_multivalue_index) { int ret = OB_SUCCESS; if (OB_ISNULL(table) || OB_ISNULL(schema_checker) || OB_ISNULL(session_info)) { @@ -15374,12 +15374,12 @@ int ObTransformUtils::check_table_with_fulltext_recursively(TableItem *table, LOG_WARN("unexpected null", K(ret)); } else { ObIArray &tables = table->ref_query_->get_table_items(); - for (int64_t i = 0; OB_SUCC(ret) && !has_fulltext_index && i < tables.count(); ++i) { - if (SMART_CALL(check_table_with_fulltext_recursively(tables.at(i), + for (int64_t i = 0; OB_SUCC(ret) && !has_fts_or_multivalue_index && i < tables.count(); ++i) { + if (SMART_CALL(check_table_with_fts_or_multivalue_recursively(tables.at(i), schema_checker, session_info, - has_fulltext_index))) { - LOG_WARN("failed to check table with fulltext recursively", K(ret)); + has_fts_or_multivalue_index))) { + LOG_WARN("failed to check table with fulltext or multivalue recursively", K(ret)); } } } @@ -15390,22 +15390,26 @@ int ObTransformUtils::check_table_with_fulltext_recursively(TableItem *table, table_schema))) { LOG_WARN("failed to get table schema", K(ret)); } else if (OB_FAIL(table_schema->check_has_fts_index(*schema_checker->get_schema_guard(), - has_fulltext_index))) { + has_fts_or_multivalue_index))) { LOG_WARN("failed to check has fts index", K(ret)); + } else if (has_fts_or_multivalue_index) { + } else if (OB_FAIL(table_schema->check_has_multivalue_index(*schema_checker->get_schema_guard(), + has_fts_or_multivalue_index))) { + LOG_WARN("failed to check has multivalue.", K(ret)); } } else if (table->is_joined_table()) { JoinedTable *joined_table = static_cast(table); - if (OB_FAIL(SMART_CALL(check_table_with_fulltext_recursively(joined_table->left_table_, + if (OB_FAIL(SMART_CALL(check_table_with_fts_or_multivalue_recursively(joined_table->left_table_, schema_checker, session_info, - has_fulltext_index)))) { + has_fts_or_multivalue_index)))) { LOG_WARN("failed to check left table", K(ret)); - } else if (has_fulltext_index) { + } else if (has_fts_or_multivalue_index) { // do nothing - } else if (OB_FAIL(SMART_CALL(check_table_with_fulltext_recursively(joined_table->right_table_, + } else if (OB_FAIL(SMART_CALL(check_table_with_fts_or_multivalue_recursively(joined_table->right_table_, schema_checker, session_info, - has_fulltext_index)))) { + has_fts_or_multivalue_index)))) { LOG_WARN("failed to check right table", K(ret)); } } diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index b38f577f8..1309a32ec 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -1888,10 +1888,10 @@ public: static bool is_const_null(ObRawExpr &expr); static bool is_full_group_by(ObSelectStmt& stmt, ObSQLMode mode); - static int check_table_with_fulltext_recursively(TableItem *table, + static int check_table_with_fts_or_multivalue_recursively(TableItem *table, ObSchemaChecker *schema_checker, ObSQLSessionInfo *session_info, - bool &has_fulltext_index); + bool &has_fts_or_multivalue_index); static int add_aggr_winfun_expr(ObSelectStmt *stmt, ObRawExpr *expr); static int expand_mview_table(ObTransformerCtx *ctx, ObDMLStmt *upper_stmt, TableItem *rt_mv_table);