Skip to content

Commit

Permalink
[Enhancement] (nereids)implement showTableCreationCommand in nereids #…
Browse files Browse the repository at this point in the history
…42776  (#44703)

Issue Number: close #42776
  • Loading branch information
rijeshkp authored Dec 9, 2024
1 parent 0a73618 commit 7b5b8db
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,8 @@ supportedShowStatement
| SHOW TABLETS BELONG
tabletIds+=INTEGER_VALUE (COMMA tabletIds+=INTEGER_VALUE)* #showTabletsBelong
| SHOW DATA SKEW FROM baseTableRef #showDataSkew
| SHOW TABLE CREATION ((FROM | IN) database=multipartIdentifier)?
(LIKE STRING_LITERAL)? #showTableCreation
;

supportedLoadStatement
Expand Down Expand Up @@ -359,7 +361,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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,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;
Expand Down Expand Up @@ -574,6 +575,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;
Expand Down Expand Up @@ -1402,7 +1404,7 @@ public BrokerDesc visitWithRemoteStorageSystem(WithRemoteStorageSystemContext ct
@Override
public List<Pair<LogicalPlan, StatementContext>> visitMultiStatements(MultiStatementsContext ctx) {
List<Pair<LogicalPlan, StatementContext>> 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) {
Expand Down Expand Up @@ -1527,7 +1529,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) {
Expand Down Expand Up @@ -4985,5 +4987,19 @@ public LogicalPlan visitShowDataSkew(ShowDataSkewContext ctx) {
TableRefInfo tableRefInfo = visitBaseTableRefContext(ctx.baseTableRef());
return new ShowDataSkewCommand(tableRefInfo);
}

@Override
public LogicalPlan visitShowTableCreation(ShowTableCreationContext ctx) {
String dbName = null;
String wild = null;
if (ctx.database != null) {
List<String> nameParts = visitMultipartIdentifier(ctx.database);
dbName = nameParts.get(0); // only one entry possible
}
if (ctx.STRING_LITERAL() != null) {
wild = ctx.STRING_LITERAL().getText();
}
return new ShowTableCreationCommand(dbName, wild);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -249,5 +249,6 @@ public enum PlanType {
CREATE_ENCRYPTKEY_COMMAND,
CREATE_WORKLOAD_GROUP_COMMAND,
CREATE_FILE_COMMAND,
CREATE_ROUTINE_LOAD_COMMAND
CREATE_ROUTINE_LOAD_COMMAND,
SHOW_TABLE_CREATION_COMMAND
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// 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;
}

@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<List<Comparable>> rowSet = Lists.newArrayList();
// sort function rows by fourth column (Create Time) asc
ListComparator<List<Comparable>> comparator = null;
OrderByPair orderByPair = new OrderByPair(3, false);
comparator = new ListComparator<>(orderByPair);
Collections.sort(rowSet, comparator);
List<List<String>> resultRowSet = Lists.newArrayList();

Set<String> keyNameSet = new HashSet<>();
for (List<Comparable> row : rowSet) {
List<String> resultRow = Lists.newArrayList();
for (Comparable column : row) {
resultRow.add(column.toString());
}
resultRowSet.add(resultRow);
keyNameSet.add(resultRow.get(0));
}

return new ShowResultSet(META_DATA, resultRowSet);
}

@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
return visitor.visitShowTableCreationCommand(this, context);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,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;
Expand Down Expand Up @@ -610,4 +611,8 @@ default R visitAdminCheckTabletsCommand(AdminCheckTabletsCommand adminCheckTable
default R visitShowDataSkewCommand(ShowDataSkewCommand showDataSkewCommand, C context) {
return visitCommand(showDataSkewCommand, context);
}

default R visitShowTableCreationCommand(ShowTableCreationCommand showTableCreationCommand, C context) {
return visitCommand(showTableCreationCommand, context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package show
// 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.


suite("test_nereids_show_table_creation") {
def table = "test_nereids_show_table_creation"
// create table and insert data
String dbName = 'test_nereids_show_table_creation'
try_sql """drop database if exists ${dbName}"""
sql """create database ${dbName}"""
sql """ drop table if exists ${dbName}.${table} force"""

sql """
create table ${dbName}.${table} (
`id` int(11),
`name` varchar(128),
`da` date
)
engine=olap
duplicate key(id)
partition by range(da)(
PARTITION p3 VALUES LESS THAN ('2023-01-01'),
PARTITION p4 VALUES LESS THAN ('2024-01-01'),
PARTITION p5 VALUES LESS THAN ('2025-01-01')
)
distributed by hash(id) buckets 2
properties(
"replication_num"="1",
"light_schema_change"="true"
);
"""

checkNereidsExecute("SHOW TABLE CREATION FROM ${dbName}")
checkNereidsExecute("SHOW TABLE CREATION IN ${dbName}")
checkNereidsExecute("SHOW TABLE CREATION FROM ${dbName} like '%${table}%'")
checkNereidsExecute("SHOW TABLE CREATION like '%${table}%'")
checkNereidsExecute("SHOW TABLE CREATION")

def res = sql """SHOW TABLE CREATION FROM ${dbName}"""
assertTrue(res.size() == 0)

res = sql """SHOW TABLE CREATION IN ${dbName}"""
assertTrue(res.size() == 0)

res = sql """SHOW TABLE CREATION FROM ${dbName} like '%${table}%'"""
assertTrue(res.size() == 0)

res = sql """SHOW TABLE CREATION like '%${table}%'"""
assertTrue(res.size() == 0)

res = sql """SHOW TABLE CREATION"""
assertTrue(res.size() == 0)

}

0 comments on commit 7b5b8db

Please sign in to comment.