This is an automated email from the ASF dual-hosted git repository. eldenmoon pushed a commit to branch variant-sparse in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/variant-sparse by this push: new ec8d6166f87 [Fix](Variant) fix and make case stable (#50259) ec8d6166f87 is described below commit ec8d6166f8715293581ad653e156b0bf37cbcbf0 Author: lihangyu <lihan...@selectdb.com> AuthorDate: Tue Apr 22 11:52:37 2025 +0800 [Fix](Variant) fix and make case stable (#50259) 1. fix empty key in sparse column 2. fix stack use after free in `inverted_index` 3. make some case stable --- .../segment_v2/variant_column_writer_impl.cpp | 3 -- be/src/olap/tablet_schema.cpp | 7 ++-- be/src/vec/columns/column_object.cpp | 11 +++-- be/src/vec/common/schema_util.cpp | 1 - regression-test/data/variant_p0/desc.out | Bin 5529 -> 5887 bytes .../predefine/test_predefine_type_index.out | Bin 2988 -> 3018 bytes .../data/variant_p0/test_sub_path_pruning.out | Bin 5871 -> 5873 bytes ...est_variant_compaction_with_sparse_limit.groovy | 7 +++- .../suites/variant_p0/column_name.groovy | 2 +- .../suites/variant_p0/column_size_limit.groovy | 2 +- .../predefine/test_predefine_pattern.groovy | 2 +- .../predefine/test_predefine_type_index.groovy | 45 +++++++++++++++++++++ .../variant_p0/with_index/bloom_filter.groovy | 28 ++++++++----- .../suites/variant_p0/with_index/load.groovy | 13 +----- .../test_array_contains_with_inverted_index.groovy | 9 +++-- .../with_index/test_array_index_write.groovy | 8 ++-- .../test_array_inverted_index_profile.groovy | 7 ++-- 17 files changed, 96 insertions(+), 49 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/variant_column_writer_impl.cpp b/be/src/olap/rowset/segment_v2/variant_column_writer_impl.cpp index 30e098b5b60..c0edc586ac5 100644 --- a/be/src/olap/rowset/segment_v2/variant_column_writer_impl.cpp +++ b/be/src/olap/rowset/segment_v2/variant_column_writer_impl.cpp @@ -204,9 +204,6 @@ Status VariantColumnWriterImpl::_get_subcolumn_paths_from_stats(std::set<std::st it->second += size; } for (const auto& [path, size] : source_statistics->sparse_column_non_null_size) { - if (path.empty()) { - CHECK(false); - } auto it = path_to_total_number_of_non_null_values.find(path); if (it == path_to_total_number_of_non_null_values.end()) { it = path_to_total_number_of_non_null_values.emplace(path, 0).first; diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp index e4d31a28aa3..5e5f4b47580 100644 --- a/be/src/olap/tablet_schema.cpp +++ b/be/src/olap/tablet_schema.cpp @@ -1522,15 +1522,16 @@ const TabletIndex* TabletSchema::inverted_index(const TabletColumn& col) const { } // variant's typed column has it's own index else if (col.is_extracted_column()) { - const auto& path = col.path_info_ptr()->copy_pop_front().get_path(); + std::string relative_path = col.path_info_ptr()->copy_pop_front().get_path(); if (_path_set_info_map.find(col_unique_id) == _path_set_info_map.end()) { return nullptr; } const auto& path_set_info = _path_set_info_map.at(col_unique_id); - if (path_set_info.typed_path_set.find(path) == path_set_info.typed_path_set.end()) { + if (path_set_info.typed_path_set.find(relative_path) == + path_set_info.typed_path_set.end()) { return nullptr; } - return path_set_info.typed_path_set.at(path).index.get(); + return path_set_info.typed_path_set.at(relative_path).index.get(); } return nullptr; } diff --git a/be/src/vec/columns/column_object.cpp b/be/src/vec/columns/column_object.cpp index 72e8ffd3544..788d60870d8 100644 --- a/be/src/vec/columns/column_object.cpp +++ b/be/src/vec/columns/column_object.cpp @@ -1912,7 +1912,7 @@ Status ColumnObject::pick_subcolumns_to_sparse_column( continue; } if (typed_paths.find(entry->path.get_path()) != typed_paths.end()) { - LOG(INFO) << "pick " << entry->path.get_path() << " as typed column"; + VLOG_DEBUG << "pick " << entry->path.get_path() << " as typed column"; new_subcolumns.add(entry->path, entry->data); continue; } @@ -1931,7 +1931,7 @@ Status ColumnObject::pick_subcolumns_to_sparse_column( // 3. pick config::variant_max_subcolumns_count selected subcolumns for (size_t i = 0; i < std::min(size_t(_max_subcolumns_count), sorted_by_size.size()); ++i) { // if too many null values, then consider it as sparse column - if ((double)sorted_by_size[i].second < (double)num_rows * 0.95) { + if ((double)sorted_by_size[i].second < (double)num_rows * 0.99) { continue; } selected_path.insert(sorted_by_size[i].first); @@ -1939,12 +1939,15 @@ Status ColumnObject::pick_subcolumns_to_sparse_column( std::map<std::string_view, Subcolumn> remaing_subcolumns; // add selected subcolumns to new_subcolumns, otherwise add to remaining_subcolumns for (auto&& entry : subcolumns) { + if (entry->data.is_root) { + continue; + } if (selected_path.find(entry->path.get_path()) != selected_path.end()) { new_subcolumns.add(entry->path, entry->data); - LOG(INFO) << "pick " << entry->path.get_path() << " as sub column"; + VLOG_DEBUG << "pick " << entry->path.get_path() << " as sub column"; } else if (none_null_value_sizes.find(entry->path.get_path()) != none_null_value_sizes.end()) { - LOG(INFO) << "pick " << entry->path.get_path() << " as sparse column"; + VLOG_DEBUG << "pick " << entry->path.get_path() << " as sparse column"; remaing_subcolumns.emplace(entry->path.get_path(), entry->data); } } diff --git a/be/src/vec/common/schema_util.cpp b/be/src/vec/common/schema_util.cpp index 740f4854b97..c2f1022c4a3 100644 --- a/be/src/vec/common/schema_util.cpp +++ b/be/src/vec/common/schema_util.cpp @@ -692,7 +692,6 @@ Status collect_path_stats( } for (const auto& [path, size] : source_stats->sparse_column_non_null_size) { - CHECK(!path.empty()); uid_to_path_stats[column->unique_id()][path] += size; } diff --git a/regression-test/data/variant_p0/desc.out b/regression-test/data/variant_p0/desc.out index b6afa3f2101..1eff52e4484 100644 Binary files a/regression-test/data/variant_p0/desc.out and b/regression-test/data/variant_p0/desc.out differ diff --git a/regression-test/data/variant_p0/predefine/test_predefine_type_index.out b/regression-test/data/variant_p0/predefine/test_predefine_type_index.out index 16079931dcf..cffe89f0a28 100644 Binary files a/regression-test/data/variant_p0/predefine/test_predefine_type_index.out and b/regression-test/data/variant_p0/predefine/test_predefine_type_index.out differ diff --git a/regression-test/data/variant_p0/test_sub_path_pruning.out b/regression-test/data/variant_p0/test_sub_path_pruning.out index 54570025f52..175361603c8 100644 Binary files a/regression-test/data/variant_p0/test_sub_path_pruning.out and b/regression-test/data/variant_p0/test_sub_path_pruning.out differ diff --git a/regression-test/suites/fault_injection_p0/test_variant_compaction_with_sparse_limit.groovy b/regression-test/suites/fault_injection_p0/test_variant_compaction_with_sparse_limit.groovy index 4cc336a2034..7bd4fd215f1 100644 --- a/regression-test/suites/fault_injection_p0/test_variant_compaction_with_sparse_limit.groovy +++ b/regression-test/suites/fault_injection_p0/test_variant_compaction_with_sparse_limit.groovy @@ -46,6 +46,10 @@ suite("test_compaction_variant_with_sparse_limit", "nonConcurrent") { } set_be_config("variant_max_sparse_column_statistics_size", "2") + int max_subcolumns_count = Math.floor(Math.random() * 5) + if (max_subcolumns_count == 1) { + max_subcolumns_count = 0 + } def create_table = { tableName, buckets="auto", key_type="DUPLICATE" -> sql "DROP TABLE IF EXISTS ${tableName}" def var_def = "variant" @@ -59,10 +63,9 @@ suite("test_compaction_variant_with_sparse_limit", "nonConcurrent") { ) ${key_type} KEY(`k`) DISTRIBUTED BY HASH(k) BUCKETS ${buckets} - properties("replication_num" = "1", "disable_auto_compaction" = "true"); + properties("replication_num" = "1", "disable_auto_compaction" = "true", "variant_max_subcolumns_count" = "${max_subcolumns_count}"); """ } - def key_types = ["DUPLICATE", "UNIQUE", "AGGREGATE"] // def key_types = ["AGGREGATE"] for (int i = 0; i < key_types.size(); i++) { diff --git a/regression-test/suites/variant_p0/column_name.groovy b/regression-test/suites/variant_p0/column_name.groovy index 75c913181f8..4e8e7d044c6 100644 --- a/regression-test/suites/variant_p0/column_name.groovy +++ b/regression-test/suites/variant_p0/column_name.groovy @@ -18,7 +18,7 @@ suite("regression_test_variant_column_name", "variant_type"){ def table_name = "var_column_name" sql "DROP TABLE IF EXISTS ${table_name}" - int max_subcolumns_count = Math.floor(Math.random() * (3 - 1 + 1)) + 1 + int max_subcolumns_count = Math.floor(Math.random() * 4) + 1 sql """ CREATE TABLE IF NOT EXISTS ${table_name} ( k bigint, diff --git a/regression-test/suites/variant_p0/column_size_limit.groovy b/regression-test/suites/variant_p0/column_size_limit.groovy index 5e9d05b558e..153cb1a2b1e 100644 --- a/regression-test/suites/variant_p0/column_size_limit.groovy +++ b/regression-test/suites/variant_p0/column_size_limit.groovy @@ -26,7 +26,7 @@ suite("regression_test_variant_column_limit"){ ) DUPLICATE KEY(`k`) DISTRIBUTED BY HASH(k) BUCKETS 1 - properties("replication_num" = "1", "disable_auto_compaction" = "false"); + properties("replication_num" = "1", "disable_auto_compaction" = "false", "variant_max_subcolumns_count" = "0"); """ def jsonBuilder = new JsonBuilder() def root = jsonBuilder { diff --git a/regression-test/suites/variant_p0/predefine/test_predefine_pattern.groovy b/regression-test/suites/variant_p0/predefine/test_predefine_pattern.groovy index de63e71de0e..f729e24e133 100644 --- a/regression-test/suites/variant_p0/predefine/test_predefine_pattern.groovy +++ b/regression-test/suites/variant_p0/predefine/test_predefine_pattern.groovy @@ -91,7 +91,7 @@ suite("test_variant_predefine_base", "p0"){ qt_sql """ select count() from ${tableName} where cast(var['a']['*'] as string) match '789' """ qt_sql """ select count() from ${tableName} where cast(var['a']['b1'] as string) match '789' """ qt_sql """ select count() from ${tableName} where cast(var['a']['bxc'] as string) match '789' """ - qt_sql """ select count() from ${tableName} where cast(var['a']['c2323'] as string) match '789' """ +qt_sql """ select count() from ${tableName} where cast(var['a']['c2323'] as string) match '789' """ trigger_and_wait_compaction(tableName, "full") diff --git a/regression-test/suites/variant_p0/predefine/test_predefine_type_index.groovy b/regression-test/suites/variant_p0/predefine/test_predefine_type_index.groovy index 3675dabe5cf..5bbb9698a77 100644 --- a/regression-test/suites/variant_p0/predefine/test_predefine_type_index.groovy +++ b/regression-test/suites/variant_p0/predefine/test_predefine_type_index.groovy @@ -61,4 +61,49 @@ suite("test_variant_predefine_index_type", "p0"){ qt_sql """ select count() from ${tableName} where cast(var['path']['int'] as int) = 789 """ qt_sql """ select count() from ${tableName} where cast(var['path']['decimal'] as DECIMAL(15, 12)) = 789.789123456789 """ qt_sql """ select count() from ${tableName} where var['path']['string'] match 'hello' """ + + // object table + sql "DROP TABLE IF EXISTS objects" + sql """ + CREATE TABLE `objects` ( + `id` int NOT NULL, + `overflow_properties` variant< + MATCH_NAME 'color' : text, + MATCH_NAME 'tags' : array<string> + > NULL, + INDEX idx1 (`overflow_properties`) USING INVERTED PROPERTIES( "field_pattern" = "color", "support_phrase" = "true", "parser" = "english", "lower_case" = "true"), + INDEX idx2 (`overflow_properties`) USING INVERTED PROPERTIES( "field_pattern" = "tags", "support_phrase" = "true", "parser" = "english", "lower_case" = "true") + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + DISTRIBUTED BY RANDOM BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "min_load_replica_num" = "-1", + "is_being_synced" = "false", + "storage_medium" = "hdd", + "storage_format" = "V2", + "inverted_index_storage_format" = "V2", + "light_schema_change" = "true", + "enable_single_replica_compaction" = "false", + "group_commit_interval_ms" = "10000", + "group_commit_data_bytes" = "134217728", + "variant_max_subcolumns_count" = "10", + "disable_auto_compaction" = "true" + ); + """ + for (int i = 0; i < 10; i++) { + sql """ + INSERT INTO objects (id, overflow_properties) + VALUES + (6, '{"color":"Bright Red","description":"A bright red circular object with a metallic shine","shape":"Large Circle","tags":["metallic","reflective"]}'), + (7, '{"color":"Deep Blue","description":"Opaque square made of plastic in deep blue","shape":"Small Square","tags":["opaque","plastic"]}'), + (8, '{"color":"Green","description":"Tall green triangle carved from wood","shape":"Tall Triangle","tags":["matte","wood"]}'), + (9, '{"color":"Reddish Orange","description":"Glossy ceramic hexagon with reddish orange tint","shape":"Flat Hexagon","tags":["glossy","ceramic"]}'), + (10, '{"color":"Yellow","description":"Shiny yellow circular badge","shape":"Wide Circle","tags":["shiny","plastic"]}'); + """ + } + trigger_and_wait_compaction(tableName, "cumulative") + sql "set enable_match_without_inverted_index = false" + qt_sql "select count() from objects where (overflow_properties['color'] MATCH_PHRASE 'Blue')" + qt_sql "select count() from objects where (array_contains(cast(overflow_properties['tags'] as array<string>), 'plastic'))" } \ No newline at end of file diff --git a/regression-test/suites/variant_p0/with_index/bloom_filter.groovy b/regression-test/suites/variant_p0/with_index/bloom_filter.groovy index 592318d4fcb..328c65f04df 100644 --- a/regression-test/suites/variant_p0/with_index/bloom_filter.groovy +++ b/regression-test/suites/variant_p0/with_index/bloom_filter.groovy @@ -25,25 +25,31 @@ suite("regression_test_variant_with_bf", "nonConcurrent,p0"){ ) DUPLICATE KEY(`k`) DISTRIBUTED BY HASH(k) BUCKETS 1 - properties("replication_num" = "1", "bloom_filter_columns" = "v"); + properties("replication_num" = "1", "bloom_filter_columns" = "v", "bloom_filter_fpp" = "0.0001", "variant_max_subcolumns_count" = "10"); """ - sql """insert into ${table_name} values (1, '{"a" : 123456}')""" - sql """insert into ${table_name} values (2, '{"a" : 789111}')""" - sql """insert into ${table_name} values (3, '{"a" : 789111}')""" + sql """insert into var_with_bloom_filter values (1, '{"a" : 123456}')""" + sql """insert into var_with_bloom_filter values (2, '{"a" : 789111}')""" + sql """insert into var_with_bloom_filter values (3, '{"a" : 789111}')""" - sql """insert into ${table_name} values (1, '{"b" : "xxxxxxx"}')""" - sql """insert into ${table_name} values (2, '{"b" : "yyyyyyy"}')""" - sql """insert into ${table_name} values (3, '{"b" : "zzzzzzz"}')""" + sql """insert into var_with_bloom_filter values (1, '{"b" : "xxxxxxx"}')""" + sql """insert into var_with_bloom_filter values (2, '{"b" : "yyyyyyy"}')""" + sql """insert into var_with_bloom_filter values (3, '{"b" : "zzzzzzz"}')""" - sql """insert into ${table_name} values (1, '{"b" : "xxxxxxx"}')""" - sql """insert into ${table_name} values (2, '{"b" : "yyyyyyy"}')""" - sql """insert into ${table_name} values (3, '{"b" : "zzzzzzz"}')""" + sql """insert into var_with_bloom_filter values (1, '{"b" : "xxxxxxx"}')""" + sql """insert into var_with_bloom_filter values (2, '{"b" : "yyyyyyy"}')""" + sql """insert into var_with_bloom_filter values (3, '{"b" : "zzzzzzz"}')""" + + // for (int i = 0; i < 10; i++) { + // sql """insert into var_with_bloom_filter values (${i}, '{"b" : "xxxxxxx ${i}"}')""" + // sql """insert into var_with_bloom_filter values (${i}, '{"b" : "yyyyyyy ${i}"}')""" + // sql """insert into var_with_bloom_filter values (${i}, '{"b" : "zzzzzzz ${i}"}')""" + // } // trigger_and_wait_compaction("var_with_bloom_filter", "full") // try { // GetDebugPoint().enableDebugPointForAllBEs("bloom_filter_must_filter_data") // sql """ set enable_inverted_index_query = false """ - // sql "select * from var_with_bloom_filter where cast(v['a'] as int) = 789111" + // sql "select * from var_with_bloom_filter where v['b'] = 'xxxxxxx 1'" // } finally { // GetDebugPoint().disableDebugPointForAllBEs("bloom_filter_must_filter_data") // } diff --git a/regression-test/suites/variant_p0/with_index/load.groovy b/regression-test/suites/variant_p0/with_index/load.groovy index 2882bd5efea..57a6a7b4c38 100644 --- a/regression-test/suites/variant_p0/with_index/load.groovy +++ b/regression-test/suites/variant_p0/with_index/load.groovy @@ -15,18 +15,7 @@ // specific language governing permissions and limitations // under the License. -suite("regression_test_variant_with_index", "nonConcurrent"){ - def set_be_config = { key, value -> - String backend_id; - def backendId_to_backendIP = [:] - def backendId_to_backendHttpPort = [:] - getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); - - backend_id = backendId_to_backendIP.keySet()[0] - def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) - logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) - } - +suite("regression_test_variant_with_index"){ def timeout = 60000 def delta_time = 1000 def alter_res = "null" diff --git a/regression-test/suites/variant_p0/with_index/test_array_contains_with_inverted_index.groovy b/regression-test/suites/variant_p0/with_index/test_array_contains_with_inverted_index.groovy index ea5cf37e3de..c732d4a4b1f 100644 --- a/regression-test/suites/variant_p0/with_index/test_array_contains_with_inverted_index.groovy +++ b/regression-test/suites/variant_p0/with_index/test_array_contains_with_inverted_index.groovy @@ -32,8 +32,10 @@ suite("test_array_contains_with_inverted_index") { CREATE TABLE IF NOT EXISTS `${indexTblName}` ( `apply_date` date NULL COMMENT '', `id` varchar(60) NOT NULL COMMENT '', - `inventors` variant NULL COMMENT '', - INDEX index_inverted_inventors(inventors) USING INVERTED COMMENT '' + `inventors` variant< + MATCH_NAME 'inventors' : array<text> + > NULL COMMENT '', + INDEX index_inverted_inventors(inventors) USING INVERTED PROPERTIES( "field_pattern" = "inventors", "support_phrase" = "true", "parser" = "english", "lower_case" = "true") COMMENT '' ) ENGINE=OLAP DUPLICATE KEY(`apply_date`, `id`) COMMENT 'OLAP' @@ -45,7 +47,8 @@ suite("test_array_contains_with_inverted_index") { "light_schema_change" = "true", "disable_auto_compaction" = "false", "enable_single_replica_compaction" = "false", - "inverted_index_storage_format" = "$storageFormat" + "inverted_index_storage_format" = "$storageFormat", + "variant_max_subcolumns_count" = "10" ); """ diff --git a/regression-test/suites/variant_p0/with_index/test_array_index_write.groovy b/regression-test/suites/variant_p0/with_index/test_array_index_write.groovy index ba37537a8cc..9322babbf3b 100644 --- a/regression-test/suites/variant_p0/with_index/test_array_index_write.groovy +++ b/regression-test/suites/variant_p0/with_index/test_array_index_write.groovy @@ -20,10 +20,10 @@ suite("test_array_index_write", "nonConcurrent"){ def create_variant_index_table = { testTablex, parser -> def stmt = "CREATE TABLE IF NOT EXISTS " + testTablex + "(\n" + " k1 INT NULL,\n" + - " c_arr VARIANT NULL COMMENT '',\n" + " c_arr VARIANT<'c_arr' : array<text>> NULL COMMENT '',\n" - String strTmp = parser == "" ? "INDEX index_inverted_c_arr(c_arr) USING INVERTED COMMENT 'c_arr index',\n" : - "INDEX index_inverted_c_arr(c_arr) USING INVERTED PROPERTIES( \"parser\"=\" " + parser + "\") COMMENT 'c_arr index',\n" + String strTmp = parser == "" ? "INDEX index_inverted_c_arr(c_arr) USING INVERTED PROPERTIES( \"field_pattern\"=\"c_arr\") COMMENT 'c_arr index',\n" : + "INDEX index_inverted_c_arr(c_arr) USING INVERTED PROPERTIES( \"field_pattern\"=\"c_arr\", \"parser\"=\" " + parser + "\") COMMENT 'c_arr index',\n" stmt += strTmp stmt = stmt.substring(0, stmt.length()-2) @@ -32,7 +32,7 @@ suite("test_array_index_write", "nonConcurrent"){ "DUPLICATE KEY(`k1`)\n" + "COMMENT 'OLAP'\n" + "DISTRIBUTED BY HASH(`k1`) BUCKETS 10\n" + - "PROPERTIES(\"replication_num\" = \"1\", \"inverted_index_storage_format\" = \"$storageFormat\");" + "PROPERTIES(\"replication_num\" = \"1\", \"inverted_index_storage_format\" = \"$storageFormat\", \"variant_max_subcolumns_count\" = \"10\");" return stmt } diff --git a/regression-test/suites/variant_p0/with_index/test_array_inverted_index_profile.groovy b/regression-test/suites/variant_p0/with_index/test_array_inverted_index_profile.groovy index 8174a71060a..70b10d9b60f 100644 --- a/regression-test/suites/variant_p0/with_index/test_array_inverted_index_profile.groovy +++ b/regression-test/suites/variant_p0/with_index/test_array_inverted_index_profile.groovy @@ -19,7 +19,7 @@ import groovy.json.JsonSlurper import java.util.regex.Matcher; import java.util.regex.Pattern; -suite("test_variant_arrayInvertedIdx_profile", "nonConcurrent"){ +suite("test_variant_arrayInvertedIdx_profile", "p0,nonConcurrent"){ // prepare test table def indexTblName = "var_arr_idx" def httpGet = { url -> @@ -74,8 +74,8 @@ suite("test_variant_arrayInvertedIdx_profile", "nonConcurrent"){ CREATE TABLE IF NOT EXISTS `${indexTblName}` ( `apply_date` date NULL COMMENT '', `id` varchar(60) NOT NULL COMMENT '', - `inventors` variant NULL COMMENT '', - INDEX index_inverted_inventors(inventors) USING INVERTED COMMENT '' + `inventors` variant<'inventors' : array<text>> NULL COMMENT '', + INDEX index_inverted_inventors(inventors) USING INVERTED PROPERTIES( "field_pattern" = "inventors") COMMENT '' ) ENGINE=OLAP DUPLICATE KEY(`apply_date`, `id`) COMMENT 'OLAP' @@ -87,6 +87,7 @@ suite("test_variant_arrayInvertedIdx_profile", "nonConcurrent"){ "light_schema_change" = "true", "disable_auto_compaction" = "false", "enable_single_replica_compaction" = "false", + "variant_max_subcolumns_count" = "10", "inverted_index_storage_format" = "$storageFormat" ); """ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org