From 384a0c7aa7a48e72d443c8d8f3f99caee2d1e3f9 Mon Sep 17 00:00:00 2001 From: zclllyybb Date: Wed, 24 May 2023 09:52:02 +0800 Subject: [PATCH] [fix](testcases) Fix some unstable testcases. (#19956) case of test_string_concat_extremely_long_string will exceed our test limit. Move it to p2 so that it will be tested only in SelectDB test environment. Because we need to keep consistent with MySQL & avoid overflow. the q67 must keep its behavior like now. When we fully apply nereids & decimalV3 then, it will be fixed automatically. In the parallel test, although all query stats were cleaned, the cases run in parallel will affect this. So we need to use a unique table for query_stats_test test_query_sys_tables didn't deal with some unstable situations. fixed it. temporarily disable unstable case analyze_test case for p0. --- .../system/test_query_sys_tables.out | 12 +-- .../data/query_p0/stats/query_stats_test.out | 4 +- .../pipeline/p0/conf/regression-conf.groovy | 2 +- .../pipeline/p1/conf/regression-conf.groovy | 2 + .../system/test_query_sys_tables.groovy | 16 +-- .../query_p0/stats/query_stats_test.groovy | 40 ++++--- .../system/test_query_sys_tables.groovy | 10 +- ...string_concat_extremely_long_string.groovy | 0 .../suites/tpcds_sf1_p2/load.groovy | 102 ++++++++++++++++++ 9 files changed, 156 insertions(+), 32 deletions(-) rename regression-test/suites/{tpcds_sf1_p1 => tpcds_sf1_p2}/functions_test/test_string_concat_extremely_long_string.groovy (100%) create mode 100644 regression-test/suites/tpcds_sf1_p2/load.groovy diff --git a/regression-test/data/nereids_p0/system/test_query_sys_tables.out b/regression-test/data/nereids_p0/system/test_query_sys_tables.out index 5e6e5e527d..766a8e29cd 100644 --- a/regression-test/data/nereids_p0/system/test_query_sys_tables.out +++ b/regression-test/data/nereids_p0/system/test_query_sys_tables.out @@ -20,14 +20,14 @@ internal ccc 3 int int(11) 10 internal ddd 4 smallint smallint(6) 5 -- !schemata -- -internal test_query_sys_db_1 \N -internal test_query_sys_db_2 \N -internal test_query_sys_db_3 \N +internal test_query_sys_db_4 \N +internal test_query_sys_db_5 \N +internal test_query_sys_db_6 \N -- !tables -- -internal test_query_sys_tb_1 BASE TABLE 0 \N \N -internal test_query_sys_tb_2 BASE TABLE 0 \N \N -internal test_query_sys_tb_3 BASE TABLE 0 \N \N +internal test_query_sys_tb_4 BASE TABLE 0 \N \N +internal test_query_sys_tb_5 BASE TABLE 0 \N \N +internal test_query_sys_tb_6 BASE TABLE 0 \N \N -- !session_variables -- wait_timeout 30000 diff --git a/regression-test/data/query_p0/stats/query_stats_test.out b/regression-test/data/query_p0/stats/query_stats_test.out index 350aa6d608..06d6727253 100644 --- a/regression-test/data/query_p0/stats/query_stats_test.out +++ b/regression-test/data/query_p0/stats/query_stats_test.out @@ -32,10 +32,10 @@ k12 0 0 k13 0 0 -- !sql -- -baseall_stat 2 +stats_table 2 -- !sql -- -baseall_stat k0 1 1 +stats_table k0 1 1 k1 1 0 k2 1 1 k3 0 0 diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy b/regression-test/pipeline/p0/conf/regression-conf.groovy index e86b61a237..dfd0058092 100644 --- a/regression-test/pipeline/p0/conf/regression-conf.groovy +++ b/regression-test/pipeline/p0/conf/regression-conf.groovy @@ -48,7 +48,7 @@ testDirectories = "" // this groups will not be executed excludeGroups = "" // this suites will not be executed -excludeSuites = "test_broker_load,test_spark_load" +excludeSuites = "test_broker_load,test_spark_load,analyze_test" // this directories will not be executed excludeDirectories = "" diff --git a/regression-test/pipeline/p1/conf/regression-conf.groovy b/regression-test/pipeline/p1/conf/regression-conf.groovy index 253e5eee5e..e1452d81a4 100644 --- a/regression-test/pipeline/p1/conf/regression-conf.groovy +++ b/regression-test/pipeline/p1/conf/regression-conf.groovy @@ -40,6 +40,8 @@ dataPath = "${DORIS_HOME}/regression-test/data" testGroups = "" // empty suite will test all suite testSuites = "" +// this suites will not be executed +excludeSuites = "q67_ignore_temporarily" cacheDataPath="/data/regression/" diff --git a/regression-test/suites/nereids_p0/system/test_query_sys_tables.groovy b/regression-test/suites/nereids_p0/system/test_query_sys_tables.groovy index ea9c570134..7b96e1dc32 100644 --- a/regression-test/suites/nereids_p0/system/test_query_sys_tables.groovy +++ b/regression-test/suites/nereids_p0/system/test_query_sys_tables.groovy @@ -18,12 +18,12 @@ suite("test_query_sys_tables", "query,p0") { sql "SET enable_nereids_planner=true" sql "SET enable_fallback_to_original_planner=false" - def dbName1 = "test_query_sys_db_1" - def dbName2 = "test_query_sys_db_2" - def dbName3 = "test_query_sys_db_3" - def tbName1 = "test_query_sys_tb_1" - def tbName2 = "test_query_sys_tb_2" - def tbName3 = "test_query_sys_tb_3" + def dbName1 = "test_query_sys_db_4" + def dbName2 = "test_query_sys_db_5" + def dbName3 = "test_query_sys_db_6" + def tbName1 = "test_query_sys_tb_4" + def tbName2 = "test_query_sys_tb_5" + def tbName3 = "test_query_sys_tb_6" sql("drop database IF EXISTS ${dbName1}") sql("drop database IF EXISTS ${dbName2}") sql("drop database IF EXISTS ${dbName3}") @@ -103,7 +103,7 @@ suite("test_query_sys_tables", "query,p0") { sql("CREATE DATABASE IF NOT EXISTS ${dbName3}") sql("use information_schema") - qt_schemata("select CATALOG_NAME, SCHEMA_NAME, SQL_PATH from schemata where SCHEMA_NAME = '${dbName1}' or SCHEMA_NAME = '${dbName2}' or SCHEMA_NAME = '${dbName3}'"); + qt_schemata("select CATALOG_NAME, SCHEMA_NAME, SQL_PATH from schemata where SCHEMA_NAME = '${dbName1}' or SCHEMA_NAME = '${dbName2}' or SCHEMA_NAME = '${dbName3}' order by SCHEMA_NAME"); // test statistics // have no impl @@ -162,7 +162,7 @@ suite("test_query_sys_tables", "query,p0") { """ sql("use information_schema") - qt_tables("select TABLE_CATALOG, TABLE_NAME, TABLE_TYPE, AVG_ROW_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH from tables where TABLE_SCHEMA = '${dbName1}' or TABLE_SCHEMA = '${dbName2}' or TABLE_SCHEMA = '${dbName3}'"); + qt_tables("select TABLE_CATALOG, TABLE_NAME, TABLE_TYPE, AVG_ROW_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH from tables where TABLE_SCHEMA = '${dbName1}' or TABLE_SCHEMA = '${dbName2}' or TABLE_SCHEMA = '${dbName3}' order by TABLE_NAME"); // test variables // session_variables diff --git a/regression-test/suites/query_p0/stats/query_stats_test.groovy b/regression-test/suites/query_p0/stats/query_stats_test.groovy index a9faa0bee0..79656b13ac 100644 --- a/regression-test/suites/query_p0/stats/query_stats_test.groovy +++ b/regression-test/suites/query_p0/stats/query_stats_test.groovy @@ -16,25 +16,41 @@ // under the License. suite("query_stats_test") { - sql "use test_query_db" - sql "create table baseall_stat like baseall" - sql "insert into baseall_stat select * from baseall" - + def tbName = "stats_table" + sql """ DROP TABLE IF EXISTS ${tbName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tbName} ( + `k0` boolean null comment "", + `k1` tinyint(4) null comment "", + `k2` smallint(6) null comment "", + `k3` int(11) null comment "", + `k4` bigint(20) null comment "", + `k5` decimal(9, 3) null comment "", + `k6` char(5) null comment "", + `k10` date null comment "", + `k11` datetime null comment "", + `k7` varchar(20) null comment "", + `k8` double max null comment "", + `k9` float sum null comment "", + `k12` string replace null comment "", + `k13` largeint(40) replace null comment "" + ) engine=olap + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 properties("replication_num" = "1") + """ sql "admin set frontend config (\"enable_query_hit_stats\"=\"true\");" sql "clean all query stats" explain { - sql("select k1 from baseall_stat where k1 = 1") + sql("select k1 from ${tbName} where k1 = 1") } - qt_sql "show query stats from baseall_stat" + qt_sql "show query stats from ${tbName}" - sql "select k1 from baseall_stat where k0 = 1" - sql "select k4 from baseall_stat where k2 = 1991" + sql "select k1 from ${tbName} where k0 = 1" + sql "select k4 from ${tbName} where k2 = 1991" - qt_sql "show query stats from baseall_stat" - qt_sql "show query stats from baseall_stat all" - qt_sql "show query stats from baseall_stat all verbose" + qt_sql "show query stats from ${tbName}" + qt_sql "show query stats from ${tbName} all" + qt_sql "show query stats from ${tbName} all verbose" sql "admin set frontend config (\"enable_query_hit_stats\"=\"false\");" - sql "drop table baseall_stat" } diff --git a/regression-test/suites/query_p0/system/test_query_sys_tables.groovy b/regression-test/suites/query_p0/system/test_query_sys_tables.groovy index 190c2c7475..7c35837398 100644 --- a/regression-test/suites/query_p0/system/test_query_sys_tables.groovy +++ b/regression-test/suites/query_p0/system/test_query_sys_tables.groovy @@ -101,7 +101,7 @@ suite("test_query_sys_tables", "query,p0") { sql("CREATE DATABASE IF NOT EXISTS ${dbName3}") sql("use information_schema") - qt_schemata("select CATALOG_NAME, SCHEMA_NAME, SQL_PATH from schemata where SCHEMA_NAME = '${dbName1}' or SCHEMA_NAME = '${dbName2}' or SCHEMA_NAME = '${dbName3}'"); + qt_schemata("select CATALOG_NAME, SCHEMA_NAME, SQL_PATH from schemata where SCHEMA_NAME = '${dbName1}' or SCHEMA_NAME = '${dbName2}' or SCHEMA_NAME = '${dbName3}' order by SCHEMA_NAME"); // test statistics // have no impl @@ -160,7 +160,7 @@ suite("test_query_sys_tables", "query,p0") { """ sql("use information_schema") - qt_tables("select TABLE_CATALOG, TABLE_NAME, TABLE_TYPE, AVG_ROW_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH from tables where TABLE_SCHEMA = '${dbName1}' or TABLE_SCHEMA = '${dbName2}' or TABLE_SCHEMA = '${dbName3}'"); + qt_tables("select TABLE_CATALOG, TABLE_NAME, TABLE_TYPE, AVG_ROW_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH from tables where TABLE_SCHEMA = '${dbName1}' or TABLE_SCHEMA = '${dbName2}' or TABLE_SCHEMA = '${dbName3}' order by TABLE_NAME"); // test variables // session_variables @@ -174,7 +174,11 @@ suite("test_query_sys_tables", "query,p0") { qt_global_variables("select VARIABLE_NAME, VARIABLE_VALUE from global_variables where VARIABLE_NAME = 'wait_timeout'") // test user_privileges - sql("CREATE USER 'test_sys_tables'") + try { + sql("CREATE USER 'test_sys_tables'") + } catch (Exception e) { + assertTrue(e.getMessage().contains("already exist"), e.getMessage()) + } sql("GRANT SELECT_PRIV ON *.*.* TO 'test_sys_tables'") sql("use information_schema") qt_user_privileges """ diff --git a/regression-test/suites/tpcds_sf1_p1/functions_test/test_string_concat_extremely_long_string.groovy b/regression-test/suites/tpcds_sf1_p2/functions_test/test_string_concat_extremely_long_string.groovy similarity index 100% rename from regression-test/suites/tpcds_sf1_p1/functions_test/test_string_concat_extremely_long_string.groovy rename to regression-test/suites/tpcds_sf1_p2/functions_test/test_string_concat_extremely_long_string.groovy diff --git a/regression-test/suites/tpcds_sf1_p2/load.groovy b/regression-test/suites/tpcds_sf1_p2/load.groovy new file mode 100644 index 0000000000..1b527dcc81 --- /dev/null +++ b/regression-test/suites/tpcds_sf1_p2/load.groovy @@ -0,0 +1,102 @@ +// 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. + +// The cases is copied from https://github.com/trinodb/trino/tree/master +// /testing/trino-product-tests/src/main/resources/sql-tests/testcases/tpcds +// and modified by Doris. +suite("load") { + def tables=["store", "store_returns", "customer", "date_dim", "web_sales", + "catalog_sales", "store_sales", "item", "web_returns", "catalog_returns", + "catalog_page", "web_site", "customer_address", "customer_demographics", + "ship_mode", "promotion", "inventory", "time_dim", "income_band", + "call_center", "reason", "household_demographics", "warehouse", "web_page"] + def columnsMap = [ + "item": """tmp_item_sk, tmp_item_id, tmp_rec_start_date, tmp_rec_end_date, tmp_item_desc, + tmp_current_price, tmp_wholesale_cost, tmp_brand_id, tmp_brand, tmp_class_id, tmp_class, + tmp_category_id, tmp_category, tmp_manufact_id, tmp_manufact, tmp_size, tmp_formulation, + tmp_color, tmp_units, tmp_container, tmp_manager_id, tmp_product_name, + i_item_sk=tmp_item_sk, i_item_id=tmp_item_id, i_rec_start_date=tmp_rec_start_date, + i_rec_end_date=tmp_rec_end_date, i_item_desc=tmp_item_desc, i_current_price=tmp_current_price, + i_wholesale_cost=tmp_wholesale_cost, i_brand_id=tmp_brand_id, i_brand=tmp_brand, + i_class_id=tmp_class_id, i_class=tmp_class, i_category_id=tmp_category_id, + i_category=nullif(tmp_category, ''), i_manufact_id=tmp_manufact_id, i_manufact=tmp_manufact, + i_size=tmp_size, i_formulation=tmp_formulation, i_color=tmp_color, i_units=tmp_units, + i_container=tmp_container, i_manager_id=tmp_manager_id, i_product_name=tmp_product_name""", + + "customer_address": """tmp_address_sk, tmp_address_id, tmp_street_number, tmp_street_name, tmp_street_type, tmp_suite_number, + tmp_city, tmp_county, tmp_state, tmp_zip, tmp_country, tmp_gmt_offset, tmp_location_type, + ca_address_sk=tmp_address_sk, ca_address_id=tmp_address_id, ca_street_number=tmp_street_number, + ca_street_name=tmp_street_name, ca_street_type=tmp_street_type, ca_suite_number=tmp_suite_number, ca_city=tmp_city, + ca_county=nullif(tmp_county, ''), ca_state=tmp_state, ca_zip=tmp_zip, ca_country=tmp_country, + ca_gmt_offset=tmp_gmt_offset, ca_location_type=tmp_location_type""", + ] + + def specialTables = ["item", "customer_address"] + + for (String table in tables) { + sql """ DROP TABLE IF EXISTS $table """ + } + + for (String table in tables) { + sql new File("""${context.file.parent}/ddl/${table}.sql""").text + } + + sql "set exec_mem_limit=8G;" + + for (String tableName in tables) { + streamLoad { + // you can skip db declaration, because a default db has already been + // specified in ${DORIS_HOME}/conf/regression-conf.groovy + // db 'regression_test' + table tableName + + // default label is UUID: + // set 'label' UUID.randomUUID().toString() + + // default column_separator is specify in doris fe config, usually is '\t'. + // this line change to ',' + set 'column_separator', '|' + set 'compress_type', 'GZ' + + if (specialTables.contains(tableName)) { + set "columns", columnsMap[tableName] + } + + + // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv. + // also, you can stream load a http stream, e.g. http://xxx/some.csv + file """${getS3Url()}/regression/tpcds/sf1/${tableName}.dat.gz""" + + time 10000 // limit inflight 10s + + // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + assertEquals(json.NumberTotalRows, json.NumberLoadedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + } +}