This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 682688fce386b8426507693da8248711856cd6d2 Author: zhangdong <493738...@qq.com> AuthorDate: Tue Sep 5 14:41:48 2023 +0800 [fix](nereids)fix CheckPolicy not match uniqueTable in nereids (#23714) fix CheckPolicy not match uniqueTable in nereids --- .../doris/nereids/rules/analysis/CheckPolicy.java | 45 ++++++++++++++-------- .../java/org/apache/doris/policy/PolicyTest.java | 23 +++++++++++ 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckPolicy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckPolicy.java index e663c6c018..24f8396cf2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckPolicy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckPolicy.java @@ -31,6 +31,7 @@ import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Optional; +import java.util.Set; /** * CheckPolicy. @@ -40,22 +41,34 @@ public class CheckPolicy implements AnalysisRuleFactory { @Override public List<Rule> buildRules() { return ImmutableList.of( - RuleType.CHECK_ROW_POLICY.build( - logicalCheckPolicy(any().when(child -> !(child instanceof UnboundRelation))).thenApply(ctx -> { - LogicalCheckPolicy<Plan> checkPolicy = ctx.root; - Plan child = checkPolicy.child(); - if (!(child instanceof LogicalRelation) - || ctx.connectContext.getSessionVariable().isPlayNereidsDump()) { - return child; - } - LogicalRelation relation = (LogicalRelation) child; - Optional<Expression> filter = checkPolicy.getFilter(relation, ctx.connectContext); - if (!filter.isPresent()) { - return relation; - } - return new LogicalFilter(ExpressionUtils.extractConjunctionToSet(filter.get()), relation); - }) - ) + RuleType.CHECK_ROW_POLICY.build( + logicalCheckPolicy(any().when(child -> !(child instanceof UnboundRelation))).thenApply(ctx -> { + LogicalCheckPolicy<Plan> checkPolicy = ctx.root; + LogicalFilter<Plan> upperFilter = null; + + Plan child = checkPolicy.child(); + // Because the unique table will automatically include a filter condition + if (child instanceof LogicalFilter && child.bound() && child + .child(0) instanceof LogicalRelation) { + upperFilter = (LogicalFilter) child; + child = child.child(0); + } + if (!(child instanceof LogicalRelation) + || ctx.connectContext.getSessionVariable().isPlayNereidsDump()) { + return ctx.root.child(); + } + LogicalRelation relation = (LogicalRelation) child; + Optional<Expression> filter = checkPolicy.getFilter(relation, ctx.connectContext); + if (!filter.isPresent()) { + return ctx.root.child(); + } + Set<Expression> combineFilter = ExpressionUtils.extractConjunctionToSet(filter.get()); + if (upperFilter != null) { + combineFilter.addAll(upperFilter.getConjuncts()); + } + return new LogicalFilter<>(combineFilter, relation); + }) + ) ); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/policy/PolicyTest.java b/fe/fe-core/src/test/java/org/apache/doris/policy/PolicyTest.java index ba912baf79..d7d286e60f 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/policy/PolicyTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/policy/PolicyTest.java @@ -65,6 +65,9 @@ public class PolicyTest extends TestWithFeService { createTable("create table table2\n" + "(k1 int, k2 int) distributed by hash(k1) buckets 1\n" + "properties(\"replication_num\" = \"1\");"); + createTable("create table table3\n" + + "(k1 int, k2 int) unique KEY(`k1`) distributed by hash(k1) buckets 1\n" + + "properties(\"replication_num\" = \"1\");"); // create user UserIdentity user = new UserIdentity("test_policy", "%"); user.analyze(SystemInfoService.DEFAULT_CLUSTER); @@ -132,6 +135,26 @@ public class PolicyTest extends TestWithFeService { dropPolicy("DROP ROW POLICY test_row_policy"); } + @Test + public void testUniqueTable() throws Exception { + // test user + createPolicy("CREATE ROW POLICY test_unique_policy ON test.table3 AS PERMISSIVE TO test_policy USING (k1 = 1)"); + String queryStr = "EXPLAIN select /*+ SET_VAR(enable_nereids_planner=false) */ * from test.table3"; + String explainString = getSQLPlanOrErrorMsg(queryStr); + Assertions.assertTrue(explainString.contains("`k1` = 1")); + dropPolicy("DROP ROW POLICY test_unique_policy"); + } + + @Test + public void testUniqueTableNereidsPlanners() throws Exception { + // test user + createPolicy("CREATE ROW POLICY test_unique_policy ON test.table3 AS PERMISSIVE TO test_policy USING (k1 = 1)"); + String queryStr = "EXPLAIN select * from test.table3"; + String explainString = getSQLPlanOrErrorMsg(queryStr); + Assertions.assertTrue(explainString.contains("k1[#0] = 1")); + dropPolicy("DROP ROW POLICY test_unique_policy"); + } + @Test public void testAliasSql() throws Exception { createPolicy("CREATE ROW POLICY test_row_policy ON test.table1 AS PERMISSIVE TO test_policy USING (k1 = 1)"); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org