This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new fb703f91acd [Fix](nereids) fix qualifier problem that affects delete 
stmt in another catalog (#32853)
fb703f91acd is described below

commit fb703f91acd1cc5b3d1f97a3119e5eaff931da07
Author: feiniaofeiafei <53502832+feiniaofeia...@users.noreply.github.com>
AuthorDate: Mon Apr 1 14:53:41 2024 +0800

    [Fix](nereids) fix qualifier problem that affects delete stmt in another 
catalog (#32853)
---
 .../doris/nereids/rules/analysis/BindRelation.java | 30 ++++++-----
 .../plans/logical/LogicalCatalogRelation.java      | 31 +++++------
 .../plans/physical/PhysicalCatalogRelation.java    | 22 +++++---
 .../nereids/rules/analysis/BindRelationTest.java   |  4 +-
 .../nereids/rules/rewrite/ColumnPruningTest.java   | 62 +++++++++++-----------
 5 files changed, 81 insertions(+), 68 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
index b1b0fe1045c..33fba7f6ec3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
@@ -66,6 +66,7 @@ import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.collections.CollectionUtils;
 
@@ -189,7 +190,7 @@ public class BindRelation extends OneAnalysisRuleFactory {
         List<Long> tabletIds = unboundRelation.getTabletIds();
         if (!CollectionUtils.isEmpty(partIds)) {
             scan = new LogicalOlapScan(unboundRelation.getRelationId(),
-                    (OlapTable) table, 
ImmutableList.of(tableQualifier.get(1)), partIds,
+                    (OlapTable) table, tableQualifier, partIds,
                     tabletIds, unboundRelation.getHints(), 
unboundRelation.getTableSample());
         } else {
             Optional<String> indexName = unboundRelation.getIndexName();
@@ -206,11 +207,11 @@ public class BindRelation extends OneAnalysisRuleFactory {
                         : PreAggStatus.off("For direct index scan.");
 
                 scan = new LogicalOlapScan(unboundRelation.getRelationId(),
-                    (OlapTable) table, 
ImmutableList.of(tableQualifier.get(1)), tabletIds, indexId,
+                    (OlapTable) table, tableQualifier, tabletIds, indexId,
                     preAggStatus, unboundRelation.getHints(), 
unboundRelation.getTableSample());
             } else {
                 scan = new LogicalOlapScan(unboundRelation.getRelationId(),
-                    (OlapTable) table, 
ImmutableList.of(tableQualifier.get(1)), tabletIds, unboundRelation.getHints(),
+                    (OlapTable) table, tableQualifier, tabletIds, 
unboundRelation.getHints(),
                     unboundRelation.getTableSample());
             }
         }
@@ -238,10 +239,12 @@ public class BindRelation extends OneAnalysisRuleFactory {
 
     private LogicalPlan getLogicalPlan(TableIf table, UnboundRelation 
unboundRelation,
                                                List<String> tableQualifier, 
CascadesContext cascadesContext) {
+        List<String> qualifierWithoutTableName = Lists.newArrayList();
+        qualifierWithoutTableName.addAll(tableQualifier.subList(0, 
tableQualifier.size() - 1));
         switch (table.getType()) {
             case OLAP:
             case MATERIALIZED_VIEW:
-                return makeOlapScan(table, unboundRelation, tableQualifier);
+                return makeOlapScan(table, unboundRelation, 
qualifierWithoutTableName);
             case VIEW:
                 View view = (View) table;
                 String inlineViewDef = view.getInlineViewDef();
@@ -257,25 +260,26 @@ public class BindRelation extends OneAnalysisRuleFactory {
                     return new LogicalSubQueryAlias<>(tableQualifier, 
hiveViewPlan);
                 }
                 hmsTable.setScanParams(unboundRelation.getScanParams());
-                return new LogicalFileScan(unboundRelation.getRelationId(), 
(HMSExternalTable) table, tableQualifier,
-                    unboundRelation.getTableSample());
+                return new LogicalFileScan(unboundRelation.getRelationId(), 
(HMSExternalTable) table,
+                        qualifierWithoutTableName, 
unboundRelation.getTableSample());
             case ICEBERG_EXTERNAL_TABLE:
             case PAIMON_EXTERNAL_TABLE:
             case MAX_COMPUTE_EXTERNAL_TABLE:
             case TRINO_CONNECTOR_EXTERNAL_TABLE:
-                return new LogicalFileScan(unboundRelation.getRelationId(), 
(ExternalTable) table, tableQualifier,
-                    unboundRelation.getTableSample());
+                return new LogicalFileScan(unboundRelation.getRelationId(), 
(ExternalTable) table,
+                        qualifierWithoutTableName, 
unboundRelation.getTableSample());
             case SCHEMA:
-                return new LogicalSchemaScan(unboundRelation.getRelationId(), 
table, tableQualifier);
+                return new LogicalSchemaScan(unboundRelation.getRelationId(), 
table, qualifierWithoutTableName);
             case JDBC_EXTERNAL_TABLE:
             case JDBC:
-                return new LogicalJdbcScan(unboundRelation.getRelationId(), 
table, tableQualifier);
+                return new LogicalJdbcScan(unboundRelation.getRelationId(), 
table, qualifierWithoutTableName);
             case ODBC:
-                return new LogicalOdbcScan(unboundRelation.getRelationId(), 
table, tableQualifier);
+                return new LogicalOdbcScan(unboundRelation.getRelationId(), 
table, qualifierWithoutTableName);
             case ES_EXTERNAL_TABLE:
-                return new LogicalEsScan(unboundRelation.getRelationId(), 
(EsExternalTable) table, tableQualifier);
+                return new LogicalEsScan(unboundRelation.getRelationId(), 
(EsExternalTable) table,
+                        qualifierWithoutTableName);
             case TEST_EXTERNAL_TABLE:
-                return new LogicalTestScan(unboundRelation.getRelationId(), 
table, tableQualifier);
+                return new LogicalTestScan(unboundRelation.getRelationId(), 
table, qualifierWithoutTableName);
             default:
                 throw new AnalysisException("Unsupported tableType " + 
table.getType());
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
index b4dbc944460..5f7982aae46 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCatalogRelation.java
@@ -39,11 +39,11 @@ import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.algebra.CatalogRelation;
 import org.apache.doris.nereids.util.Utils;
+import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -57,7 +57,7 @@ import java.util.function.Supplier;
 public abstract class LogicalCatalogRelation extends LogicalRelation 
implements CatalogRelation {
 
     protected final TableIf table;
-    // [catalogName, databaseName, tableName]
+    // [catalogName, databaseName]
     protected final ImmutableList<String> qualifier;
 
     public LogicalCatalogRelation(RelationId relationId, PlanType type, 
TableIf table, List<String> qualifier) {
@@ -82,13 +82,20 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
     public DatabaseIf getDatabase() throws AnalysisException {
         Preconditions.checkArgument(!qualifier.isEmpty(), "qualifier can not 
be empty");
         try {
-            CatalogIf catalog = qualifier.size() == 3
-                    ? 
Env.getCurrentEnv().getCatalogMgr().getCatalogOrException(qualifier.get(0),
-                        s -> new Exception("Catalog [" + qualifier.get(0) + "] 
does not exist."))
-                    : Env.getCurrentEnv().getCurrentCatalog();
-            return catalog.getDbOrException(qualifier.size() == 3 ? 
qualifier.get(1) : qualifier.get(0),
-                    s -> new Exception("Database [" + qualifier.get(1) + "] 
does not exist in catalog ["
-                        + qualifier.get(0) + "]."));
+            int len = qualifier.size();
+            if (2 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCatalogMgr()
+                        .getCatalogOrAnalysisException(qualifier.get(0));
+                return catalog.getDbOrAnalysisException(qualifier.get(1));
+            } else if (1 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCurrentCatalog();
+                return catalog.getDbOrAnalysisException(qualifier.get(0));
+            } else if (0 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCurrentCatalog();
+                ConnectContext ctx = ConnectContext.get();
+                return catalog.getDb(ctx.getDatabase()).get();
+            }
+            return null;
         } catch (Exception e) {
             throw new AnalysisException(e.getMessage(), e);
         }
@@ -110,9 +117,6 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
      * Full qualified name parts, i.e., concat qualifier and name into a list.
      */
     public List<String> qualified() {
-        if (qualifier.size() == 3) {
-            return qualifier;
-        }
         return Utils.qualifiedNameParts(qualifier, table.getName());
     }
 
@@ -120,9 +124,6 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
      * Full qualified table name, concat qualifier and name with `.` as 
separator.
      */
     public String qualifiedName() {
-        if (qualifier.size() == 3) {
-            return StringUtils.join(qualifier, ".");
-        }
         return Utils.qualifiedName(qualifier, table.getName());
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCatalogRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCatalogRelation.java
index 70ac9aaa645..ddc26f1041c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCatalogRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalCatalogRelation.java
@@ -31,6 +31,7 @@ import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.algebra.CatalogRelation;
 import org.apache.doris.nereids.util.Utils;
+import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.statistics.Statistics;
 
 import com.google.common.base.Preconditions;
@@ -85,13 +86,20 @@ public abstract class PhysicalCatalogRelation extends 
PhysicalRelation implement
     public DatabaseIf getDatabase() throws AnalysisException {
         Preconditions.checkArgument(!qualifier.isEmpty(), "qualifier can not 
be empty");
         try {
-            CatalogIf catalog = qualifier.size() == 3
-                    ? 
Env.getCurrentEnv().getCatalogMgr().getCatalogOrException(qualifier.get(0),
-                        s -> new Exception("Catalog [" + qualifier.get(0) + "] 
does not exist."))
-                    : Env.getCurrentEnv().getCurrentCatalog();
-            return catalog.getDbOrException(qualifier.size() == 3 ? 
qualifier.get(1) : qualifier.get(0),
-                    s -> new Exception("Database [" + qualifier.get(1) + "] 
does not exist in catalog ["
-                        + qualifier.get(0) + "]."));
+            int len = qualifier.size();
+            if (2 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCatalogMgr()
+                        .getCatalogOrAnalysisException(qualifier.get(0));
+                return catalog.getDbOrAnalysisException(qualifier.get(1));
+            } else if (1 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCurrentCatalog();
+                return catalog.getDbOrAnalysisException(qualifier.get(0));
+            } else if (0 == len) {
+                CatalogIf<DatabaseIf> catalog = 
Env.getCurrentEnv().getCurrentCatalog();
+                ConnectContext ctx = ConnectContext.get();
+                return catalog.getDb(ctx.getDatabase()).get();
+            }
+            return null;
         } catch (Exception e) {
             throw new AnalysisException(e.getMessage(), e);
         }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java
index d719f3a8f89..25d0bb706be 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java
@@ -64,7 +64,7 @@ class BindRelationTest extends TestWithFeService implements 
GeneratedPlanPattern
 
         Assertions.assertTrue(plan instanceof LogicalOlapScan);
         Assertions.assertEquals(
-                ImmutableList.of(DEFAULT_CLUSTER_PREFIX + DB1, "t"),
+                ImmutableList.of("internal", DEFAULT_CLUSTER_PREFIX + DB1, 
"t"),
                 ((LogicalOlapScan) plan).qualified());
     }
 
@@ -76,7 +76,7 @@ class BindRelationTest extends TestWithFeService implements 
GeneratedPlanPattern
 
         Assertions.assertTrue(plan instanceof LogicalOlapScan);
         Assertions.assertEquals(
-                ImmutableList.of(DEFAULT_CLUSTER_PREFIX + DB1, "t"),
+                ImmutableList.of("internal", DEFAULT_CLUSTER_PREFIX + DB1, 
"t"),
                 ((LogicalOlapScan) plan).qualified());
     }
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ColumnPruningTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ColumnPruningTest.java
index c19fd68a72b..e6f2bb6838d 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ColumnPruningTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ColumnPruningTest.java
@@ -70,18 +70,18 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                                         logicalProject()
                                                                 .when(p -> 
getOutputQualifiedNames(p).containsAll(
                                                                         
ImmutableList.of(
-                                                                               
 "test.student.id",
-                                                                               
 "test.student.name"))),
+                                                                               
 "internal.test.student.id",
+                                                                               
 "internal.test.student.name"))),
                                                         logicalProject().when(
                                                                 p -> 
getOutputQualifiedNames(p).containsAll(
                                                                         
ImmutableList.of(
-                                                                               
 "test.score.sid",
-                                                                               
 "test.score.grade")))
+                                                                               
 "internal.test.score.sid",
+                                                                               
 "internal.test.score.grade")))
                                                 ))
                                                 .when(p -> 
getOutputQualifiedNames(p)
                                                         .containsAll(
-                                                                
ImmutableList.of("test.student.name",
-                                                                        
"test.student.id")))
+                                                                
ImmutableList.of("internal.test.student.name",
+                                                                        
"internal.test.student.id")))
                                 )
                         )
                 );
@@ -102,18 +102,18 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                                         logicalProject()
                                                                 .when(p -> 
getOutputQualifiedNames(p).containsAll(
                                                                         
ImmutableList.of(
-                                                                               
 "test.student.id",
-                                                                               
 "test.student.name",
-                                                                               
 "test.student.sex"))),
+                                                                               
 "internal.test.student.id",
+                                                                               
 "internal.test.student.name",
+                                                                               
 "internal.test.student.sex"))),
 
                                                         logicalRelation()
                                                 ))
                                                 .when(p -> 
getOutputQualifiedNames(p)
                                                         .containsAll(
-                                                                
ImmutableList.of("test.student.name",
-                                                                        
"test.score.cid",
-                                                                        
"test.score.grade",
-                                                                        
"test.student.sex")))
+                                                                
ImmutableList.of("internal.test.student.name",
+                                                                        
"internal.test.score.cid",
+                                                                        
"internal.test.score.grade",
+                                                                        
"internal.test.student.sex")))
                                 )
                         )
                 );
@@ -129,9 +129,9 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                 logicalFilter(
                                         logicalProject().when(p -> 
getOutputQualifiedNames(p)
                                                 .containsAll(ImmutableList.of(
-                                                        "test.student.name",
-                                                        "test.student.id",
-                                                        "test.student.age")))
+                                                        
"internal.test.student.name",
+                                                        
"internal.test.student.id",
+                                                        
"internal.test.student.age")))
                                 )
                         )
                 );
@@ -155,25 +155,25 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                                                 
logicalProject(logicalRelation())
                                                                         
.when(p -> getOutputQualifiedNames(
                                                                                
 p).containsAll(ImmutableList.of(
-                                                                               
 "test.student.id",
-                                                                               
 "test.student.name"))),
+                                                                               
 "internal.test.student.id",
+                                                                               
 "internal.test.student.name"))),
                                                                 
logicalRelation()
 
                                                         )).when(p -> 
getOutputQualifiedNames(p)
                                                                 
.containsAll(ImmutableList.of(
-                                                                        
"test.student.name",
-                                                                        
"test.score.cid",
-                                                                        
"test.score.grade"))),
+                                                                        
"internal.test.student.name",
+                                                                        
"internal.test.score.cid",
+                                                                        
"internal.test.score.grade"))),
                                                         
logicalProject(logicalRelation())
                                                                 .when(p -> 
getOutputQualifiedNames(p)
                                                                         
.containsAll(ImmutableList.of(
-                                                                               
 "test.course.cid",
-                                                                               
 "test.course.cname")))
+                                                                               
 "internal.test.course.cid",
+                                                                               
 "internal.test.course.cname")))
                                                 )
                                         ).when(p -> 
getOutputQualifiedNames(p).containsAll(ImmutableList.of(
-                                                "test.student.name",
-                                                "test.course.cname",
-                                                "test.score.grade")))
+                                                "internal.test.student.name",
+                                                "internal.test.course.cname",
+                                                "internal.test.score.grade")))
                                 )
                         )
                 );
@@ -280,12 +280,12 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                             logicalProject(logicalRelation())
                                                     .when(p -> 
getOutputQualifiedNames(p)
                                                             
.containsAll(ImmutableList.of(
-                                                                    
"test.student.id",
-                                                                    
"test.student.name"))),
+                                                                    
"internal.test.student.id",
+                                                                    
"internal.test.student.name"))),
                                             logicalProject(logicalRelation())
                                                     .when(p -> 
getOutputQualifiedNames(p)
                                                             
.containsAll(ImmutableList.of(
-                                                                    
"test.score.sid")))
+                                                                    
"internal.test.score.sid")))
                                     )
                         )
                 );
@@ -304,10 +304,10 @@ public class ColumnPruningTest extends TestWithFeService 
implements MemoPatternM
                                             logicalProject(
                                                 logicalOlapScan()
                                             ).when(p -> 
getOutputQualifiedNames(p).equals(
-                                                    
ImmutableList.of("test.student.id")
+                                                    
ImmutableList.of("internal.test.student.id")
                                             ))
                                         ).when(agg -> 
getOutputQualifiedNames(agg.getOutputs()).equals(
-                                                
ImmutableList.of("test.student.id")
+                                                
ImmutableList.of("internal.test.student.id")
                                 )))
                             )
                         )


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to