[vector index] not support vec and fts on same main table

This commit is contained in:
JLY2015 2024-09-24 12:18:55 +00:00 committed by ob-robot
parent 01939d43fa
commit 86258d2719
5 changed files with 63 additions and 2 deletions

View File

@ -244,6 +244,35 @@ int ObVectorIndexUtil::get_index_name_prefix(
return ret;
}
int ObVectorIndexUtil::check_table_has_vector_of_fts_index(
const ObTableSchema &data_table_schema, ObSchemaGetterGuard &schema_guard, bool &has_fts_index, bool &has_vec_index)
{
int ret = OB_SUCCESS;
ObSEArray<ObAuxTableMetaInfo, 16> simple_index_infos;
const int64_t tenant_id = data_table_schema.get_tenant_id();
has_fts_index = false;
has_vec_index = false;
if (OB_FAIL(data_table_schema.get_simple_index_infos(simple_index_infos))) {
LOG_WARN("fail to get simple index infos failed", K(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < simple_index_infos.count(); ++i) {
const ObTableSchema *index_table_schema = nullptr;
if (OB_FAIL(schema_guard.get_table_schema(tenant_id, simple_index_infos.at(i).table_id_, index_table_schema))) {
LOG_WARN("fail to get index_table_schema", K(ret), K(tenant_id), "table_id", simple_index_infos.at(i).table_id_);
} else if (OB_ISNULL(index_table_schema)) {
ret = OB_TABLE_NOT_EXIST;
LOG_WARN("index table schema should not be null", K(ret), K(simple_index_infos.at(i).table_id_));
} else if (index_table_schema->is_vec_index()) {
has_vec_index = true;
} else if (index_table_schema->is_fts_index()) {
has_fts_index = true;
}
}
}
return ret;
}
int ObVectorIndexUtil::check_column_has_vector_index(
const ObTableSchema &data_table_schema, ObSchemaGetterGuard &schema_guard, const int64_t col_id, bool &is_column_has_vector_index)
{

View File

@ -45,6 +45,11 @@ public:
static int get_index_name_prefix(
const schema::ObTableSchema &index_schema,
ObString &prefix);
static int check_table_has_vector_of_fts_index(
const ObTableSchema &data_table_schema,
ObSchemaGetterGuard &schema_guard,
bool &has_fts_index,
bool &has_vec_index);
static int check_column_has_vector_index(
const ObTableSchema &data_table_schema,
ObSchemaGetterGuard &schema_guard,

View File

@ -217,7 +217,19 @@ int ObCreateIndexResolver::resolve_index_column_node(
} else {
sort_item.prefix_len_ = 0;
}
// not support fts or vec index in same table
if (OB_SUCC(ret)) {
bool has_fts_index = false;
bool has_vec_index = false;
if (OB_FAIL(ObVectorIndexUtil::check_table_has_vector_of_fts_index(
*tbl_schema, *(schema_checker_->get_schema_guard()), has_fts_index, has_vec_index))) {
LOG_WARN("fail to check table has vec of fts index", K(ret));
} else if ((index_keyname_ == FTS_KEY && has_vec_index) || (index_keyname_ == VEC_KEY && has_fts_index)) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("vector and fts index in same main table is not support", K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "vector and fts index in same main table");
}
}
if (OB_FAIL(ret)) {
// do nothing
} else if (index_keyname_ == FTS_KEY) {

View File

@ -63,7 +63,9 @@ ObCreateTableResolver::ObCreateTableResolver(ObResolverParams &params)
index_arg_(),
current_index_name_set_(),
cur_udt_set_id_(0),
vec_index_col_ids_()
vec_index_col_ids_(),
has_vec_index_(false),
has_fts_index_(false)
{
}
@ -2618,6 +2620,8 @@ int ObCreateTableResolver::resolve_index(
SQL_RESV_LOG(WARN, "invalid argument.", K(ret), K(node->children_));
} else {
vec_index_col_ids_.reset();
has_vec_index_ = false;
has_fts_index_ = false;
for (int64_t i = 0; OB_SUCC(ret) && i < index_node_position_list.size(); ++i) {
reset();
index_attributes_set_ = OB_DEFAULT_INDEX_ATTRIBUTES_SET;
@ -2693,11 +2697,16 @@ int ObCreateTableResolver::resolve_index_node(const ParseNode *node)
bool cnt_func_index_mysql = false;
bool is_multi_value_index = false;
const bool is_vec_index = (index_keyname_ == INDEX_KEYNAME::VEC_KEY);
const bool is_fts_index = (index_keyname_ == INDEX_KEYNAME::FTS_KEY);
if (OB_FAIL(ret)) {
} else if (is_vec_index && index_column_list_node->num_child_ >= 2) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("multi column of vector index is not support yet", K(ret), K(index_column_list_node->num_child_));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "multi vector index column is");
} else if ((is_vec_index && has_fts_index_) || (is_fts_index && has_vec_index_)) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("vector index and fts coexist in main table is not support yet", K(ret), K(index_column_list_node->num_child_));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "vector index and fts coexist in main table is");
}
for (int32_t i = 0; OB_SUCC(ret) && i < index_column_list_node->num_child_; ++i) {
ObString &column_name = sort_item.column_name_;
@ -3114,6 +3123,8 @@ int ObCreateTableResolver::resolve_index_node(const ParseNode *node)
LOG_WARN("failed to append vec args", K(ret));
} else if (OB_FAIL(vec_index_col_ids_.push_back(vec_index_col_id))) {
LOG_WARN("fail to push back vec index col id", K(ret));
} else {
has_vec_index_ = true;
}
} else if (is_fts_index(index_arg_.index_type_)) {
if (OB_FAIL(ObDDLResolver::append_fts_args(resolve_result,
@ -3123,6 +3134,8 @@ int ObCreateTableResolver::resolve_index_node(const ParseNode *node)
index_arg_list,
allocator_))) {
LOG_WARN("failed to append fts args", K(ret));
} else {
has_fts_index_ = true;
}
} else if (is_multivalue_index(index_arg_.index_type_)) {
if (OB_FAIL(ObDDLResolver::append_multivalue_args(resolve_result,

View File

@ -154,6 +154,8 @@ private:
uint64_t cur_udt_set_id_;
common::ObSEArray<uint64_t, 4> vec_index_col_ids_;
bool has_vec_index_;
bool has_fts_index_;
};
} // end namespace sql