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]