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 07336980f99 [fix](meta) show partitions with Limit for external HMS 
tables (27835) (#27835)
07336980f99 is described below

commit 07336980f99b50b9a73fa91790cc047192e8cd2d
Author: Nitin-Kashyap <[email protected]>
AuthorDate: Fri Dec 8 23:14:45 2023 +0530

    [fix](meta) show partitions with Limit for external HMS tables (27835) 
(#27835)
    
    This enhancement shall extend existing logic for SHOW PARTITIONS FROM to 
include: -
    
    Limit/Offset
    Where [partition name only] [equal operator and like operator]
    Order by [partition name only]
    Issue Number: close #27834
---
 .../apache/doris/analysis/ShowPartitionsStmt.java  | 11 ++++-
 .../doris/common/proc/PartitionsProcDir.java       |  5 ++-
 .../java/org/apache/doris/qe/ShowExecutor.java     | 36 +++++++++++++---
 .../hive/test_hive_partitions.out                  | 49 ++++++++++++++++++++++
 .../hive/test_hive_partitions.groovy               | 33 +++++++++++++++
 5 files changed, 126 insertions(+), 8 deletions(-)

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 c9faaf42174..3ba1db23d52 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
@@ -58,7 +58,7 @@ public class ShowPartitionsStmt extends ShowStmt {
     private static final Logger LOG = 
LogManager.getLogger(ShowPartitionsStmt.class);
 
     private static final String FILTER_PARTITION_ID = "PartitionId";
-    private static final String FILTER_PARTITION_NAME = "PartitionName";
+    public static final String FILTER_PARTITION_NAME = "PartitionName";
     private static final String FILTER_STATE = "State";
     private static final String FILTER_BUCKETS = "Buckets";
     private static final String FILTER_REPLICATION_NUM = "ReplicationNum";
@@ -198,6 +198,11 @@ public class ShowPartitionsStmt extends ShowStmt {
                     throw new AnalysisException("Should order by column");
                 }
                 SlotRef slotRef = (SlotRef) orderByElement.getExpr();
+                if (catalog instanceof HMSExternalCatalog
+                        && 
!slotRef.getColumnName().equalsIgnoreCase(FILTER_PARTITION_NAME)) {
+                    throw new AnalysisException("External table only support 
Order By on PartitionName");
+                }
+
                 int index = 
PartitionsProcDir.analyzeColumn(slotRef.getColumnName());
                 OrderByPair orderByPair = new OrderByPair(index, 
!orderByElement.getIsAsc());
                 orderByPairs.add(orderByPair);
@@ -228,6 +233,10 @@ public class ShowPartitionsStmt extends ShowStmt {
         }
 
         String leftKey = ((SlotRef) subExpr.getChild(0)).getColumnName();
+        if (catalog instanceof HMSExternalCatalog && 
!leftKey.equalsIgnoreCase(FILTER_PARTITION_NAME)) {
+            throw new AnalysisException(String.format("Only %s column 
supported in where clause for this catalog",
+                FILTER_PARTITION_NAME));
+        }
         if (subExpr instanceof BinaryPredicate) {
             BinaryPredicate binaryPredicate = (BinaryPredicate) subExpr;
             if (leftKey.equalsIgnoreCase(FILTER_PARTITION_NAME) || 
leftKey.equalsIgnoreCase(FILTER_STATE)) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
index 11dd8d4c188..9319c96e040 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
@@ -81,7 +81,8 @@ public class PartitionsProcDir implements ProcDirInterface {
         this.isTempPartition = isTempPartition;
     }
 
-    public boolean filter(String columnName, Comparable element, Map<String, 
Expr> filterMap) throws AnalysisException {
+    public static boolean filter(String columnName, Comparable element, 
Map<String, Expr> filterMap)
+            throws AnalysisException {
         if (filterMap == null) {
             return true;
         }
@@ -142,7 +143,7 @@ public class PartitionsProcDir implements ProcDirInterface {
         return true;
     }
 
-    public boolean like(String str, String expr) {
+    public static boolean like(String str, String expr) {
         expr = expr.toLowerCase();
         expr = expr.replace(".", "\\.");
         expr = expr.replace("?", ".");
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 ffc8e2652f3..df3ddc3151d 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
@@ -24,6 +24,7 @@ import 
org.apache.doris.analysis.AdminShowReplicaDistributionStmt;
 import org.apache.doris.analysis.AdminShowReplicaStatusStmt;
 import org.apache.doris.analysis.AdminShowTabletStorageFormatStmt;
 import org.apache.doris.analysis.DescribeStmt;
+import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.HelpStmt;
 import org.apache.doris.analysis.LimitElement;
 import org.apache.doris.analysis.PartitionNames;
@@ -1655,28 +1656,53 @@ public class ShowExecutor {
         resultSet = new ShowResultSet(showStmt.getMetaData(), rows);
     }
 
-    private void handleShowHMSTablePartitions(ShowPartitionsStmt showStmt) {
+    private void handleShowHMSTablePartitions(ShowPartitionsStmt showStmt) 
throws AnalysisException {
         HMSExternalCatalog catalog = (HMSExternalCatalog) 
(showStmt.getCatalog());
         List<List<String>> rows = new ArrayList<>();
         String dbName = 
ClusterNamespace.getNameFromFullName(showStmt.getTableName().getDb());
 
         List<String> partitionNames;
         LimitElement limit = showStmt.getLimitElement();
-        if (limit != null && limit.hasLimit()) {
-            // only limit is valid on Hive
+        Map<String, Expr> filterMap = showStmt.getFilterMap();
+        List<OrderByPair> orderByPairs = showStmt.getOrderByPairs();
+
+        if (limit != null && limit.hasLimit() && limit.getOffset() == 0
+                && (orderByPairs == null || !orderByPairs.get(0).isDesc())) {
+            // hmsClient returns unordered partition list, hence if offset > 0 
cannot pass limit
             partitionNames = catalog.getClient()
-                    .listPartitionNames(dbName, 
showStmt.getTableName().getTbl(), limit.getLimit());
+                .listPartitionNames(dbName, showStmt.getTableName().getTbl(), 
limit.getLimit());
         } else {
             partitionNames = catalog.getClient().listPartitionNames(dbName, 
showStmt.getTableName().getTbl());
         }
+
+        /* Filter add rows */
         for (String partition : partitionNames) {
             List<String> list = new ArrayList<>();
+
+            if (filterMap != null && !filterMap.isEmpty()) {
+                if 
(!PartitionsProcDir.filter(ShowPartitionsStmt.FILTER_PARTITION_NAME, partition, 
filterMap)) {
+                    continue;
+                }
+            }
             list.add(partition);
             rows.add(list);
         }
 
         // sort by partition name
-        rows.sort(Comparator.comparing(x -> x.get(0)));
+        if (orderByPairs != null && orderByPairs.get(0).isDesc()) {
+            rows.sort(Comparator.comparing(x -> x.get(0), 
Comparator.reverseOrder()));
+        } else {
+            rows.sort(Comparator.comparing(x -> x.get(0)));
+        }
+
+        if (limit != null && limit.hasLimit()) {
+            int beginIndex = (int) limit.getOffset();
+            int endIndex = (int) (beginIndex + limit.getLimit());
+            if (endIndex > rows.size()) {
+                endIndex = rows.size();
+            }
+            rows = rows.subList(beginIndex, endIndex);
+        }
 
         resultSet = new ShowResultSet(showStmt.getMetaData(), rows);
     }
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_partitions.out 
b/regression-test/data/external_table_p0/hive/test_hive_partitions.out
index f5f44b2368a..646cc560fb5 100644
--- a/regression-test/data/external_table_p0/hive/test_hive_partitions.out
+++ b/regression-test/data/external_table_p0/hive/test_hive_partitions.out
@@ -71,3 +71,52 @@
 55     1.22zxy
 56     1.22ZXY
 
+-- !q11 --
+nation=cn/city=beijing
+nation=cn/city=shanghai
+nation=jp/city=tokyo
+nation=rus/city=moscow
+nation=us/city=chicago
+nation=us/city=washington
+
+-- !q12 --
+nation=cn/city=beijing
+
+-- !q13 --
+nation=us/city=chicago
+nation=us/city=washington
+
+-- !q14 --
+nation=rus/city=moscow
+nation=us/city=chicago
+nation=us/city=washington
+
+-- !q16 --
+nation=cn/city=beijing
+nation=cn/city=shanghai
+nation=jp/city=tokyo
+
+-- !q17 --
+nation=jp/city=tokyo
+nation=rus/city=moscow
+nation=us/city=chicago
+
+-- !q18 --
+nation=us/city=chicago
+nation=us/city=washington
+
+-- !q19 --
+nation=rus/city=moscow
+nation=jp/city=tokyo
+nation=cn/city=shanghai
+
+-- !q20 --
+nation=cn/city=beijing
+nation=cn/city=shanghai
+nation=jp/city=tokyo
+nation=rus/city=moscow
+nation=us/city=chicago
+nation=us/city=washington
+
+-- !q21 --
+
diff --git 
a/regression-test/suites/external_table_p0/hive/test_hive_partitions.groovy 
b/regression-test/suites/external_table_p0/hive/test_hive_partitions.groovy
index 8eae4e82e63..09bcc1b8608 100644
--- a/regression-test/suites/external_table_p0/hive/test_hive_partitions.groovy
+++ b/regression-test/suites/external_table_p0/hive/test_hive_partitions.groovy
@@ -35,6 +35,39 @@ suite("test_hive_partitions", 
"p0,external,hive,external_docker,external_docker_
         select id, data from table_with_pars where dt_par = '2023-02-01' and 
time_par = '2023-02-01 01:30:00'
         and decimal_par1 = '1' and decimal_par2 = '1.2' and decimal_par3 = 
'1.22' order by id;
         """
+        qt_q11 """
+            show partitions from partition_table;
+        """
+        qt_q12 """
+            show partitions from partition_table WHERE 
partitionName='nation=cn/city=beijing';
+        """
+        qt_q13 """
+            show partitions from partition_table WHERE partitionName like 
'nation=us/%';
+        """
+        qt_q14 """
+            show partitions from partition_table WHERE partitionName like 
'nation=%us%';
+        """
+        qt_q16 """
+            show partitions from partition_table LIMIT 3;
+        """
+        qt_q17 """
+            show partitions from partition_table LIMIT 3 OFFSET 2;
+        """
+        qt_q18 """
+            show partitions from partition_table LIMIT 3 OFFSET 4;
+        """
+        qt_q19 """
+            show partitions from partition_table ORDER BY partitionName desc 
LIMIT 3 OFFSET 2;
+        """
+        qt_q20 """
+            show partitions from partition_table ORDER BY partitionName asc;
+        """
+        qt_q21 """
+            show partitions from partition_table
+                WHERE partitionName like '%X%'
+                ORDER BY partitionName DESC
+                LIMIT 1;
+        """
     }
 
     String enabled = context.config.otherConfigs.get("enableHiveTest")


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to