From 2ee6f28cec001a7b69acac3966f942f57c741ad8 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:24:16 +0800 Subject: [PATCH] [fix](nereids)column name should be case insensitive when selecting mv (#33002) --- .../AbstractSelectMaterializedIndexRule.java | 10 ++-- .../suites/nereids_p0/test_mv_select.groovy | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java index 8ecabcd8918c3c..c77cda4c8f8125 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java @@ -219,8 +219,10 @@ protected static List matchPrefixMost( Set predicates, Map exprIdToName) { Map> split = filterCanUsePrefixIndexAndSplitByEquality(predicates, exprIdToName); - Set equalColNames = split.getOrDefault(true, ImmutableSet.of()); - Set nonEqualColNames = split.getOrDefault(false, ImmutableSet.of()); + Set equalColNames = split.getOrDefault(true, ImmutableSet.of()).stream() + .map(String::toLowerCase).collect(Collectors.toSet()); + Set nonEqualColNames = split.getOrDefault(false, ImmutableSet.of()).stream() + .map(String::toLowerCase).collect(Collectors.toSet()); if (!(equalColNames.isEmpty() && nonEqualColNames.isEmpty())) { List matchingResult = matchKeyPrefixMost(scan.getTable(), candidate, @@ -358,9 +360,9 @@ private static int indexKeyPrefixMatchCount( Set nonEqualColNames) { int matchCount = 0; for (Column column : table.getSchemaByIndexId(index.getId())) { - if (equalColNames.contains(normalizeName(column.getNameWithoutMvPrefix()))) { + if (equalColNames.contains(normalizeName(column.getNameWithoutMvPrefix().toLowerCase()))) { matchCount++; - } else if (nonEqualColNames.contains(normalizeName(column.getNameWithoutMvPrefix()))) { + } else if (nonEqualColNames.contains(normalizeName(column.getNameWithoutMvPrefix().toLowerCase()))) { // un-equivalence predicate's columns can match only first column in index. matchCount++; break; diff --git a/regression-test/suites/nereids_p0/test_mv_select.groovy b/regression-test/suites/nereids_p0/test_mv_select.groovy index 096cfd50fab16b..4d7c93828e16ea 100644 --- a/regression-test/suites/nereids_p0/test_mv_select.groovy +++ b/regression-test/suites/nereids_p0/test_mv_select.groovy @@ -42,4 +42,54 @@ suite("test_mv_select") { group by Uid;""") contains "mv_test_table_t" } + + sql """drop table if exists SkuUniqDailyCounter""" + sql """CREATE TABLE `SkuUniqDailyCounter` ( + `Pd` bigint(20) NOT NULL, + `Dc` int(11) NOT NULL, + `Bc` bigint(20) NOT NULL, + `Fs` int(11) REPLACE NULL + ) ENGINE=OLAP + AGGREGATE KEY(`Pd`, `Dc`, `Bc`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`Dc`) BUCKETS 8 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + );""" + def delta_time = 1000 + 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") + } + sql """ALTER TABLE SkuUniqDailyCounter + ADD ROLLUP rollup_index_shopid( + Dc, + Bc, + Pd, + Fs + ); """ + wait_for_latest_op_on_table_finish("SkuUniqDailyCounter",60000); + sql """ALTER TABLE SkuUniqDailyCounter + ADD ROLLUP rollup_index_brandcid( + Bc, + Dc, + Pd, + Fs + );""" + wait_for_latest_op_on_table_finish("SkuUniqDailyCounter",60000); + + explain { + sql ("""select sum(Fs) Sales from SkuUniqDailyCounter where Bc=742502946 and Dc >=20240315 and Dc <= 20240328;""") + contains "rollup_index_brandcid" + } } \ No newline at end of file