From 5f44ce8c40795324cc2b841af858319a742119de Mon Sep 17 00:00:00 2001 From: Seaven Date: Fri, 24 Jan 2025 19:05:27 +0800 Subject: [PATCH] [Enhancement] Decode function add length (#55315) Signed-off-by: Seaven --- .../rule/tree/lowcardinality/DecodeCollector.java | 2 +- .../starrocks/sql/plan/LowCardinalityTest2.java | 9 +++++++++ .../test_low_cardinality/R/test_low_cardinality2 | 14 +++++++++----- .../test_low_cardinality/T/test_low_cardinality2 | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/tree/lowcardinality/DecodeCollector.java b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/tree/lowcardinality/DecodeCollector.java index 160a87704d9cd6..0f5964d1412fc8 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/tree/lowcardinality/DecodeCollector.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/tree/lowcardinality/DecodeCollector.java @@ -91,7 +91,7 @@ public class DecodeCollector extends OptExpressionVisitor support: // array -> array: array function diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/plan/LowCardinalityTest2.java b/fe/fe-core/src/test/java/com/starrocks/sql/plan/LowCardinalityTest2.java index e2d0685907c106..adf84075c26352 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/plan/LowCardinalityTest2.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/plan/LowCardinalityTest2.java @@ -304,6 +304,15 @@ public void testDecodeNodeRewrite4() throws Exception { " | : 4: dept_name")); } + @Test + public void testDecodeNodeRewriteLength() throws Exception { + String sql = "select length(dept_name), char_length(dept_name) from dept group by dept_name,state"; + String plan = getFragmentPlan(sql); + Assert.assertTrue(plan, plan.contains(" 2:Project\n" + + " | : DictDecode(6: dept_name, [length()])\n" + + " | : DictDecode(6: dept_name, [char_length()])")); + } + @Test public void testDecodeNodeRewrite5() throws Exception { String sql = "select S_ADDRESS from supplier where S_ADDRESS " + diff --git a/test/sql/test_low_cardinality/R/test_low_cardinality2 b/test/sql/test_low_cardinality/R/test_low_cardinality2 index c75b6b5ac7f536..2a33193dd7f2cd 100644 --- a/test/sql/test_low_cardinality/R/test_low_cardinality2 +++ b/test/sql/test_low_cardinality/R/test_low_cardinality2 @@ -307,11 +307,11 @@ insert into s2 select * from s2; -- !result [UC] analyze full table s1; -- result: -test_db_597f05742dee11efbc9b7b0d31512d80.s1 analyze status OK +test_db_3569e679a63f46fcb95f5e935f2b4716.s1 analyze status OK -- !result [UC] analyze full table s2; -- result: -test_db_597f05742dee11efbc9b7b0d31512d80.s2 analyze status OK +test_db_3569e679a63f46fcb95f5e935f2b4716.s2 analyze status OK -- !result function: wait_global_dict_ready('v3', 's1') -- result: @@ -338,6 +338,10 @@ select concat(upper(v4), "1"), max(v3) from s2 where v4 = "BJ" group by upper(v4 -- result: BJ1 Jiangxi -- !result +select length(v4), char_length(v4), max(v3) from s2 where v4 = "BJ" group by length(v4), char_length(v4) order by 1, 2; +-- result: +2 2 Jiangxi +-- !result select count(distinct v3), max(v3), count(distinct v4) as a from s2; -- result: 33 Zhejiang 34 @@ -484,7 +488,7 @@ FROM -- !result [UC] analyze full table supplier; -- result: -test_db_597f05742dee11efbc9b7b0d31512d80.supplier analyze status OK +test_db_3569e679a63f46fcb95f5e935f2b4716.supplier analyze status OK -- !result function: wait_global_dict_ready('s_region', 'supplier') -- result: @@ -508,7 +512,7 @@ select l.S_NAME,l.mx_addr from agged_supplier_5 l right join [shuffle] supplier 3 3 4 4 -- !result - with a as ( select s_region, S_NAME from supplier where S_SUPPKEY < 10 limit 10 ), b as ( select max(upper(s_region)) as mx from a group by S_NAME ), c as ( select lower(mx) = lower('lw') from b )select *from c; +with a as ( select s_region, S_NAME from supplier where S_SUPPKEY < 10 limit 10 ), b as ( select max(upper(s_region)) as mx from a group by S_NAME ), c as ( select lower(mx) = lower('lw') from b )select *from c; -- result: 0 0 @@ -519,4 +523,4 @@ select l.S_NAME,l.mx_addr from agged_supplier_5 l right join [shuffle] supplier 0 0 0 --- !result \ No newline at end of file +-- !result diff --git a/test/sql/test_low_cardinality/T/test_low_cardinality2 b/test/sql/test_low_cardinality/T/test_low_cardinality2 index f1ff12ec57d4ce..a75656da425262 100644 --- a/test/sql/test_low_cardinality/T/test_low_cardinality2 +++ b/test/sql/test_low_cardinality/T/test_low_cardinality2 @@ -304,6 +304,7 @@ function: wait_global_dict_ready('v4', 's2') select concat(upper(v2), "1"), max(v3) from s2 where v4 = "BJ" group by upper(v2) order by 1, 2; select concat(upper(v4), "1"), max(v3) from s2 where v4 = "BJ" group by upper(v4) order by 1, 2; +select length(v4), char_length(v4), max(v3) from s2 where v4 = "BJ" group by length(v4), char_length(v4) order by 1, 2; select count(distinct v3), max(v3), count(distinct v4) as a from s2;