[cp]:sync multivalue bugfix from 431 to master

This commit is contained in:
obdev
2024-06-20 09:26:27 +00:00
committed by ob-robot
parent bf47be7c3a
commit edfad6976f
37 changed files with 873 additions and 215 deletions

View File

@ -1866,6 +1866,7 @@ int ObMulValueIndexBuilderUtil::is_multivalue_index_type(
if (std::regex_match(buf, pattern)) {
is_multi_value_index = true;
} else {
is_multi_value_index = false;
std::regex pattern1(R"(JSON_QUERY\s*\(\s*.*\s*ASIS\s*.*\s*MULTIVALUE\s*\))", std::regex_constants::icase);
if (std::regex_match(buf, pattern1)) {
is_multi_value_index = true;
@ -2052,6 +2053,7 @@ int ObMulValueIndexBuilderUtil::build_and_generate_multivalue_column_raw(
ObRawExpr *expr = nullptr;
ObColumnSchemaV2 *gen_col = nullptr;
budy_mulvalue_col = nullptr;
bool force_rebuild = false;
if (OB_FAIL(session.init(0 /*default session id*/,
0 /*default proxy id*/,
@ -2076,6 +2078,7 @@ int ObMulValueIndexBuilderUtil::build_and_generate_multivalue_column_raw(
session,
data_schema,
&schema_checker,
force_rebuild,
gen_col,
budy_mulvalue_col))) {
LOG_WARN("session load default configs failed", K(ret));
@ -2109,6 +2112,7 @@ int ObMulValueIndexBuilderUtil::build_and_generate_multivalue_column(
const ObSQLSessionInfo &session_info,
ObTableSchema &table_schema,
sql::ObSchemaChecker *schema_checker,
bool force_rebuild,
ObColumnSchemaV2 *&gen_col,
ObColumnSchemaV2 *&budy_col)
{
@ -2131,7 +2135,7 @@ int ObMulValueIndexBuilderUtil::build_and_generate_multivalue_column(
LOG_WARN("multivalue generated expr should be function, not column ref.", K(ret));
} else {
//real index expr, so generate hidden generated column in data table schema
if (OB_FAIL(generate_multivalue_column(*expr, table_schema, schema_checker->get_schema_guard(), gen_col, budy_col))) {
if (OB_FAIL(generate_multivalue_column(*expr, table_schema, schema_checker->get_schema_guard(), force_rebuild, gen_col, budy_col))) {
LOG_WARN("generate ordinary generated column failed", K(ret));
} else if (OB_FAIL(ObRawExprUtils::check_generated_column_expr_str(
gen_col->get_cur_default_value().get_string(), session_info, table_schema))) {
@ -2149,6 +2153,7 @@ int ObMulValueIndexBuilderUtil::generate_multivalue_column(
sql::ObRawExpr &expr,
ObTableSchema &data_schema,
ObSchemaGetterGuard *schema_guard,
bool force_rebuild,
ObColumnSchemaV2 *&gen_col,
ObColumnSchemaV2 *&gen_budy_col)
{
@ -2168,7 +2173,7 @@ int ObMulValueIndexBuilderUtil::generate_multivalue_column(
size_t expr_str_len = strlen(expr_def_buf);
expr_def.assign_ptr(expr_def_buf, expr_str_len);
if (OB_FAIL(data_schema.get_generated_column_by_define(expr_def,
if (!force_rebuild && OB_FAIL(data_schema.get_generated_column_by_define(expr_def,
true/*only hidden column*/,
old_gen_col))) {
LOG_WARN("get generated column by define failed", K(ret), K(expr_def));
@ -2391,6 +2396,9 @@ int ObMulValueIndexBuilderUtil::set_multivalue_index_table_columns(
common::ObOrderType order_type;
const ObColumnSchemaV2 *mvi_array_column = nullptr;
int32_t multi_column_cnt = 0;
// 2 means : multivalue column, multivalue array column
bool is_complex_index = arg.index_columns_.count() > 2;
bool is_real_unique = index_schema.is_unique_index() && !is_complex_index;
for (int64_t i = 0; OB_SUCC(ret) && i < arg.index_columns_.count(); ++i) {
const ObColumnSchemaV2 *mvi_column = nullptr;
const ObColumnSortItem &mvi_col_item = arg.index_columns_.at(i);
@ -2431,13 +2439,13 @@ int ObMulValueIndexBuilderUtil::set_multivalue_index_table_columns(
} else if (OB_ISNULL(mvi_array_column)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get multivalue array column", K(ret));
} else if (index_schema.is_unique_index()) {
} else if (is_real_unique) {
// json-array column is not index coumn, not rowkey column
index_schema.set_rowkey_column_num(row_desc.get_column_num());
index_schema.set_index_column_num(row_desc.get_column_num());
}
bool is_rowkey = !index_schema.is_unique_index();
bool is_rowkey = !is_real_unique;
bool is_index_column = is_rowkey;
const ObColumnSchemaV2 *rowkey_column = nullptr;
@ -2489,7 +2497,7 @@ int ObMulValueIndexBuilderUtil::set_multivalue_index_table_columns(
LOG_WARN("add column failed", "mvi_array_column", *mvi_array_column, K(row_desc), K(ret));
}
if (OB_SUCC(ret) && !index_schema.is_unique_index()) {
if (OB_SUCC(ret) && !is_real_unique) {
// json-array column is not index coumn, not rowkey column
index_schema.set_rowkey_column_num(row_desc.get_column_num() - 1);
index_schema.set_index_column_num(row_desc.get_column_num() - 1);