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

yiguolei 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 41d4ed8367 [Improvement](multicatalog) support show_partitions for hms 
catalog (#19242)
41d4ed8367 is described below

commit 41d4ed8367c5719d2d676d143b905c8a97cd10aa
Author: Yulei-Yang <yulei.yang0...@gmail.com>
AuthorDate: Thu May 11 01:17:23 2023 +0800

    [Improvement](multicatalog) support show_partitions for hms catalog (#19242)
    
    * [Improvement](multicatalog) support show_partitions for hms catalog
    
    * update according review advice
---
 .../Show-Statements/SHOW-PARTITIONS.md             | 10 +++-
 .../Show-Statements/SHOW-PARTITIONS.md             | 10 +++-
 .../apache/doris/analysis/ShowPartitionsStmt.java  | 59 ++++++++++++++++------
 .../org/apache/doris/datasource/CatalogIf.java     |  5 ++
 .../java/org/apache/doris/qe/ShowExecutor.java     | 33 ++++++++++--
 5 files changed, 95 insertions(+), 22 deletions(-)

diff --git 
a/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md 
b/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
index d382ea1173..738ce39a37 100644
--- a/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
+++ b/docs/en/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
@@ -32,7 +32,7 @@ SHOW PARTITIONS
 
 ### Description
 
-  This statement is used to display partition information
+  This statement is used to display partition information for tables in 
Internal catalog or Hive Catalog
 
 grammar:
 
@@ -42,9 +42,17 @@ grammar:
 
 illustrate:
 
+When used in Internal catalog:
 1. Support the filtering of PartitionId, PartitionName, State, Buckets, 
ReplicationNum, LastConsistencyCheckTime and other columns
 2. TEMPORARY specifies to list temporary partitions
 
+<version since="dev">
+
+when used in Hive Catalog:
+Will return all partitions' name. Support multilevel partition table
+
+</version>
+
 ### Example
 
 1. Display all non-temporary partition information of the specified table 
under the specified db
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md 
b/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
index 50d39536f4..f9d6ddb567 100644
--- 
a/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
+++ 
b/docs/zh-CN/docs/sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS.md
@@ -32,7 +32,7 @@ SHOW PARTITIONS
 
 ### Description
 
-该语句用于展示分区信息
+该语句用于展示分区信息。支持 Internal catalog 和 Hive Catalog
 
 语法:
 
@@ -42,9 +42,17 @@ SHOW PARTITIONS
 
 说明:
 
+对于 Internal catalog:
 1. 
支持PartitionId,PartitionName,State,Buckets,ReplicationNum,LastConsistencyCheckTime等列的过滤
 2. TEMPORARY指定列出临时分区
 
+<version since="dev">
+
+对于 Hive Catalog:
+支持返回所有分区,包括多级分区
+
+</version>
+
 ### Example
 
 1. 展示指定db下指定表的所有非临时分区信息
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
index 2d3b0a6fa0..d2cb8b1f0f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
@@ -18,10 +18,11 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
@@ -32,7 +33,8 @@ import org.apache.doris.common.proc.ProcNodeInterface;
 import org.apache.doris.common.proc.ProcResult;
 import org.apache.doris.common.proc.ProcService;
 import org.apache.doris.common.util.OrderByPair;
-import org.apache.doris.common.util.Util;
+import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.datasource.HMSExternalCatalog;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.ShowResultSetMetaData;
@@ -57,6 +59,7 @@ public class ShowPartitionsStmt extends ShowStmt {
     private static final String FILTER_REPLICATION_NUM = "ReplicationNum";
     private static final String FILTER_LAST_CONSISTENCY_CHECK_TIME = 
"LastConsistencyCheckTime";
 
+    private CatalogIf catalog;
     private TableName tableName;
     private Expr whereClause;
     private List<OrderByElement> orderByElements;
@@ -80,6 +83,14 @@ public class ShowPartitionsStmt extends ShowStmt {
         this.isTempPartition = isTempPartition;
     }
 
+    public CatalogIf getCatalog() {
+        return catalog;
+    }
+
+    public TableName getTableName() {
+        return tableName;
+    }
+
     public List<OrderByPair> getOrderByPairs() {
         return orderByPairs;
     }
@@ -102,15 +113,19 @@ public class ShowPartitionsStmt extends ShowStmt {
         // check access
         String dbName = tableName.getDb();
         String tblName = tableName.getTbl();
-        if 
(!Env.getCurrentEnv().getAccessManager().checkTblPriv(ConnectContext.get(), 
dbName, tblName,
-                                                                
PrivPredicate.SHOW)) {
+        if 
(!Env.getCurrentEnv().getAccessManager().checkTblPriv(ConnectContext.get(), 
catalog.getName(), dbName,
+                tblName, PrivPredicate.SHOW)) {
             
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, 
"SHOW PARTITIONS",
                                                 
ConnectContext.get().getQualifiedUser(),
                                                 
ConnectContext.get().getRemoteIP(),
                                                 dbName + ": " + tblName);
         }
-        Database db = 
Env.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
-        Table table = db.getTableOrMetaException(tblName, 
Table.TableType.OLAP);
+        if (!catalog.isInternalCatalog()) {
+            return;
+        }
+
+        DatabaseIf db = catalog.getDbOrAnalysisException(dbName);
+        TableIf table = db.getTableOrMetaException(tblName, 
Table.TableType.OLAP);
         table.readLock();
         try {
             // build proc path
@@ -137,8 +152,16 @@ public class ShowPartitionsStmt extends ShowStmt {
     public void analyzeImpl(Analyzer analyzer) throws UserException {
         super.analyze(analyzer);
         tableName.analyze(analyzer);
-        // disallow external catalog
-        Util.prohibitExternalCatalog(tableName.getCtl(), 
this.getClass().getSimpleName());
+        catalog = 
Env.getCurrentEnv().getCatalogMgr().getCatalog(tableName.getCtl());
+        if (catalog == null) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_NAME_FOR_CATALOG);
+        }
+
+        // disallow unsupported catalog
+        if (!(catalog.isInternalCatalog() || catalog instanceof 
HMSExternalCatalog)) {
+            throw new AnalysisException(String.format("Catalog of type '%s' is 
not allowed in ShowPartitionsStmt",
+                catalog.getType()));
+        }
 
         // analyze where clause if not null
         if (whereClause != null) {
@@ -222,15 +245,19 @@ public class ShowPartitionsStmt extends ShowStmt {
     public ShowResultSetMetaData getMetaData() {
         ShowResultSetMetaData.Builder builder = 
ShowResultSetMetaData.builder();
 
-        ProcResult result = null;
-        try {
-            result = node.fetchResult();
-        } catch (AnalysisException e) {
-            return builder.build();
-        }
+        if (catalog.isInternalCatalog()) {
+            ProcResult result = null;
+            try {
+                result = node.fetchResult();
+            } catch (AnalysisException e) {
+                return builder.build();
+            }
 
-        for (String col : result.getColumnNames()) {
-            builder.addColumn(new Column(col, ScalarType.createVarchar(30)));
+            for (String col : result.getColumnNames()) {
+                builder.addColumn(new Column(col, 
ScalarType.createVarchar(30)));
+            }
+        } else {
+            builder.addColumn(new Column("Partition", 
ScalarType.createVarchar(60)));
         }
         return builder.build();
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
index 260c83c636..eac17865a2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
@@ -17,6 +17,7 @@
 
 package org.apache.doris.datasource;
 
+
 import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.common.AnalysisException;
@@ -50,6 +51,10 @@ public interface CatalogIf<T extends DatabaseIf> {
 
     List<String> getDbNames();
 
+    default boolean isInternalCatalog() {
+        return this instanceof InternalCatalog;
+    }
+
     // Will be used when querying the information_schema table
     // Unable to get db for uninitialized catalog to avoid query timeout
     default List<String> getDbNamesOrEmpty() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 06e9f22845..f1f52357fc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -171,6 +171,7 @@ import org.apache.doris.common.util.RuntimeProfile;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.common.util.Util;
 import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.datasource.HMSExternalCatalog;
 import org.apache.doris.external.iceberg.IcebergTableCreationRecord;
 import org.apache.doris.load.DeleteHandler;
 import org.apache.doris.load.ExportJob;
@@ -1525,10 +1526,34 @@ public class ShowExecutor {
 
     private void handleShowPartitions() throws AnalysisException {
         ShowPartitionsStmt showStmt = (ShowPartitionsStmt) stmt;
-        ProcNodeInterface procNodeI = showStmt.getNode();
-        Preconditions.checkNotNull(procNodeI);
-        List<List<String>> rows = ((PartitionsProcDir) 
procNodeI).fetchResultByFilter(showStmt.getFilterMap(),
-                showStmt.getOrderByPairs(), 
showStmt.getLimitElement()).getRows();
+        if (showStmt.getCatalog().isInternalCatalog()) {
+            ProcNodeInterface procNodeI = showStmt.getNode();
+            Preconditions.checkNotNull(procNodeI);
+            List<List<String>> rows = ((PartitionsProcDir) 
procNodeI).fetchResultByFilter(showStmt.getFilterMap(),
+                    showStmt.getOrderByPairs(), 
showStmt.getLimitElement()).getRows();
+            resultSet = new ShowResultSet(showStmt.getMetaData(), rows);
+        } else {
+            handleShowHMSTablePartitions(showStmt);
+        }
+    }
+
+    private void handleShowHMSTablePartitions(ShowPartitionsStmt showStmt) {
+        HMSExternalCatalog catalog = (HMSExternalCatalog) 
(showStmt.getCatalog());
+        List<List<String>> rows = new ArrayList<>();
+        String dbName = 
ClusterNamespace.getNameFromFullName(showStmt.getTableName().getDb());
+        List<String> partitionNames = 
catalog.getClient().listPartitionNames(dbName,
+                showStmt.getTableName().getTbl());
+        for (String partition : partitionNames) {
+            List<String> list = new ArrayList<>();
+            list.add(partition);
+            rows.add(list);
+        }
+
+        // sort by partition name
+        rows.sort((x, y) -> {
+            return x.get(0).compareTo(y.get(0));
+        });
+
         resultSet = new ShowResultSet(showStmt.getMetaData(), rows);
     }
 


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

Reply via email to