This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 6b3cb56c35d [fix](inverted index)Make build index operation only
affect base index (#36869) (#36991)
6b3cb56c35d is described below
commit 6b3cb56c35d3cfd270c01003b74c1e7493473727
Author: qiye <[email protected]>
AuthorDate: Fri Jun 28 16:57:23 2024 +0800
[fix](inverted index)Make build index operation only affect base index
(#36869) (#36991)
---
.../apache/doris/alter/SchemaChangeHandler.java | 2 +
.../test_add_drop_index_on_table_with_mv.groovy | 135 +++++++++++++++++++++
2 files changed, 137 insertions(+)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
index 976f837a311..dae99f40a36 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
@@ -2877,6 +2877,8 @@ public class SchemaChangeHandler extends AlterHandler {
// for now table's state can only be NORMAL
Preconditions.checkState(olapTable.getState() ==
OlapTableState.NORMAL, olapTable.getState().name());
+ // remove the index which is not the base index, only base index can
be built inverted index
+ indexSchemaMap.entrySet().removeIf(entry ->
!entry.getKey().equals(olapTable.getBaseIndexId()));
// begin checking each table
Map<Long, List<Column>> changedIndexIdToSchema = Maps.newHashMap();
try {
diff --git
a/regression-test/suites/inverted_index_p0/index_change/test_add_drop_index_on_table_with_mv.groovy
b/regression-test/suites/inverted_index_p0/index_change/test_add_drop_index_on_table_with_mv.groovy
new file mode 100644
index 00000000000..7b63521178e
--- /dev/null
+++
b/regression-test/suites/inverted_index_p0/index_change/test_add_drop_index_on_table_with_mv.groovy
@@ -0,0 +1,135 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_add_drop_index_on_table_with_mv") {
+ def tableName = "test_add_drop_index_on_table_with_mv"
+
+ def timeout = 60000
+ def delta_time = 1000
+ def alter_res = "null"
+ def useTime = 0
+ def wait_for_latest_op_on_table_finish = { table_name, OpTimeout ->
+ for(int t = delta_time; t <= OpTimeout; t += delta_time){
+ alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName =
"${table_name}" ORDER BY CreateTime DESC LIMIT 1;"""
+ alter_res = alter_res.toString()
+ if(alter_res.contains("FINISHED")) {
+ sleep(10000) // wait change table state to normal
+ logger.info(table_name + " latest alter job finished, detail:
" + alter_res)
+ break
+ }
+ useTime = t
+ sleep(delta_time)
+ }
+ assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish
timeout")
+ }
+
+ def wait_for_build_index_on_partition_finish = { table_name, OpTimeout ->
+ for(int t = delta_time; t <= OpTimeout; t += delta_time){
+ alter_res = sql """SHOW BUILD INDEX WHERE TableName =
"${table_name}";"""
+ def expected_finished_num = alter_res.size();
+ logger.info("expected_finished_num: " + expected_finished_num)
+ // check only base table build index job
+ assertEquals(1, expected_finished_num)
+ def finished_num = 0;
+ for (int i = 0; i < expected_finished_num; i++) {
+ logger.info(table_name + " build index job state: " +
alter_res[i][7] + i)
+ if (alter_res[i][7] == "FINISHED") {
+ ++finished_num;
+ }
+ }
+ if (finished_num == expected_finished_num) {
+ logger.info(table_name + " all build index jobs finished,
detail: " + alter_res)
+ break
+ }
+ useTime = t
+ sleep(delta_time)
+ }
+ assertTrue(useTime <= OpTimeout,
"wait_for_latest_build_index_on_partition_finish timeout")
+ }
+
+ def getJobState = { table ->
+ def jobStateResult = sql """ SHOW ALTER TABLE MATERIALIZED VIEW WHERE
TableName='${table}' ORDER BY CreateTime DESC LIMIT 1; """
+ return jobStateResult[0][8]
+ }
+
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+
+ sql """
+ CREATE TABLE ${tableName} (
+ `load_time` datetime NOT NULL COMMENT '事件发生时间',
+ `id` varchar(192) NOT NULL COMMENT '',
+ `class` varchar(192) NOT NULL COMMENT '',
+ `result` int NOT NULL COMMENT ''
+ ) ENGINE=OLAP
+ DUPLICATE KEY(`load_time`,`id`, `class`)
+ COMMENT ''
+ PARTITION BY RANGE(`load_time`)(
+ PARTITION p1 VALUES LESS THAN ("2025-01-01 00:00:00")
+ )
+ DISTRIBUTED BY HASH(`load_time`,`id`, `class`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql """ insert into ${tableName} values ('2024-03-20 10:00:00', 'a', 'b',
1) """
+
+ sql """
+ create materialized view mv_1 as
+ select
+ date_trunc(load_time, 'minute'),
+ id,
+ class,
+ count(id) as total,
+ min(result) as min_result,
+ sum(result) as max_result
+ from
+ ${tableName}
+ group by date_trunc(load_time, 'minute'), id, class;
+ """
+
+ sql """ SHOW ALTER TABLE MATERIALIZED VIEW """
+
+ max_try_secs = 60
+ while (max_try_secs--) {
+ String res = getJobState(tableName)
+ if (res == "FINISHED" || res == "CANCELLED") {
+ assertEquals("FINISHED", res)
+ sleep(3000)
+ break
+ } else {
+ Thread.sleep(2000)
+ if (max_try_secs < 1) {
+ println "test timeout," + "state:" + res
+ assertEquals("FINISHED",res)
+ }
+ }
+ }
+ // create inverted index
+ sql """ CREATE INDEX idx1 ON ${tableName}(class) USING INVERTED; """
+ wait_for_latest_op_on_table_finish(tableName, timeout)
+ def show_result = sql "show index from ${tableName}"
+ logger.info("show index from " + tableName + " result: " + show_result)
+ assertEquals(show_result.size(), 1)
+ assertEquals(show_result[0][2], "idx1")
+
+ // build index
+ sql """ BUILD INDEX idx1 ON ${tableName}; """
+
+ // wait for index build finish
+ wait_for_build_index_on_partition_finish(tableName, timeout)
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]