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

morningman 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 371d7598e4 [Fix](multi catalog)Fix nereids context table always use 
internal catalog bug (#21953) (#22063)
371d7598e4 is described below

commit 371d7598e45be7f1fee5cb5727474831fe442114
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Fri Jul 21 13:36:00 2023 +0800

    [Fix](multi catalog)Fix nereids context table always use internal catalog 
bug (#21953) (#22063)
    
    cherry-pick #21953
---
 .../java/org/apache/doris/catalog/TableIf.java     |  4 ++
 .../org/apache/doris/nereids/CascadesContext.java  | 50 ++++++++++++-------
 .../apache/doris/nereids/minidump/Minidump.java    |  8 ++--
 .../doris/nereids/minidump/MinidumpUtils.java      |  7 +--
 .../java/org/apache/doris/qe/ConnectContext.java   |  8 ++--
 .../hive/test_hive_same_db_table_name.out          | 16 +++++++
 .../hive/test_hive_same_db_table_name.groovy       | 56 ++++++++++++++++++++++
 7 files changed, 120 insertions(+), 29 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
index 0f12cc2550..e9d0e91c25 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
@@ -29,6 +29,8 @@ import com.google.common.collect.Lists;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import java.io.DataOutput;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -134,6 +136,8 @@ public interface TableIf {
 
     Optional<ColumnStatistic> getColumnStatistic(String colName);
 
+    void write(DataOutput out) throws IOException;
+
     /**
      * Doris table type.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
index dff58a97e5..e16f96c932 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
@@ -17,9 +17,10 @@
 
 package org.apache.doris.nereids;
 
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.datasource.CatalogIf;
 import org.apache.doris.nereids.analyzer.Scope;
 import org.apache.doris.nereids.analyzer.UnboundRelation;
 import org.apache.doris.nereids.jobs.Job;
@@ -92,7 +93,7 @@ public class CascadesContext implements ScheduleContext {
     private final Map<SubqueryExpr, Boolean> subqueryExprIsAnalyzed;
     private final RuntimeFilterContext runtimeFilterContext;
     private Optional<Scope> outerScope = Optional.empty();
-    private List<Table> tables = null;
+    private List<TableIf> tables = null;
 
     private boolean isRewriteRoot;
     private volatile boolean isTimeout = false;
@@ -198,7 +199,7 @@ public class CascadesContext implements ScheduleContext {
         return memo;
     }
 
-    public void setTables(List<Table> tables) {
+    public void setTables(List<TableIf> tables) {
         this.tables = tables;
     }
 
@@ -365,9 +366,9 @@ public class CascadesContext implements ScheduleContext {
     }
 
     /** get table by table name, try to get from information from dumpfile 
first */
-    public Table getTableByName(String tableName) {
+    public TableIf getTableByName(String tableName) {
         Preconditions.checkState(tables != null);
-        for (Table table : tables) {
+        for (TableIf table : tables) {
             if (table.getName().equals(tableName)) {
                 return table;
             }
@@ -375,7 +376,7 @@ public class CascadesContext implements ScheduleContext {
         return null;
     }
 
-    public List<Table> getTables() {
+    public List<TableIf> getTables() {
         return tables;
     }
 
@@ -413,19 +414,24 @@ public class CascadesContext implements ScheduleContext {
         return relations;
     }
 
-    private Table getTable(UnboundRelation unboundRelation) {
+    private TableIf getTable(UnboundRelation unboundRelation) {
         List<String> nameParts = unboundRelation.getNameParts();
         switch (nameParts.size()) {
             case 1: { // table
+                String ctlName = 
getConnectContext().getEnv().getCurrentCatalog().getName();
                 String dbName = getConnectContext().getDatabase();
-                return getTable(dbName, nameParts.get(0), 
getConnectContext().getEnv());
+                return getTable(ctlName, dbName, nameParts.get(0), 
getConnectContext().getEnv());
             }
             case 2: { // db.table
+                String ctlName = 
getConnectContext().getEnv().getCurrentCatalog().getName();
                 String dbName = nameParts.get(0);
                 if (!dbName.equals(getConnectContext().getDatabase())) {
                     dbName = getConnectContext().getClusterName() + ":" + 
dbName;
                 }
-                return getTable(dbName, nameParts.get(1), 
getConnectContext().getEnv());
+                return getTable(ctlName, dbName, nameParts.get(1), 
getConnectContext().getEnv());
+            }
+            case 3: { // catalog.db.table
+                return getTable(nameParts.get(0), nameParts.get(1), 
nameParts.get(2), getConnectContext().getEnv());
             }
             default:
                 throw new IllegalStateException("Table name [" + 
unboundRelation.getTableName() + "] is invalid.");
@@ -435,13 +441,22 @@ public class CascadesContext implements ScheduleContext {
     /**
      * Find table from catalog.
      */
-    public Table getTable(String dbName, String tableName, Env env) {
-        Database db = env.getInternalCatalog().getDb(dbName)
-                .orElseThrow(() -> new RuntimeException("Database [" + dbName 
+ "] does not exist."));
+    public TableIf getTable(String ctlName, String dbName, String tableName, 
Env env) {
+        CatalogIf catalog = env.getCatalogMgr().getCatalog(ctlName);
+        if (catalog == null) {
+            throw new RuntimeException("Catalog [" + ctlName + "] does not 
exist.");
+        }
+        DatabaseIf db = catalog.getDbNullable(dbName);
+        if (db == null) {
+            throw new RuntimeException("Database [" + dbName + "] does not 
exist in catalog [" + ctlName + "].");
+        }
         db.readLock();
         try {
-            return db.getTable(tableName).orElseThrow(() -> new 
RuntimeException(
-                    "Table [" + tableName + "] does not exist in database [" + 
dbName + "]."));
+            TableIf table = db.getTableNullable(tableName);
+            if (table == null) {
+                throw new RuntimeException("Table [" + tableName + "] does not 
exist in database [" + dbName + "].");
+            }
+            return table;
         } finally {
             db.readUnlock();
         }
@@ -453,8 +468,7 @@ public class CascadesContext implements ScheduleContext {
     public static class Lock implements AutoCloseable {
 
         CascadesContext cascadesContext;
-
-        private Stack<Table> locked = new Stack<>();
+        private final Stack<TableIf> locked = new Stack<>();
 
         /**
          * Try to acquire read locks on tables, throw runtime exception once 
the acquiring for read lock failed.
@@ -465,7 +479,7 @@ public class CascadesContext implements ScheduleContext {
             if (cascadesContext.getTables() == null) {
                 cascadesContext.extractTables(plan);
             }
-            for (Table table : cascadesContext.tables) {
+            for (TableIf table : cascadesContext.tables) {
                 if (!table.tryReadLock(1, TimeUnit.MINUTES)) {
                     close();
                     throw new RuntimeException(String.format("Failed to get 
read lock on table: %s", table.getName()));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
index 90e1c0bbf8..5a286d27b5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
@@ -19,7 +19,7 @@ package org.apache.doris.nereids.minidump;
 
 import org.apache.doris.catalog.ColocateTableIndex;
 import org.apache.doris.catalog.Env;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.nereids.NereidsPlanner;
 import org.apache.doris.nereids.StatementContext;
 import org.apache.doris.nereids.glue.LogicalPlanAdapter;
@@ -61,7 +61,7 @@ public class Minidump {
     private String catalogName;
 
     // metadata objects
-    private List<Table> tables;
+    private List<TableIf> tables;
 
     private Map<String, ColumnStatistic> totalColumnStatisticMap = new 
HashMap<>();
 
@@ -71,7 +71,7 @@ public class Minidump {
 
     /** Minidump class used to save environment messages */
     public Minidump(String sql, SessionVariable sessionVariable,
-                    String parsedPlanJson, String resultPlanJson, List<Table> 
tables,
+                    String parsedPlanJson, String resultPlanJson, 
List<TableIf> tables,
                     String catalogName, String dbName, Map<String, 
ColumnStatistic> totalColumnStatisticMap,
                     Map<String, Histogram> totalHistogramMap, 
ColocateTableIndex colocateTableIndex) {
         this.sql = sql;
@@ -98,7 +98,7 @@ public class Minidump {
         return resultPlanJson;
     }
 
-    public List<Table> getTables() {
+    public List<TableIf> getTables() {
         return tables;
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
index 1fcfae0952..a276c2c3ff 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.minidump;
 import org.apache.doris.catalog.ColocateTableIndex;
 import org.apache.doris.catalog.SchemaTable;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.qe.SessionVariable;
 import org.apache.doris.statistics.ColumnStatistic;
 import org.apache.doris.statistics.Histogram;
@@ -83,7 +84,7 @@ public class MinidumpUtils {
             
newSessionVariable.readFromJson(inputJSON.getString("SessionVariable"));
             String sql = inputJSON.getString("Sql");
 
-            List<Table> tables = new ArrayList<>();
+            List<TableIf> tables = new ArrayList<>();
             String catalogName = inputJSON.getString("CatalogName");
             String dbName = inputJSON.getString("DbName");
             JSONArray tablesJson = (JSONArray) inputJSON.get("Tables");
@@ -131,9 +132,9 @@ public class MinidumpUtils {
      * serialize tables from Table in catalog to json format
      */
     public static JSONArray serializeTables(
-            String minidumpFileDir, String dbAndCatalogName, List<Table> 
tables) throws IOException {
+            String minidumpFileDir, String dbAndCatalogName, List<TableIf> 
tables) throws IOException {
         JSONArray tablesJson = new JSONArray();
-        for (Table table : tables) {
+        for (TableIf table : tables) {
             if (table instanceof SchemaTable) {
                 continue;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
index dd42960ae4..3387b702ed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
@@ -21,7 +21,7 @@ import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.FunctionRegistry;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.cluster.ClusterNamespace;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.telemetry.Telemetry;
@@ -181,7 +181,7 @@ public class ConnectContext {
     private StatementContext statementContext;
     private Map<String, PrepareStmtContext> preparedStmtCtxs = 
Maps.newHashMap();
 
-    private List<Table> tables = null;
+    private List<TableIf> tables = null;
 
     private Map<String, ColumnStatistic> totalColumnStatisticMap = new 
HashMap<>();
 
@@ -289,11 +289,11 @@ public class ConnectContext {
         return this.preparedStmtCtxs.get(stmtName);
     }
 
-    public List<Table> getTables() {
+    public List<TableIf> getTables() {
         return tables;
     }
 
-    public void setTables(List<Table> tables) {
+    public void setTables(List<TableIf> tables) {
         this.tables = tables;
     }
 
diff --git 
a/regression-test/data/external_table_emr_p2/hive/test_hive_same_db_table_name.out
 
b/regression-test/data/external_table_emr_p2/hive/test_hive_same_db_table_name.out
new file mode 100644
index 0000000000..03e8be6475
--- /dev/null
+++ 
b/regression-test/data/external_table_emr_p2/hive/test_hive_same_db_table_name.out
@@ -0,0 +1,16 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !1 --
+
+-- !2 --
+
+-- !3 --
+
+-- !4 --
+1      name1                    
+
+-- !5 --
+1      name1                    
+
+-- !6 --
+1      name1                    
+
diff --git 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_same_db_table_name.groovy
 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_same_db_table_name.groovy
new file mode 100644
index 0000000000..94c30c6db4
--- /dev/null
+++ 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_same_db_table_name.groovy
@@ -0,0 +1,56 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_hive_same_db_table_name", "p2") {
+    String enabled = context.config.otherConfigs.get("enableExternalHiveTest")
+    if (enabled != null && enabled.equalsIgnoreCase("true")) {
+        String extHiveHmsHost = 
context.config.otherConfigs.get("extHiveHmsHost")
+        String extHiveHmsPort = 
context.config.otherConfigs.get("extHiveHmsPort")
+        String catalog_name = "test_hive_same_db_table_name"
+        sql """drop catalog if exists ${catalog_name};"""
+        sql """
+            create catalog if not exists ${catalog_name} properties (
+                'type'='hms',
+                'hadoop.username' = 'hadoop',
+                'hive.metastore.uris' = 
'thrift://${extHiveHmsHost}:${extHiveHmsPort}'
+            );
+        """
+        sql """switch internal;"""
+        sql """create database if not exists multi_catalog;"""
+        sql """use multi_catalog;"""
+        sql """CREATE TABLE if not exists `region` (
+               `r_regionkey` integer NOT NULL,
+               `r_name` char(25) NOT NULL,
+               `r_comment` varchar(152)
+            ) distributed by hash(r_regionkey) buckets 1
+            PROPERTIES (
+               "replication_num" = "1" 
+            );"""
+
+        qt_1 "select * from region"
+        qt_2 "select * from multi_catalog.region"
+        qt_3 "select * from internal.multi_catalog.region"
+
+        sql """use ${catalog_name}.multi_catalog;"""
+        logger.info("switched to ${catalog_name}.multi_catalog")
+
+        qt_4 "select * from region"
+        qt_5 "select * from multi_catalog.region"
+        qt_6 "select * from ${catalog_name}.multi_catalog.region"
+    }
+}
+


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

Reply via email to