This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new 7b8a93879c2 [test](mtmv)Test and check the differences between MTMV and OLAP (#44793) 7b8a93879c2 is described below commit 7b8a93879c2fa81cb4439cc6b3f9c0f3930babc5 Author: zfr95 <zhangfur...@selectdb.com> AuthorDate: Mon Jan 6 09:57:59 2025 +0800 [test](mtmv)Test and check the differences between MTMV and OLAP (#44793) pick from #36520 pick from #44417 Co-authored-by: zhangdong <zhangd...@selectdb.com> --- .../suites/mtmv_p0/test_mtmv_outfile.groovy | 93 +++++++++ .../suites/mtmv_p0/test_mtmv_property.groovy | 217 +++++++++++++++++++++ .../mtmv_p0/test_mtmv_sql_cache_and_profile.groovy | 87 +++++++++ 3 files changed, 397 insertions(+) diff --git a/regression-test/suites/mtmv_p0/test_mtmv_outfile.groovy b/regression-test/suites/mtmv_p0/test_mtmv_outfile.groovy new file mode 100644 index 00000000000..693df86e014 --- /dev/null +++ b/regression-test/suites/mtmv_p0/test_mtmv_outfile.groovy @@ -0,0 +1,93 @@ +// 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. + +import org.junit.Assert + +suite("test_mtmv_outfile","mtmv") { + + String dbName = context.config.getDbNameByFile(context.file) + String suiteName = "test_mtmv_outfile" + String tableName = "${suiteName}_table" + String mvName = "${suiteName}_mv" + + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" + + sql """ + CREATE TABLE ${tableName} + ( + k2 INT, + k3 varchar(32) + ) + DISTRIBUTED BY HASH(k2) BUCKETS 2 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + sql """ + insert into ${tableName} values (1,1),(1,2); + """ + + sql """ + CREATE MATERIALIZED VIEW ${mvName} + BUILD DEFERRED REFRESH AUTO ON MANUAL + DISTRIBUTED BY hash(k2) BUCKETS 2 + PROPERTIES ( + 'replication_num' = '1' + ) + AS + SELECT * from ${tableName}; + """ + sql """ + REFRESH MATERIALIZED VIEW ${mvName} AUTO; + """ + + def jobName = getJobName(dbName, mvName) + waitingMTMVTaskFinished(jobName) + + // use to outfile to s3 + String ak = getS3AK() + String sk = getS3SK() + String s3_endpoint = getS3Endpoint() + String region = region = getS3Region() + String bucket = context.config.otherConfigs.get("s3BucketName"); + + def outfile_to_S3_directly = { + // select ... into outfile ... + def s3_outfile_path = "${bucket}/outfile/csv/test-mtmv-outfile" + def uri = "s3://${s3_outfile_path}/exp_" + + def res = sql """ + SELECT * FROM ${mvName} t + INTO OUTFILE "${uri}" + FORMAT AS csv + PROPERTIES ( + "s3.endpoint" = "${s3_endpoint}", + "s3.region" = "${region}", + "s3.secret_key"="${sk}", + "s3.access_key" = "${ak}" + ); + """ + logger.info("outfile to s3 success path: " + res[0][3]); + } + + outfile_to_S3_directly() + + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" +} diff --git a/regression-test/suites/mtmv_p0/test_mtmv_property.groovy b/regression-test/suites/mtmv_p0/test_mtmv_property.groovy new file mode 100644 index 00000000000..4dceb3f3162 --- /dev/null +++ b/regression-test/suites/mtmv_p0/test_mtmv_property.groovy @@ -0,0 +1,217 @@ +// 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. + +import org.junit.Assert; + +suite("test_mtmv_property","mtmv") { + if (isCloudMode()) { + return + } + String dbName = context.config.getDbNameByFile(context.file) + String suiteName = "test_mtmv_property" + String tableName = "${suiteName}_table" + String mvName = "${suiteName}_mv" + + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" + + sql """ + CREATE TABLE ${tableName} + ( + k2 INT, + k3 varchar(32) + ) + DISTRIBUTED BY HASH(k2) BUCKETS 2 + PROPERTIES ( + "replication_num" = "1" + ); + """ + sql """ + CREATE MATERIALIZED VIEW ${mvName} + BUILD DEFERRED REFRESH AUTO ON MANUAL + DISTRIBUTED BY hash(k2) BUCKETS 2 + PROPERTIES ( + 'replication_num' = '1', + 'store_row_column' = 'true', + 'skip_write_index_on_load' = 'false', + "binlog.enable" = "false", + "binlog.ttl_seconds" = "86400", + "binlog.max_bytes" = "9223372036854775807", + "binlog.max_history_nums" = "9223372036854775807", + "enable_duplicate_without_keys_by_default" = "true" + ) + AS + SELECT * from ${tableName}; + """ + + def showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + // Cannot compare the number of replicas to 1, as the pipeline may force the number of replicas to be set + assertTrue(showCreateTableResult.toString().contains('tag.location.default:')) + assertTrue(showCreateTableResult.toString().contains('"min_load_replica_num" = "-1"')) + assertTrue(showCreateTableResult.toString().contains('"storage_medium" = "hdd"')) + assertTrue(showCreateTableResult.toString().contains('"store_row_column" = "true"')) + assertTrue(showCreateTableResult.toString().contains('"enable_duplicate_without_keys_by_default" = "true"')) + + sql """ + insert into ${tableName} values (2,1),(2,2); + """ + sql """ + REFRESH MATERIALIZED VIEW ${mvName} AUTO; + """ + def jobName = getJobName(dbName, mvName) + waitingMTMVTaskFinished(jobName) + sql """select * from ${mvName}""" + + // replication_num + sql """ + ALTER TABLE ${mvName} set ("replication_num" = "1"); + """ + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('tag.location.default: 1')) + + // replication_allocation + sql """ + ALTER TABLE ${mvName} set ("replication_allocation" = "tag.location.default: 1"); + """ + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('tag.location.default: 1')) + + // min_load_replica_num + sql """ + ALTER TABLE ${mvName} set ("min_load_replica_num" = "1"); + """ + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('"min_load_replica_num" = "1"')) + + // type + sql """ + insert into ${tableName} values (3,1),(3,2); + """ + sql """ + REFRESH MATERIALIZED VIEW ${mvName} AUTO; + """ + jobName = getJobName(dbName, mvName) + waitingMTMVTaskFinished(jobName) + def tablets_res = sql """show tablets from ${mvName}""" + assertTrue(tablets_res.size() > 0) + sql """ + admin check tablet (${tablets_res[0][0].toString()}) properties("type"="consistency"); + """ + + // storage_policy + def resource_name = "test_mtmv_remote_s3_resource" + def policy_name= "test_mtmv_storage_policy" + sql """ + CREATE RESOURCE IF NOT EXISTS "${resource_name}" + PROPERTIES( + "type"="s3", + "AWS_ENDPOINT" = "${getS3Endpoint()}", + "AWS_REGION" = "${getS3Region()}", + "AWS_ROOT_PATH" = "regression/cooldown", + "AWS_ACCESS_KEY" = "${getS3AK()}", + "AWS_SECRET_KEY" = "${getS3SK()}", + "AWS_MAX_CONNECTIONS" = "50", + "AWS_REQUEST_TIMEOUT_MS" = "3000", + "AWS_CONNECTION_TIMEOUT_MS" = "1000", + "AWS_BUCKET" = "${getS3BucketName()}", + "s3_validity_check" = "true" + ); + """ + + sql """ + CREATE STORAGE POLICY IF NOT EXISTS ${policy_name} + PROPERTIES( + "storage_resource" = "${resource_name}", + "cooldown_ttl" = "300" + ) + """ + + sql """ALTER TABLE ${mvName} SET ("storage_policy" = "${policy_name}");""" + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('"storage_policy" = "test_mtmv_storage_policy"')) + + // store_row_column + try { + sql """ALTER TABLE ${mvName} SET ("store_row_column" = "false");""" + } catch (Exception e) { + log.info(e.getMessage()) + assertTrue(e.getMessage().contains("Unknown table property: [store_row_column]")) + } + + // is_being_synced + sql """ + ALTER TABLE ${mvName} set ("is_being_synced" = "true"); + """ + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('"is_being_synced" = "true"')) + + // skip_write_index_on_load + def desc_res = sql """desc ${mvName}""" + assertTrue(desc_res.size() == 2) + assertTrue(desc_res[0][3] == "false") + assertTrue(desc_res[1][3] == "false") + + // enable_unique_key_merge_on_write + try { + sql """ + CREATE MATERIALIZED VIEW mv_unique_key_merge_on_write + BUILD DEFERRED REFRESH AUTO ON MANUAL + DISTRIBUTED BY hash(k2) BUCKETS 2 + PROPERTIES ( + 'replication_num' = '1', + "enable_unique_key_merge_on_write" = "true" + ) + AS + SELECT * from ${tableName}; + """ + } catch (Exception e) { + log.info(e.getMessage()) + assertTrue(e.getMessage().contains("Unknown properties")) + } + + // group_commit_interval_ms + sql """ALTER TABLE ${mvName} SET ("group_commit_interval_ms" = "2000");""" + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('"group_commit_interval_ms" = "2000"')) + + // group_commit_data_bytes + sql """ALTER TABLE ${mvName} SET ("group_commit_data_bytes" = "234217728");""" + showCreateTableResult = sql """show create materialized view ${mvName}""" + logger.info("showCreateTableResult: " + showCreateTableResult.toString()) + assertTrue(showCreateTableResult.toString().contains('"group_commit_data_bytes" = "234217728"')) + + // check mv can update normally + sql """ + insert into ${tableName} values (1,1),(1,2); + """ + sql """ + REFRESH MATERIALIZED VIEW ${mvName} AUTO; + """ + jobName = getJobName(dbName, mvName) + waitingMTMVTaskFinished(jobName) + sql """select * from ${mvName}""" + + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" +} diff --git a/regression-test/suites/mtmv_p0/test_mtmv_sql_cache_and_profile.groovy b/regression-test/suites/mtmv_p0/test_mtmv_sql_cache_and_profile.groovy new file mode 100644 index 00000000000..02191f0d4cd --- /dev/null +++ b/regression-test/suites/mtmv_p0/test_mtmv_sql_cache_and_profile.groovy @@ -0,0 +1,87 @@ +// 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. + +import org.junit.Assert; + +suite("test_mtmv_sql_cache_and_profile", "mtmv") { + + sql """ADMIN SET FRONTEND CONFIG ('cache_enable_sql_mode' = 'true')""" + + String dbName = context.config.getDbNameByFile(context.file) + String suiteName = "test_mtmv_sql_cache_and_profile" + String tableName = "${suiteName}_table" + String mvName = "${suiteName}_mv" + sql """use ${dbName};""" + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" + + sql """ + CREATE TABLE ${tableName} + ( + k2 INT, + k3 varchar(32) + ) + DISTRIBUTED BY HASH(k2) BUCKETS 2 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + sql """ + insert into ${tableName} values (1,1),(1,2); + """ + + sql """ + CREATE MATERIALIZED VIEW ${mvName} + BUILD DEFERRED REFRESH AUTO ON MANUAL + DISTRIBUTED BY hash(k2) BUCKETS 2 + PROPERTIES ( + 'replication_num' = '1' + ) + AS + SELECT * from ${tableName}; + """ + sql """ + REFRESH MATERIALIZED VIEW ${mvName} AUTO; + """ + + def jobName = getJobName(dbName, mvName) + waitingMTMVTaskFinished(jobName) + + sql """set enable_sql_cache=true;""" + + long startTime = System.currentTimeMillis() + long timeoutTimestamp = startTime + 5 * 60 * 1000 + def explain_res = "" + while (System.currentTimeMillis() < timeoutTimestamp) { + sleep(5 * 1000) + sql """select k2 from ${mvName} group by k2;""" + try { + explain_res = sql """explain plan select k2 from ${mvName} group by k2;""" + } catch (Exception e) { + logger.info(e.getMessage()) + } + logger.info("explain_res: " + explain_res) + if (explain_res.toString().indexOf("LogicalSqlCache") != -1 || explain_res.toString().indexOf("PhysicalSqlCache") != -1) { + break + } + } + assertTrue(explain_res.toString().indexOf("LogicalSqlCache") != -1 || explain_res.toString().indexOf("PhysicalSqlCache") != -1) + + sql """drop table if exists `${tableName}`""" + sql """drop materialized view if exists ${mvName};""" +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org