From 1d8471a72dd272f41eebb3011edf5436e1293942 Mon Sep 17 00:00:00 2001 From: Rijesh Kunhi Parambattu Date: Mon, 25 Nov 2024 21:49:12 +0530 Subject: [PATCH] [Enhancement] (nereids)implement showTableCreationCommand in nereids #42776 --- .../org/apache/doris/nereids/DorisParser.g4 | 3 +- .../nereids/parser/LogicalPlanBuilder.java | 17 ++- .../doris/nereids/trees/plans/PlanType.java | 3 +- .../commands/ShowTableCreationCommand.java | 109 ++++++++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 5 + 5 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTableCreationCommand.java 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 1fb5897066f0216..22cae30efe64741 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 @@ -262,6 +262,8 @@ supportedShowStatement | SHOW WHITELIST #showWhitelist | SHOW TABLETS BELONG tabletIds+=INTEGER_VALUE (COMMA tabletIds+=INTEGER_VALUE)* #showTabletsBelong + | SHOW TABLE CREATION ((FROM | IN) database=multipartIdentifier)? + (LIKE STRING_LITERAL)? #showTableCreation ; supportedLoadStatement @@ -355,7 +357,6 @@ unsupportedShowStatement | SHOW QUERY PROFILE queryIdPath=STRING_LITERAL #showQueryProfile | SHOW CACHE HOTSPOT tablePath=STRING_LITERAL #showCacheHotSpot | SHOW SYNC JOB ((FROM | IN) database=multipartIdentifier)? #showSyncJob - | SHOW TABLE CREATION ((FROM | IN) database=multipartIdentifier)? wildWhere? #showTableCreation | SHOW CATALOG RECYCLE BIN wildWhere? #showCatalogRecycleBin | SHOW QUERY STATS ((FOR database=identifier) | (FROM tableName=multipartIdentifier (ALL VERBOSE?)?))? #showQueryStats 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 9866b410c8fbb01..b289821ebb67d74 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 @@ -266,6 +266,7 @@ import org.apache.doris.nereids.DorisParser.ShowSmallFilesContext; import org.apache.doris.nereids.DorisParser.ShowSqlBlockRuleContext; import org.apache.doris.nereids.DorisParser.ShowStorageEnginesContext; +import org.apache.doris.nereids.DorisParser.ShowTableCreationContext; import org.apache.doris.nereids.DorisParser.ShowTableIdContext; import org.apache.doris.nereids.DorisParser.ShowTabletsBelongContext; import org.apache.doris.nereids.DorisParser.ShowTrashContext; @@ -564,6 +565,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowSmallFilesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowTableCreationCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTabletsBelongCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTrashCommand; @@ -1392,7 +1394,7 @@ public BrokerDesc visitWithRemoteStorageSystem(WithRemoteStorageSystemContext ct @Override public List> visitMultiStatements(MultiStatementsContext ctx) { List> logicalPlans = Lists.newArrayList(); - for (org.apache.doris.nereids.DorisParser.StatementContext statement : ctx.statement()) { + for (DorisParser.StatementContext statement : ctx.statement()) { StatementContext statementContext = new StatementContext(); ConnectContext connectContext = ConnectContext.get(); if (connectContext != null) { @@ -1517,7 +1519,7 @@ public LogicalPlan visitLoad(DorisParser.LoadContext ctx) { * ******************************************************************************************** */ /** - * process lateral view, add a {@link org.apache.doris.nereids.trees.plans.logical.LogicalGenerate} on plan. + * process lateral view, add a {@link LogicalGenerate} on plan. */ protected LogicalPlan withGenerate(LogicalPlan plan, LateralViewContext ctx) { if (ctx.LATERAL() == null) { @@ -4936,4 +4938,15 @@ public LogicalPlan visitShowCollation(ShowCollationContext ctx) { } return new ShowCollationCommand(wild); } + + @Override + public LogicalPlan visitShowTableCreation(ShowTableCreationContext ctx) { + String dbName = null; + if (ctx.database != null) { + List nameParts = visitMultipartIdentifier(ctx.database); + dbName = nameParts.get(0); // only one entry possible + } + + return new ShowTableCreationCommand(dbName, ctx.STRING_LITERAL().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 969b51ee99afe44..962c168db9b69d2 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 @@ -244,5 +244,6 @@ public enum PlanType { REPLAY_COMMAND, CREATE_ENCRYPTKEY_COMMAND, CREATE_FILE_COMMAND, - CREATE_ROUTINE_LOAD_COMMAND + CREATE_ROUTINE_LOAD_COMMAND, + SHOW_TABLE_CREATION_COMMAND } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTableCreationCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTableCreationCommand.java new file mode 100644 index 000000000000000..207f1baf9107183 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowTableCreationCommand.java @@ -0,0 +1,109 @@ +// 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.catalog.Column; +import org.apache.doris.catalog.ScalarType; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.ListComparator; +import org.apache.doris.common.util.OrderByPair; +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 java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * show table id command + */ +public class ShowTableCreationCommand extends ShowCommand { + private static final ShowResultSetMetaData META_DATA = + ShowResultSetMetaData.builder() + .addColumn(new Column("Database", ScalarType.createVarchar(20))) + .addColumn(new Column("Table", ScalarType.createVarchar(20))) + .addColumn(new Column("Status", ScalarType.createVarchar(10))) + .addColumn(new Column("Create Time", ScalarType.createVarchar(20))) + .addColumn(new Column("Error Msg", ScalarType.createVarchar(100))) + .build(); + + private String dbName; + private String wild; + + /** + * constructor + */ + public ShowTableCreationCommand(String dbName, String wild) { + super(PlanType.SHOW_TABLE_CREATION_COMMAND); + this.dbName = dbName; + this.wild = wild; + } + + /** + * get meta for show tableId + */ + public ShowResultSetMetaData getMetaData() { + return META_DATA; + } + + @Override + public ShowResultSet doRun(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (Strings.isNullOrEmpty(dbName)) { + dbName = ConnectContext.get().getDatabase(); + if (Strings.isNullOrEmpty(dbName)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR); + } + } + + /* Need to implement fetching records from iceberg table */ + List> rowSet = Lists.newArrayList(); + // sort function rows by fourth column (Create Time) asc + ListComparator> comparator = null; + OrderByPair orderByPair = new OrderByPair(3, false); + comparator = new ListComparator<>(orderByPair); + Collections.sort(rowSet, comparator); + List> resultRowSet = Lists.newArrayList(); + + Set keyNameSet = new HashSet<>(); + for (List row : rowSet) { + List resultRow = Lists.newArrayList(); + for (Comparable column : row) { + resultRow.add(column.toString()); + } + resultRowSet.add(resultRow); + keyNameSet.add(resultRow.get(0)); + } + + return new ShowResultSet(getMetaData(), resultRowSet); + + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitShowTableCreationCommand(this, context); + } +} 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 0d8c24086a6bb30..21f88507130b645 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 @@ -111,6 +111,7 @@ import org.apache.doris.nereids.trees.plans.commands.ShowSmallFilesCommand; import org.apache.doris.nereids.trees.plans.commands.ShowSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.ShowStorageEnginesCommand; +import org.apache.doris.nereids.trees.plans.commands.ShowTableCreationCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTableIdCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTabletsBelongCommand; import org.apache.doris.nereids.trees.plans.commands.ShowTrashCommand; @@ -585,4 +586,8 @@ default R visitCreateRoutineLoadCommand(CreateRoutineLoadCommand createRoutineLo default R visitShowProcessListCommand(ShowProcessListCommand showProcessListCommand, C context) { return visitCommand(showProcessListCommand, context); } + + default R visitShowTableCreationCommand(ShowTableCreationCommand showTableCreationCommand, C context) { + return visitCommand(showTableCreationCommand, context); + } }