From 6a7a428dc98cfc155eb27551b6b751be5e396422 Mon Sep 17 00:00:00 2001 From: "zihe.liu" Date: Mon, 9 Sep 2024 16:12:53 +0800 Subject: [PATCH] [BugFix] Fix REPLACE constant fold (#50828) Signed-off-by: zihe.liu (cherry picked from commit fe0468138990f4d8b2631f1ea5acc42e496dedc1) # Conflicts: # fe/fe-core/src/test/java/com/starrocks/sql/plan/ConstantExpressionTest.java --- .../rewrite/ScalarOperatorFunctions.java | 3 +- .../rewrite/ScalarOperatorFunctionsTest.java | 20 +++- .../sql/plan/ConstantExpressionTest.java | 100 ++++++++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java index fbfb4696a3abe..4480eafb7ae9b 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java @@ -1303,7 +1303,8 @@ public static ConstantOperator upper(ConstantOperator str) { @ConstantFunction(name = "replace", argTypes = {VARCHAR, VARCHAR, VARCHAR}, returnType = VARCHAR) public static ConstantOperator replace(ConstantOperator value, ConstantOperator target, ConstantOperator replacement) { - return ConstantOperator.createVarchar(value.getVarchar().replace(target.getVarchar(), replacement.getVarchar())); + return ConstantOperator.createVarchar( + StringUtils.replace(value.getVarchar(), target.getVarchar(), replacement.getVarchar())); } private static ConstantOperator createDecimalConstant(BigDecimal result) { diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java index 301a30a8d4043..709ba4c95c7d6 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java @@ -1431,11 +1431,21 @@ public void testSubString() { @Test public void testReplace() { - assertEquals("20240806", ScalarOperatorFunctions.replace( - new ConstantOperator("2024-08-06", Type.VARCHAR), - new ConstantOperator("-", Type.VARCHAR), - new ConstantOperator("", Type.VARCHAR) - ).getVarchar()); + // arg0, arg1, arg2, expected_result + String[][] testCases = { + {"2024-08-06", "-", "", "20240806"}, + {"abc def ghi", "", "1234", "abc def ghi"}, + {"abc def ghi abc", "abc", "1234", "1234 def ghi 1234"}, + {"", "abc", "1234", ""} + }; + + for (String[] tc : testCases) { + assertEquals("Test case: " + Arrays.toString(tc), tc[3], ScalarOperatorFunctions.replace( + new ConstantOperator(tc[0], Type.VARCHAR), + new ConstantOperator(tc[1], Type.VARCHAR), + new ConstantOperator(tc[2], Type.VARCHAR) + ).getVarchar()); + } } @Test diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/plan/ConstantExpressionTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/plan/ConstantExpressionTest.java index dc3ef3906f397..d5cb25c220434 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/plan/ConstantExpressionTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/plan/ConstantExpressionTest.java @@ -455,4 +455,104 @@ public void testNumericLiteralComparison() throws Exception { } } +<<<<<<< HEAD +======= + @Test + public void testGetQueryDump() throws Exception { + DumpInfo prevDumpInfo = connectContext.getDumpInfo(); + + try { + connectContext.setDumpInfo(null); + + // Non-constant arguments. + { + String sql = "SELECT get_query_dump(rtrim('select count(v1) from t0')) from t0"; + Assert.assertThrows("Meta function get_query_dump does not support non-constant arguments", + SemanticException.class, () -> getFragmentPlan(sql)); + } + + // Success cases. + { + String sql = "SELECT get_query_dump('select count(v1) from t0', false) from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "{\"statement\":\"select count(v1) from t0\""); + } + + { + String sql = "SELECT get_query_dump('select count(v1) from t0', true) from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "{\"statement\":\"SELECT count(tbl_mock_001.mock_002)..."); + } + + { + String sql = "SELECT get_query_dump('select count(v1) from t0') from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "{\"statement\":\"select count(v1) from t0\""); + } + + { + String sql = "SELECT get_query_dump(concat('select count(v1)', ' from t0')) from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "{\"statement\":\"select count(v1) from t0\""); + } + + // Failed cases. + { + String sql = "SELECT get_query_dump('') from t0"; + Assert.assertThrows("Invalid parameter get_query_dump: query is empty", + StarRocksPlannerException.class, () -> getFragmentPlan(sql)); + } + { + String sql = "SELECT get_query_dump('not-a-query') from t0"; + Assert.assertThrows("Invalid parameter get_query_dump: execute query failed.", + StarRocksPlannerException.class, () -> getFragmentPlan(sql)); + } + + // Success cases after failed cases. + { + String sql = "SELECT get_query_dump(concat('select count(v1)', ' from t0')) from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "{\"statement\":\"select count(v1) from t0\""); + } + + } finally { + connectContext.setDumpInfo(prevDumpInfo); + } + + } + + @Test + public void testReplace() throws Exception { + { + String plan = getFragmentPlan("SELECT REPLACE('abc def ghi abc', '', '1234')"); + assertContains(plan, " : 'abc def ghi abc'"); + } + + { + String plan = getFragmentPlan("SELECT REPLACE('abc def ghi abc', 'abc', '1234')"); + assertContains(plan, " : '1234 def ghi 1234'"); + } + + { + String plan = getFragmentPlan("SELECT REPLACE('', 'abc', '1234')"); + assertContains(plan, " : ''"); + } + + { + String plan = getFragmentPlan("SELECT REPLACE(NULL, 'abc', '1234')"); + assertContains(plan, " : NULL"); + } + + { + String plan = getFragmentPlan("SELECT REPLACE('abc def ghi abc', NULL, '1234')"); + assertContains(plan, " : NULL"); + } + + { + String plan = getFragmentPlan("SELECT REPLACE('abc def ghi abc', 'abc', NULL)"); + assertContains(plan, " : NULL"); + } + + } +>>>>>>> fe04681389 ([BugFix] Fix REPLACE constant fold (#50828)) }