morningman commented on code in PR #40153: URL: https://github.com/apache/doris/pull/40153#discussion_r1739585193
########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); + trow.addToColumnValue(new TCell().setIntVal(0)); //TABLE_ROWS (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //AVG_ROW_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //MAX_DATA_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //INDEX_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_FREE (not available) + trow.addToColumnValue(new TCell().setStringVal( + TimeUtils.longToTimeString(partition.getVisibleVersionTime()))); //CREATE_TIME + trow.addToColumnValue(new TCell().setStringVal("")); // UPDATE_TIME (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // CHECK_TIME (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //CHECKSUM (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // PARTITION_COMMENT (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // NODEGROUP (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // TABLESPACE_NAME (not available) + dataBatch.add(trow); + } + } // for table + } + + private static void partitionsForExternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + // TODO + } // for table + } + + private static TFetchSchemaTableDataResult partitionsMetadataResult(TSchemaTableRequestParams params) { + if (!params.isSetCurrentUserIdent()) { + return errorResult("current user ident is not set."); + } + + if (!params.isSetDbId()) { + return errorResult("current db id is not set."); + } + + if (!params.isSetCatalog()) { + return errorResult("current catalog is not set."); + } + + TUserIdentity tcurrentUserIdentity = params.getCurrentUserIdent(); + UserIdentity currentUserIdentity = UserIdentity.fromThrift(tcurrentUserIdentity); + TFetchSchemaTableDataResult result = new TFetchSchemaTableDataResult(); + Long dbId = params.getDbId(); + String clg = params.getCatalog(); + CatalogIf catalog = Env.getCurrentEnv().getCatalogMgr().getCatalog(clg); Review Comment: `catalog` may be null ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) Review Comment: ```suggestion trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION ``` ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; Review Comment: PARTITION_EXPRESSION: For non partition table, this field should be NULL. And for partition table, I think we should ``col1``, not `[`col1`]` you can refer to https://dev.mysql.com/doc/refman/8.4/en/information-schema-partitions-table.html ########## be/src/exec/schema_scanner/schema_partitions_scanner.cpp: ########## @@ -22,10 +22,14 @@ #include <stdint.h> #include "exec/schema_scanner/schema_helper.h" -#include "runtime/decimalv2_value.h" -#include "runtime/define_primitive_type.h" -#include "util/runtime_profile.h" +#include "runtime/client_cache.h" +#include "runtime/exec_env.h" +#include "runtime/runtime_state.h" +#include "schema_scanner_helper.h" Review Comment: ```suggestion #include "exec/schema_scanner/schema_scanner_helper.h" ``` and notice the include order ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); Review Comment: For partition range, how about refer to mysql?  ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); + trow.addToColumnValue(new TCell().setIntVal(0)); //TABLE_ROWS (not available) Review Comment: table rows is available ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); + trow.addToColumnValue(new TCell().setIntVal(0)); //TABLE_ROWS (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //AVG_ROW_LENGTH (not available) Review Comment: these row length are available. You can see `FrontendServiceImpl#listTableStatus()` But those are for table level, we need to add partition level methods ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); + trow.addToColumnValue(new TCell().setIntVal(0)); //TABLE_ROWS (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //AVG_ROW_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //MAX_DATA_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //INDEX_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_FREE (not available) + trow.addToColumnValue(new TCell().setStringVal( + TimeUtils.longToTimeString(partition.getVisibleVersionTime()))); //CREATE_TIME Review Comment: Actually, the `visible version time` is update time. We don't have `create time` ########## fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java: ########## @@ -1250,4 +1266,110 @@ private static TFetchSchemaTableDataResult tablePropertiesMetadataResult(TSchema result.setStatus(new TStatus(TStatusCode.OK)); return result; } + + private static void partitionsForInternalCatalog(UserIdentity currentUserIdentity, + CatalogIf catalog, DatabaseIf database, List<TableIf> tables, List<TRow> dataBatch) { + for (TableIf table : tables) { + if (!(table instanceof OlapTable)) { + continue; + } + if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUserIdentity, catalog.getName(), + database.getFullName(), table.getName(), PrivPredicate.SHOW)) { + continue; + } + + OlapTable olapTable = (OlapTable) table; + Collection<Partition> allPartitions = olapTable.getAllPartitions(); + + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_NAME (not available) + + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_METHOD + ArrayList<Expr> expr = olapTable.getPartitionInfo().getPartitionExprs(); + String partExpr = (expr != null) ? olapTable.getPartitionInfo().getPartitionExprs().toString() : ""; + + trow.addToColumnValue(new TCell().setStringVal(partExpr)); // PARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // SUBPARTITION_EXPRESSION (not available) + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo().getPartitionRangeString(partition.getId()))); Review Comment:  -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org