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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 8e99116941 [Fix] (multi catalog)Fix external table couldn't find db 
bug (#22074) (#22877)
8e99116941 is described below

commit 8e991169411ed82e868983f5db209a52e5ee82bc
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Fri Aug 11 17:49:08 2023 +0800

    [Fix] (multi catalog)Fix external table couldn't find db bug (#22074) 
(#22877)
    
    Nereids LogicalCatalogRelation and PhysicalCatalogRelation getDatabase 
function only try to search InternalCatalog to find a table. This will cause 
all external table failed to query because it couldn't find the external 
database in Internal catalog.
    ```
    mysql> explain select count(*) from multi_partition_orc;
    ERROR 1105 (HY000): AnalysisException, msg: Database 
[default_cluster:multi_partition] does not exist.
    ```
    
    This pr is using catalog name to find the correct catalog first, and then 
try to get the database in this catalog.
---
 .../doris/nereids/rules/analysis/BindRelation.java  |  9 +++------
 .../trees/plans/algebra/CatalogRelation.java        |  4 ++--
 .../trees/plans/logical/LogicalCatalogRelation.java | 21 ++++++++++++++++-----
 .../plans/physical/PhysicalCatalogRelation.java     | 20 +++++++++++++++-----
 4 files changed, 36 insertions(+), 18 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 425641fda3..aff19c5441 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
@@ -200,7 +200,6 @@ public class BindRelation extends OneAnalysisRuleFactory {
 
     private LogicalPlan getLogicalPlan(TableIf table, UnboundRelation 
unboundRelation, List<String> tableQualifier,
                                        CascadesContext cascadesContext) {
-        String dbName = tableQualifier.get(1); //[catalogName, dbName, 
tableName]
         switch (table.getType()) {
             case OLAP:
                 return makeOlapScan(table, unboundRelation, tableQualifier);
@@ -223,14 +222,12 @@ public class BindRelation extends OneAnalysisRuleFactory {
                 return new 
LogicalFileScan(StatementScopeIdGenerator.newRelationId(),
                         (ExternalTable) table, tableQualifier);
             case SCHEMA:
-                return new LogicalSchemaScan(unboundRelation.getRelationId(),
-                        table, ImmutableList.of(dbName));
+                return new LogicalSchemaScan(unboundRelation.getRelationId(), 
table, tableQualifier);
             case JDBC_EXTERNAL_TABLE:
             case JDBC:
-                return new LogicalJdbcScan(unboundRelation.getRelationId(), 
table, ImmutableList.of(dbName));
+                return new LogicalJdbcScan(unboundRelation.getRelationId(), 
table, tableQualifier);
             case ES_EXTERNAL_TABLE:
-                return new LogicalEsScan(unboundRelation.getRelationId(),
-                    (EsExternalTable) table, ImmutableList.of(dbName));
+                return new LogicalEsScan(unboundRelation.getRelationId(), 
(EsExternalTable) table, tableQualifier);
             default:
                 throw new AnalysisException("Unsupported tableType:" + 
table.getType());
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/CatalogRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/CatalogRelation.java
index f009c41334..d713ba16a8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/CatalogRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/CatalogRelation.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.nereids.trees.plans.algebra;
 
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 
@@ -26,5 +26,5 @@ public interface CatalogRelation extends Relation {
 
     TableIf getTable();
 
-    Database getDatabase() throws AnalysisException;
+    DatabaseIf getDatabase() throws AnalysisException;
 }
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 6150e9047a..246c875f91 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
@@ -17,9 +17,10 @@
 
 package org.apache.doris.nereids.trees.plans.logical;
 
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.TableIf;
+import org.apache.doris.datasource.CatalogIf;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
@@ -43,6 +44,7 @@ import java.util.Optional;
 public abstract class LogicalCatalogRelation extends LogicalRelation 
implements CatalogRelation {
 
     protected final TableIf table;
+    // [catalogName, databaseName, tableName]
     protected final ImmutableList<String> qualifier;
 
     public LogicalCatalogRelation(RelationId relationId, PlanType type, 
TableIf table, List<String> qualifier) {
@@ -64,10 +66,19 @@ public abstract class LogicalCatalogRelation extends 
LogicalRelation implements
     }
 
     @Override
-    public Database getDatabase() throws AnalysisException {
-        Preconditions.checkArgument(!qualifier.isEmpty());
-        return 
Env.getCurrentInternalCatalog().getDbOrException(qualifier.get(0),
-                s -> new AnalysisException("Database [" + qualifier.get(0) + 
"] does not exist."));
+    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) + "]."));
+        } catch (Exception e) {
+            throw new AnalysisException(e.getMessage(), e);
+        }
     }
 
     @Override
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 b25a7c530a..fc359fe305 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
@@ -17,9 +17,10 @@
 
 package org.apache.doris.nereids.trees.plans.physical;
 
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.TableIf;
+import org.apache.doris.datasource.CatalogIf;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
@@ -81,10 +82,19 @@ public abstract class PhysicalCatalogRelation extends 
PhysicalRelation implement
     }
 
     @Override
-    public Database getDatabase() throws AnalysisException {
-        Preconditions.checkArgument(!qualifier.isEmpty());
-        return 
Env.getCurrentInternalCatalog().getDbOrException(qualifier.get(0),
-                s -> new AnalysisException("Database [" + qualifier.get(0) + 
"] does not exist."));
+    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) + "]."));
+        } catch (Exception e) {
+            throw new AnalysisException(e.getMessage(), e);
+        }
     }
 
     @Override


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

Reply via email to