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

Reply via email to