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

starocean999 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 ede62c61269 [Enhancement] (nereids)implement 
showDynamicPartitionCommand in nereids (#44295)
ede62c61269 is described below

commit ede62c61269926f5654f101ec4000a30e6b77143
Author: Vallish Pai <[email protected]>
AuthorDate: Thu Nov 21 13:43:47 2024 +0530

    [Enhancement] (nereids)implement showDynamicPartitionCommand in nereids 
(#44295)
    
    Issue Number: close #42746
---
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |   2 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  12 ++
 .../apache/doris/nereids/trees/plans/PlanType.java |   1 +
 .../commands/ShowDynamicPartitionCommand.java      | 166 +++++++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        |   5 +
 .../auth_call/test_show_dynamic_table_auth.groovy  |   6 +
 6 files changed, 191 insertions(+), 1 deletion(-)

diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index cc7ade25fb2..2ab16278525 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -203,6 +203,7 @@ supportedShowStatement
 
     : SHOW (GLOBAL | SESSION | LOCAL)? VARIABLES wildWhere?                    
     #showVariables
     | SHOW AUTHORS                                                             
     #showAuthors
+    | SHOW DYNAMIC PARTITION TABLES ((FROM | IN) 
database=multipartIdentifier)?     #showDynamicPartition
     | SHOW LAST INSERT                                                         
     #showLastInsert 
     | SHOW ALL? GRANTS                                                         
     #showGrants
     | SHOW GRANTS FOR userIdentify                                             
     #showGrantsForUser
@@ -281,7 +282,6 @@ unsupportedShowStatement
     | SHOW DATA TYPES                                                          
     #showDataTypes
     | SHOW CATALOGS wildWhere?                                                 
     #showCatalogs
     | SHOW CATALOG name=identifier                                             
     #showCatalog
-    | SHOW DYNAMIC PARTITION TABLES ((FROM | IN) 
database=multipartIdentifier)?     #showDynamicPartition
     | SHOW FULL? (COLUMNS | FIELDS) (FROM | IN) tableName=multipartIdentifier
         ((FROM | IN) database=multipartIdentifier)? wildWhere?                 
     #showColumns
     | SHOW COLLATION wildWhere?                                                
     #showCollation
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 8b942f2577e..fd84a448c7c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -207,6 +207,7 @@ import 
org.apache.doris.nereids.DorisParser.ShowCreateMTMVContext;
 import org.apache.doris.nereids.DorisParser.ShowCreateMaterializedViewContext;
 import org.apache.doris.nereids.DorisParser.ShowCreateProcedureContext;
 import org.apache.doris.nereids.DorisParser.ShowCreateTableContext;
+import org.apache.doris.nereids.DorisParser.ShowDynamicPartitionContext;
 import org.apache.doris.nereids.DorisParser.ShowFrontendsContext;
 import org.apache.doris.nereids.DorisParser.ShowGrantsContext;
 import org.apache.doris.nereids.DorisParser.ShowGrantsForUserContext;
@@ -469,6 +470,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowCreateTableCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowDynamicPartitionCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand;
@@ -4279,6 +4281,16 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         return new ShowWhiteListCommand();
     }
 
+    @Override
+    public LogicalPlan visitShowDynamicPartition(ShowDynamicPartitionContext 
ctx) {
+        String dbName = null;
+        if (ctx.database != null) {
+            List<String> nameParts = visitMultipartIdentifier(ctx.database);
+            dbName = nameParts.get(0); // only one entry possible
+        }
+        return new ShowDynamicPartitionCommand(dbName);
+    }
+
     @Override
     public LogicalPlan visitRecoverDatabase(RecoverDatabaseContext ctx) {
         String dbName = ctx.name.getText();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index a29d4d18620..291bfd3697a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -188,6 +188,7 @@ public enum PlanType {
     SHOW_CREATE_CATALOG_COMMAND,
     SHOW_CREATE_MATERIALIZED_VIEW_COMMAND,
     SHOW_CREATE_TABLE_COMMAND,
+    SHOW_DYNAMIC_PARTITION_COMMAND,
     SHOW_FRONTENDS_COMMAND,
     SHOW_GRANTS_COMMAND,
     SHOW_LAST_INSERT_COMMAND,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowDynamicPartitionCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowDynamicPartitionCommand.java
new file mode 100644
index 00000000000..12063467a32
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowDynamicPartitionCommand.java
@@ -0,0 +1,166 @@
+// 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.
+
+package org.apache.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.analysis.RedirectStatus;
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.DynamicPartitionProperty;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.OlapTable;
+import org.apache.doris.catalog.ReplicaAllocation;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Table;
+import org.apache.doris.clone.DynamicPartitionScheduler;
+import org.apache.doris.common.DdlException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.datasource.InternalCatalog;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowResultSet;
+import org.apache.doris.qe.ShowResultSetMetaData;
+import org.apache.doris.qe.StmtExecutor;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+
+/**
+ * show dynamic partition command
+ */
+public class ShowDynamicPartitionCommand extends ShowCommand {
+    private static final Logger LOG = 
LogManager.getLogger(ShowDynamicPartitionCommand.class);
+    private static final ShowResultSetMetaData 
SHOW_DYNAMIC_PARTITION_META_DATA =
+            ShowResultSetMetaData.builder()
+                    .addColumn(new Column("TableName", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("Enable", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("TimeUnit", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("Start", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("End", ScalarType.createVarchar(20)))
+                    .addColumn(new Column("Prefix", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("Buckets", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("ReplicationNum", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("ReplicaAllocation", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("StartOf", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("LastUpdateTime", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("LastSchedulerTime", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("State", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("LastCreatePartitionMsg", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("LastDropPartitionMsg", 
ScalarType.createVarchar(20)))
+                    .addColumn(new Column("ReservedHistoryPeriods", 
ScalarType.createVarchar(20)))
+                    .build();
+    private String dbName; // if empty we will use current db;
+
+    /**
+     * constructor
+     */
+    public ShowDynamicPartitionCommand(String dbName) {
+        super(PlanType.SHOW_DYNAMIC_PARTITION_COMMAND);
+        this.dbName = dbName;
+    }
+
+    @Override
+    public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) 
throws Exception {
+        if (Strings.isNullOrEmpty(dbName)) {
+            dbName = ctx.getDatabase();
+            if (Strings.isNullOrEmpty(dbName)) {
+                ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR);
+            }
+        }
+        List<List<String>> rows = Lists.newArrayList();
+        DatabaseIf db = 
ctx.getEnv().getInternalCatalog().getDbOrAnalysisException(dbName);
+        if (db != null && (db instanceof Database)) {
+            List<Table> tableList = db.getTables();
+            for (Table tbl : tableList) {
+                if (!(tbl instanceof OlapTable)) {
+                    continue;
+                }
+                DynamicPartitionScheduler dynamicPartitionScheduler = 
Env.getCurrentEnv()
+                        .getDynamicPartitionScheduler();
+                OlapTable olapTable = (OlapTable) tbl;
+                olapTable.readLock();
+                try {
+                    if (!olapTable.dynamicPartitionExists()) {
+                        
dynamicPartitionScheduler.removeRuntimeInfo(olapTable.getId());
+                        continue;
+                    }
+                    // check tbl privs
+                    if (!Env.getCurrentEnv().getAccessManager()
+                            .checkTblPriv(ConnectContext.get(), 
InternalCatalog.INTERNAL_CATALOG_NAME, db.getFullName(),
+                                    olapTable.getName(),
+                                    PrivPredicate.SHOW)) {
+                        continue;
+                    }
+                    DynamicPartitionProperty dynamicPartitionProperty
+                            = 
olapTable.getTableProperty().getDynamicPartitionProperty();
+                    String tableName = olapTable.getName();
+                    ReplicaAllocation replicaAlloc = 
dynamicPartitionProperty.getReplicaAllocation();
+                    if (replicaAlloc.isNotSet()) {
+                        replicaAlloc = olapTable.getDefaultReplicaAllocation();
+                    }
+                    String unsortedReservedHistoryPeriods = 
dynamicPartitionProperty.getReservedHistoryPeriods();
+                    rows.add(Lists.newArrayList(
+                            tableName,
+                            
String.valueOf(dynamicPartitionProperty.getEnable()),
+                            
dynamicPartitionProperty.getTimeUnit().toUpperCase(),
+                            
String.valueOf(dynamicPartitionProperty.getStart()),
+                            String.valueOf(dynamicPartitionProperty.getEnd()),
+                            dynamicPartitionProperty.getPrefix(),
+                            
String.valueOf(dynamicPartitionProperty.getBuckets()),
+                            String.valueOf(replicaAlloc.getTotalReplicaNum()),
+                            replicaAlloc.toCreateStmt(),
+                            dynamicPartitionProperty.getStartOfInfo(),
+                            
dynamicPartitionScheduler.getRuntimeInfo(olapTable.getId(),
+                                    
DynamicPartitionScheduler.LAST_UPDATE_TIME),
+                            
dynamicPartitionScheduler.getRuntimeInfo(olapTable.getId(),
+                                    
DynamicPartitionScheduler.LAST_SCHEDULER_TIME),
+                            
dynamicPartitionScheduler.getRuntimeInfo(olapTable.getId(),
+                                    
DynamicPartitionScheduler.DYNAMIC_PARTITION_STATE),
+                            
dynamicPartitionScheduler.getRuntimeInfo(olapTable.getId(),
+                                    
DynamicPartitionScheduler.CREATE_PARTITION_MSG),
+                            
dynamicPartitionScheduler.getRuntimeInfo(olapTable.getId(),
+                                    
DynamicPartitionScheduler.DROP_PARTITION_MSG),
+                            
dynamicPartitionProperty.getSortedReservedHistoryPeriods(unsortedReservedHistoryPeriods,
+                                    
dynamicPartitionProperty.getTimeUnit().toUpperCase())));
+                } catch (DdlException e) {
+                    LOG.warn("", e);
+                } finally {
+                    olapTable.readUnlock();
+                }
+            }
+        }
+        return new ShowResultSet(SHOW_DYNAMIC_PARTITION_META_DATA, rows);
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitShowDynamicPartitionCommand(this, context);
+    }
+
+    @Override
+    public RedirectStatus toRedirectStatus() {
+        return RedirectStatus.FORWARD_NO_SYNC;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
index 960590c4a7a..50df22f209f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
@@ -67,6 +67,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateMaterializedViewCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowCreateTableCommand;
+import 
org.apache.doris.nereids.trees.plans.commands.ShowDynamicPartitionCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowFrontendsCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowGrantsCommand;
 import org.apache.doris.nereids.trees.plans.commands.ShowLastInsertCommand;
@@ -364,6 +365,10 @@ public interface CommandVisitor<R, C> {
         return visitCommand(showFrontendsCommand, context);
     }
 
+    default R visitShowDynamicPartitionCommand(ShowDynamicPartitionCommand 
showDynamicPartitionCommand, C context) {
+        return visitCommand(showDynamicPartitionCommand, context);
+    }
+
     default R visitShowWhiteListCommand(ShowWhiteListCommand whiteListCommand, 
C context) {
         return visitCommand(whiteListCommand, context);
     }
diff --git 
a/regression-test/suites/auth_call/test_show_dynamic_table_auth.groovy 
b/regression-test/suites/auth_call/test_show_dynamic_table_auth.groovy
index e144d87749c..248e1d1c355 100644
--- a/regression-test/suites/auth_call/test_show_dynamic_table_auth.groovy
+++ b/regression-test/suites/auth_call/test_show_dynamic_table_auth.groovy
@@ -58,8 +58,14 @@ suite("test_show_dynamic_table_auth","p0,auth_call") {
     }
     sql """grant select_priv on ${dbName}.${tableName} to ${user}"""
     connect(user=user, password="${pwd}", url=context.config.jdbcUrl) {
+        
+        checkNereidsExecute("SHOW DYNAMIC PARTITION TABLES from ${dbName};");
+
         def res = sql """SHOW DYNAMIC PARTITION TABLES from ${dbName};"""
         assertTrue(res.size() == 1)
+
+        sql """ use  ${dbName};"""
+        checkNereidsExecute("SHOW DYNAMIC PARTITION TABLES;");
     }
 
     sql """drop database if exists ${dbName}"""


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

Reply via email to