This is an automated email from the ASF dual-hosted git repository. morningman 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 620faf4959 [feature-wip](multi-catalog) add auth&catalog check (#10480) 620faf4959 is described below commit 620faf4959b8d6195bfd3ccec86363d7aca849c1 Author: Ashin Gau <ashin...@users.noreply.github.com> AuthorDate: Thu Jun 30 12:04:23 2022 +0800 [feature-wip](multi-catalog) add auth&catalog check (#10480) This pr follows up [#10435](https://github.com/apache/doris/pull/10435). [#10435](https://github.com/apache/doris/pull/10435) had supported catalog in sql syntax, but some doris statements are only valid in internal catalog. In order to remind users of the scope of catalog usage, it is necessary to throw errors to exceptions of using catalog in the analyze phase. ## How does it effect origin behavior It is fully compatible with the previous sql statements. Meanwhile, if using the internal catalog in the statements that all the usage of the internal catalog, the syntax is still valid, but using the external catalog will directly throw errors. For example: ``` MySQL [(none)]> show data from tpch10.lineitem; +-----------+-----------+------------+--------------+----------+ | TableName | IndexName | Size | ReplicaCount | RowCount | +-----------+-----------+------------+--------------+----------+ | lineitem | lineitem | 210.809 MB | 32 | 6001215 | | | Total | 210.809 MB | 32 | | +-----------+-----------+------------+--------------+----------+ MySQL [(none)]> show data from internal_catalog.tpch10.lineitem; +-----------+-----------+------------+--------------+----------+ | TableName | IndexName | Size | ReplicaCount | RowCount | +-----------+-----------+------------+--------------+----------+ | lineitem | lineitem | 210.809 MB | 32 | 6001215 | | | Total | 210.809 MB | 32 | | +-----------+-----------+------------+--------------+----------+ MySQL [(none)]> show data from hive.tpch10.lineitem; ERROR 1105 (HY000): errCode = 2, detailMessage = External catalog 'hive' is not allowed in 'ShowDataStmt' ``` --- fe/fe-core/src/main/cup/sql_parser.cup | 4 +- .../doris/analysis/AlterColumnStatsStmt.java | 3 ++ .../apache/doris/analysis/AlterTableStatsStmt.java | 3 ++ .../org/apache/doris/analysis/AlterTableStmt.java | 3 ++ .../org/apache/doris/analysis/AlterViewStmt.java | 3 ++ .../org/apache/doris/analysis/AnalyzeStmt.java | 2 + .../doris/analysis/CancelAlterTableStmt.java | 3 ++ .../apache/doris/analysis/CreateTableLikeStmt.java | 5 +++ .../org/apache/doris/analysis/CreateTableStmt.java | 3 ++ .../org/apache/doris/analysis/CreateViewStmt.java | 3 ++ .../java/org/apache/doris/analysis/DeleteStmt.java | 3 ++ .../org/apache/doris/analysis/DescribeStmt.java | 6 +-- .../doris/analysis/DropMaterializedViewStmt.java | 3 ++ .../org/apache/doris/analysis/DropTableStmt.java | 3 ++ .../java/org/apache/doris/analysis/ExportStmt.java | 3 ++ .../java/org/apache/doris/analysis/InsertStmt.java | 5 +++ .../org/apache/doris/analysis/LockTablesStmt.java | 28 ++++---------- .../doris/analysis/RecoverPartitionStmt.java | 3 ++ .../apache/doris/analysis/RecoverTableStmt.java | 3 ++ .../apache/doris/analysis/RefreshTableStmt.java | 3 ++ .../java/org/apache/doris/analysis/SelectStmt.java | 9 +---- .../apache/doris/analysis/ShowColumnStatsStmt.java | 3 ++ .../org/apache/doris/analysis/ShowColumnStmt.java | 3 ++ .../analysis/ShowCreateMaterializedViewStmt.java | 3 ++ .../apache/doris/analysis/ShowCreateTableStmt.java | 3 ++ .../apache/doris/analysis/ShowDataSkewStmt.java | 3 ++ .../org/apache/doris/analysis/ShowDataStmt.java | 43 +++++++++------------- .../org/apache/doris/analysis/ShowIndexStmt.java | 3 ++ .../apache/doris/analysis/ShowPartitionsStmt.java | 35 ++++++++---------- .../org/apache/doris/analysis/ShowRollupStmt.java | 3 ++ .../apache/doris/analysis/ShowTableStatsStmt.java | 3 ++ .../org/apache/doris/analysis/ShowTabletStmt.java | 8 ++++ .../org/apache/doris/analysis/ShowViewStmt.java | 3 ++ .../apache/doris/analysis/TruncateTableStmt.java | 3 ++ .../java/org/apache/doris/analysis/UpdateStmt.java | 3 ++ .../java/org/apache/doris/common/util/Util.java | 6 +++ .../java/org/apache/doris/qe/ShowExecutor.java | 6 ++- .../org/apache/doris/analysis/AccessTestUtil.java | 4 ++ .../apache/doris/analysis/ShowDataStmtTest.java | 6 +-- .../java/org/apache/doris/qe/ShowExecutorTest.java | 1 + 40 files changed, 160 insertions(+), 83 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 35cf35cf65..748b898b6c 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -2830,11 +2830,11 @@ show_param ::= /* Show data statement: used to show data size of specified range */ | KW_DATA order_by_clause:orderByClause {: - RESULT = new ShowDataStmt(null, null, orderByClause); + RESULT = new ShowDataStmt(null, orderByClause); :} | KW_DATA KW_FROM table_name:dbTblName order_by_clause:orderByClause {: - RESULT = new ShowDataStmt(dbTblName.getDb(), dbTblName.getTbl(), orderByClause); + RESULT = new ShowDataStmt(dbTblName, orderByClause); :} | opt_tmp:tmp KW_PARTITIONS KW_FROM table_name:tblName opt_wild_where order_by_clause:orderByClause limit_clause: limitClause {: diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java index 8a21d18fcd..c90d816efb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.statistics.ColumnStats; @@ -60,6 +61,8 @@ public class AlterColumnStatsStmt extends DdlStmt { super.analyze(analyzer); // check table name tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check properties Optional<StatsType> optional = properties.keySet().stream().map(StatsType::fromString) .filter(statsType -> !CONFIGURABLE_PROPERTIES_SET.contains(statsType)).findFirst(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStatsStmt.java index b25f7c2897..be27a9b1e4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStatsStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.statistics.StatsType; @@ -54,6 +55,8 @@ public class AlterTableStatsStmt extends DdlStmt { super.analyze(analyzer); // check table name tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check properties Optional<StatsType> optional = properties.keySet().stream().map(StatsType::fromString) .filter(statsType -> !CONFIGURABLE_PROPERTIES_SET.contains(statsType)).findFirst(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java index 1734dcc0c7..daeb5027eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java @@ -28,6 +28,7 @@ import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; import org.apache.doris.common.util.PropertyAnalyzer; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -64,6 +65,8 @@ public class AlterTableStmt extends DdlStmt { ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_TABLES_USED); } tbl.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tbl.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tbl.getDb(), tbl.getTbl(), PrivPredicate.ALTER)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "ALTER TABLE", diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java index fa12128dc6..6ee0a6ba89 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java @@ -25,6 +25,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -48,6 +49,8 @@ public class AlterViewStmt extends BaseViewStmt { ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_TABLES_USED); } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(tableName.getDb()); TableIf table = db.getTableOrAnalysisException(tableName.getTbl()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java index 00a5cf7479..6e7f56ccf3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java @@ -160,6 +160,8 @@ public class AnalyzeStmt extends DdlStmt { // step1: analyze db, table and column if (this.dbTableName != null) { this.dbTableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(dbTableName.getCtl(), this.getClass().getSimpleName()); String dbName = this.dbTableName.getDb(); String tblName = this.dbTableName.getTbl(); checkAnalyzePriv(dbName, tblName); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelAlterTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelAlterTableStmt.java index 8f88a8580a..593e275bda 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelAlterTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CancelAlterTableStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.catalog.Catalog; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -70,6 +71,8 @@ public class CancelAlterTableStmt extends CancelStmt { @Override public void analyze(Analyzer analyzer) throws AnalysisException { dbTableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(dbTableName.getCtl(), this.getClass().getSimpleName()); // check access if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbTableName.getDb(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableLikeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableLikeStmt.java index 1b1bf6dac6..36f4939a79 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableLikeStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableLikeStmt.java @@ -23,6 +23,7 @@ import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.FeNameFormat; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -91,6 +92,8 @@ public class CreateTableLikeStmt extends DdlStmt { public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); existedTableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(existedTableName.getCtl(), this.getClass().getSimpleName()); ConnectContext ctx = ConnectContext.get(); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ctx, existedTableName.getDb(), existedTableName.getTbl(), PrivPredicate.SELECT)) { @@ -98,6 +101,8 @@ public class CreateTableLikeStmt extends DdlStmt { } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); FeNameFormat.checkTableName(getTableName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ctx, tableName.getDb(), tableName.getTbl(), PrivPredicate.CREATE)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java index b85aa21b33..a70e3925e0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableStmt.java @@ -32,6 +32,7 @@ import org.apache.doris.common.FeConstants; import org.apache.doris.common.FeNameFormat; import org.apache.doris.common.UserException; import org.apache.doris.common.util.PrintableMap; +import org.apache.doris.common.util.Util; import org.apache.doris.external.elasticsearch.EsUtil; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -261,6 +262,8 @@ public class CreateTableStmt extends DdlStmt { super.analyze(analyzer); tableName.analyze(analyzer); FeNameFormat.checkTableName(tableName.getTbl()); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(), tableName.getTbl(), PrivPredicate.CREATE)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java index d10fb1c713..7730a7b739 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateViewStmt.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Catalog; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -55,6 +56,8 @@ public class CreateViewStmt extends BaseViewStmt { public void analyze(Analyzer analyzer) throws UserException { tableName.analyze(analyzer); viewDefStmt.setNeedToSql(true); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check privilege if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DeleteStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DeleteStmt.java index 465813177b..1d9f8153cd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DeleteStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DeleteStmt.java @@ -24,6 +24,7 @@ import org.apache.doris.common.Config; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -72,6 +73,8 @@ public class DeleteStmt extends DdlStmt { } tbl.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tbl.getCtl(), this.getClass().getSimpleName()); if (partitionNames != null) { partitionNames.analyze(analyzer); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java index b9908b44cb..911fa5fb3b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java @@ -100,12 +100,12 @@ public class DescribeStmt extends ShowStmt { public void analyze(Analyzer analyzer) throws AnalysisException, UserException { dbTableName.analyze(analyzer); - if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbTableName.getDb(), - dbTableName.getTbl(), PrivPredicate.SHOW)) { + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( + ConnectContext.get(), dbTableName, PrivPredicate.SHOW)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "DESCRIBE", ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(), - dbTableName.getDb() + ": " + dbTableName.getTbl()); + dbTableName.toString()); } Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbTableName.getDb()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java index 156e6efd1f..4d15e73148 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropMaterializedViewStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -66,6 +67,8 @@ public class DropMaterializedViewStmt extends DdlStmt { throw new AnalysisException("The materialized name could not be empty or null."); } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check access if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropTableStmt.java index 8866db33a0..ce31bbfe5d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropTableStmt.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Catalog; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -73,6 +74,8 @@ public class DropTableStmt extends DdlStmt { tableName.setDb(analyzer.getDefaultDb()); } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check access if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java index a045512155..5570028f4b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java @@ -32,6 +32,7 @@ import org.apache.doris.common.UserException; import org.apache.doris.common.util.PrintableMap; import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.common.util.URI; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -143,6 +144,8 @@ public class ExportStmt extends StatementBase { tableRef.analyze(analyzer); this.tblName = tableRef.getName(); + // disallow external catalog + Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); PartitionNames partitionNames = tableRef.getPartitionNames(); if (partitionNames != null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java index f3b29b6398..7001306905 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java @@ -37,6 +37,7 @@ import org.apache.doris.common.ErrorReport; import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DebugUtil; +import org.apache.doris.common.util.Util; import org.apache.doris.metric.MetricRepo; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.planner.DataPartition; @@ -195,6 +196,8 @@ public class InsertStmt extends DdlStmt { // get dbs of statement queryStmt.getTables(analyzer, tableMap, parentViewNameSet); tblName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); String dbName = tblName.getDb(); String tableName = tblName.getTbl(); // check exist @@ -267,6 +270,8 @@ public class InsertStmt extends DdlStmt { if (targetTable == null) { tblName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); } // Check privilege diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java index 1123af3839..b941af2c04 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java @@ -19,14 +19,12 @@ package org.apache.doris.analysis; import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.Database; -import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; -import com.google.common.base.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -46,30 +44,18 @@ public class LockTablesStmt extends StatementBase { public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); for (LockTable lockTable : lockTables) { - String dbName = lockTable.getTableName().getDb(); - String tableName = lockTable.getTableName().getTbl(); - if (Strings.isNullOrEmpty(dbName)) { - dbName = analyzer.getDefaultDb(); - } else { - dbName = ClusterNamespace.getFullName(analyzer.getClusterName(), dbName); - } - if (Strings.isNullOrEmpty(dbName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR); - } - if (Strings.isNullOrEmpty(tableName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_UNKNOWN_TABLE, tableName, dbName); - } - Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName); - db.getTableOrAnalysisException(tableName); + TableName tableName = lockTable.getTableName(); + tableName.analyze(analyzer); + Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(tableName.getDb()); + db.getTableOrAnalysisException(tableName.getTbl()); // check auth - if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, - tableName, - PrivPredicate.SELECT)) { + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( + ConnectContext.get(), tableName, PrivPredicate.SELECT)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SELECT", ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(), - dbName + ": " + tableName); + tableName.toString()); } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverPartitionStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverPartitionStmt.java index 312cd8129c..9db0faa828 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverPartitionStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverPartitionStmt.java @@ -23,6 +23,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PaloPrivilege; import org.apache.doris.mysql.privilege.PrivBitSet; import org.apache.doris.mysql.privilege.PrivPredicate; @@ -54,6 +55,8 @@ public class RecoverPartitionStmt extends DdlStmt { @Override public void analyze(Analyzer analyzer) throws AnalysisException, UserException { dbTblName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(dbTblName.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbTblName.getDb(), dbTblName.getTbl(), PrivPredicate.of(PrivBitSet.of( PaloPrivilege.ALTER_PRIV, PaloPrivilege.CREATE_PRIV, PaloPrivilege.ADMIN_PRIV), Operator.OR))) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverTableStmt.java index dbe24f9e19..da00e50b4d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/RecoverTableStmt.java @@ -23,6 +23,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PaloPrivilege; import org.apache.doris.mysql.privilege.PrivBitSet; import org.apache.doris.mysql.privilege.PrivPredicate; @@ -48,6 +49,8 @@ public class RecoverTableStmt extends DdlStmt { @Override public void analyze(Analyzer analyzer) throws AnalysisException, UserException { dbTblName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(dbTblName.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( ConnectContext.get(), dbTblName.getDb(), dbTblName.getTbl(), PrivPredicate.of( diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshTableStmt.java index a6ff777240..cc7b59624c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/RefreshTableStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -53,6 +54,8 @@ public class RefreshTableStmt extends DdlStmt { public void analyze(Analyzer analyzer) throws AnalysisException, UserException { super.analyze(analyzer); tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // check access if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index a1f9fd9797..2c7da58901 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -314,18 +314,13 @@ public class SelectStmt extends QueryStmt { if (isViewTableRef(tblRef.getName().toString(), parentViewNameSet)) { continue; } - if (Strings.isNullOrEmpty(dbName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR); - } - if (Strings.isNullOrEmpty(tableName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_UNKNOWN_TABLE, tableName, dbName); - } + tblRef.getName().analyze(analyzer); DatabaseIf db = analyzer.getCatalog().getCurrentDataSource().getDbOrAnalysisException(dbName); TableIf table = db.getTableOrAnalysisException(tableName); // check auth if (!Catalog.getCurrentCatalog().getAuth() - .checkTblPriv(ConnectContext.get(), dbName, tableName, PrivPredicate.SELECT)) { + .checkTblPriv(ConnectContext.get(), tblRef.getName(), PrivPredicate.SELECT)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SELECT", ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(), dbName + ": " + tableName); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java index 784e719188..49661f0030 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Column; import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.qe.ShowResultSetMetaData; import org.apache.doris.statistics.ColumnStats; @@ -53,6 +54,8 @@ public class ShowColumnStatsStmt extends ShowStmt { public void analyze(Analyzer analyzer) throws AnalysisException, UserException { super.analyze(analyzer); tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java index 80d90c1d29..e29b51cfa6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStmt.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Column; import org.apache.doris.catalog.InfoSchemaDb; import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.util.Util; import org.apache.doris.qe.ShowResultSetMetaData; import com.google.common.base.Strings; @@ -97,6 +98,8 @@ public class ShowColumnStmt extends ShowStmt { tableName.setDb(db); } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); if (isVerbose) { metaData = META_DATA_VERBOSE; } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java index a18ffd8ed8..edcf96d827 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateMaterializedViewStmt.java @@ -23,6 +23,7 @@ import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -52,6 +53,8 @@ public class ShowCreateMaterializedViewStmt extends ShowStmt { public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth() .checkTblPriv(ConnectContext.get(), tableName.getDb(), tableName.getTbl(), PrivPredicate.SHOW)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SHOW CREATE MATERIALIZED", diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateTableStmt.java index ff2f231b19..2b6065dc4f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowCreateTableStmt.java @@ -23,6 +23,7 @@ import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -77,6 +78,8 @@ public class ShowCreateTableStmt extends ShowStmt { ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_TABLES_USED); } tbl.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tbl.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tbl.getDb(), tbl.getTbl(), PrivPredicate.SHOW)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java index 01e12f50ce..21d7a5c2a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java @@ -24,6 +24,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -47,6 +48,8 @@ public class ShowDataSkewStmt extends ShowStmt { public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); tblRef.getName().analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tblRef.getName().getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tblRef.getName().getDb(), tblRef.getName().getTbl(), PrivPredicate.SHOW)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java index dd6a2f02d0..368a317806 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java @@ -26,7 +26,6 @@ import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf.TableType; -import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; @@ -34,11 +33,11 @@ import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DebugUtil; import org.apache.doris.common.util.OrderByPair; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; -import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -77,17 +76,15 @@ public class ShowDataStmt extends ShowStmt { new ImmutableList.Builder<String>().add("TableName").add("IndexName").add("Size").add("ReplicaCount") .add("RowCount").build(); - private String dbName; - private String tableName; - + TableName tableName; + String dbName; List<List<String>> totalRows; List<List<Object>> totalRowsObject = Lists.newArrayList(); private List<OrderByElement> orderByElements; private List<OrderByPair> orderByPairs; - public ShowDataStmt(String dbName, String tableName, List<OrderByElement> orderByElements) { - this.dbName = dbName; + public ShowDataStmt(TableName tableName, List<OrderByElement> orderByElements) { this.tableName = tableName; this.totalRows = Lists.newArrayList(); this.orderByElements = orderByElements; @@ -96,13 +93,12 @@ public class ShowDataStmt extends ShowStmt { @Override public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); - if (Strings.isNullOrEmpty(dbName)) { - dbName = analyzer.getDefaultDb(); - if (Strings.isNullOrEmpty(dbName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR); - } - } else { - dbName = ClusterNamespace.getFullName(getClusterName(), dbName); + dbName = analyzer.getDefaultDb(); + if (tableName != null) { + tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); + dbName = tableName.getDb(); } Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName); @@ -115,7 +111,7 @@ public class ShowDataStmt extends ShowStmt { throw new AnalysisException("Should order by column"); } SlotRef slotRef = (SlotRef) orderByElement.getExpr(); - int index = analyzeColumn(slotRef.getColumnName(), tableName); + int index = analyzeColumn(slotRef.getColumnName(), tableName == null ? null : tableName.getTbl()); OrderByPair orderByPair = new OrderByPair(index, !orderByElement.getIsAsc()); orderByPairs.add(orderByPair); } @@ -218,8 +214,7 @@ public class ShowDataStmt extends ShowStmt { db.readUnlock(); } } else { - if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, - tableName, + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName, PrivPredicate.SHOW)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SHOW DATA", ConnectContext.get().getQualifiedUser(), @@ -227,7 +222,7 @@ public class ShowDataStmt extends ShowStmt { dbName + ": " + tableName); } - OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableName, TableType.OLAP); + OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableName.getTbl(), TableType.OLAP); long totalSize = 0; long totalReplicaCount = 0; @@ -280,7 +275,7 @@ public class ShowDataStmt extends ShowStmt { String readableSize = DebugUtil.DECIMAL_FORMAT_SCALE_3.format(tableSizePair.first) + " " + tableSizePair.second; if (index == 0) { - result = Arrays.asList(tableName, String.valueOf(row.get(1)), + result = Arrays.asList(tableName.getTbl(), String.valueOf(row.get(1)), readableSize, String.valueOf(row.get(3)), String.valueOf(row.get(4))); } else { @@ -356,13 +351,11 @@ public class ShowDataStmt extends ShowStmt { public String toSql() { StringBuilder builder = new StringBuilder(); builder.append("SHOW DATA"); - if (dbName == null) { - return builder.toString(); - } - - builder.append(" FROM `").append(dbName).append("`"); + builder.append(" FROM "); if (tableName != null) { - builder.append(".`").append(tableName).append("`"); + builder.append(tableName.toSql()); + } else { + builder.append("`").append(dbName).append("`"); } // Order By clause diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowIndexStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowIndexStmt.java index 82616d3262..45046f67cc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowIndexStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowIndexStmt.java @@ -24,6 +24,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -68,6 +69,8 @@ public class ShowIndexStmt extends ShowStmt { tableName.setDb(dbName); } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( ConnectContext.get(), tableName.getDb(), tableName.getTbl(), PrivPredicate.SHOW)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java index 07a418a58e..368619fcc6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java @@ -23,7 +23,6 @@ import org.apache.doris.catalog.Database; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Type; -import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; @@ -33,6 +32,7 @@ import org.apache.doris.common.proc.ProcNodeInterface; import org.apache.doris.common.proc.ProcResult; import org.apache.doris.common.proc.ProcService; import org.apache.doris.common.util.OrderByPair; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -56,8 +56,7 @@ public class ShowPartitionsStmt extends ShowStmt { private static final String FILTER_REPLICATION_NUM = "ReplicationNum"; private static final String FILTER_LAST_CONSISTENCY_CHECK_TIME = "LastConsistencyCheckTime"; - private String dbName; - private String tableName; + private TableName tableName; private Expr whereClause; private List<OrderByElement> orderByElements; private LimitElement limitElement; @@ -70,8 +69,7 @@ public class ShowPartitionsStmt extends ShowStmt { public ShowPartitionsStmt(TableName tableName, Expr whereClause, List<OrderByElement> orderByElements, LimitElement limitElement, boolean isTempPartition) { - this.dbName = tableName.getDb(); - this.tableName = tableName.getTbl(); + this.tableName = tableName; this.whereClause = whereClause; this.orderByElements = orderByElements; this.limitElement = limitElement; @@ -101,15 +99,17 @@ public class ShowPartitionsStmt extends ShowStmt { public void analyze(Analyzer analyzer) throws UserException { analyzeImpl(analyzer); // check access - if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, tableName, + String dbName = tableName.getDb(); + String tblName = tableName.getTbl(); + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, tblName, PrivPredicate.SHOW)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SHOW PARTITIONS", ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(), - dbName + ": " + tableName); + dbName + ": " + tblName); } Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName); - Table table = db.getTableOrMetaException(tableName, Table.TableType.OLAP); + Table table = db.getTableOrMetaException(tblName, Table.TableType.OLAP); table.readLock(); try { // build proc path @@ -135,14 +135,9 @@ public class ShowPartitionsStmt extends ShowStmt { public void analyzeImpl(Analyzer analyzer) throws UserException { super.analyze(analyzer); - if (Strings.isNullOrEmpty(dbName)) { - dbName = analyzer.getDefaultDb(); - if (Strings.isNullOrEmpty(dbName)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR); - } - } else { - dbName = ClusterNamespace.getFullName(getClusterName(), dbName); - } + tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // analyze where clause if not null if (whereClause != null) { @@ -245,11 +240,11 @@ public class ShowPartitionsStmt extends ShowStmt { sb.append("TEMPORARY "); } sb.append("PARTITIONS FROM "); - if (!Strings.isNullOrEmpty(dbName)) { - sb.append("`").append(dbName).append("`"); + if (!Strings.isNullOrEmpty(tableName.getDb())) { + sb.append("`").append(tableName.getDb()).append("`"); } - if (!Strings.isNullOrEmpty(tableName)) { - sb.append(".`").append(tableName).append("`"); + if (!Strings.isNullOrEmpty(tableName.getTbl())) { + sb.append(".`").append(tableName.getTbl()).append("`"); } if (whereClause != null) { sb.append(" WHERE ").append(whereClause.toSql()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRollupStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRollupStmt.java index c4c6b0a7cb..2684f3bcea 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRollupStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRollupStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.Util; import org.apache.doris.qe.ShowResultSetMetaData; import com.google.common.base.Strings; @@ -67,6 +68,8 @@ public class ShowRollupStmt extends ShowStmt { tbl.setDb(db); } tbl.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tbl.getCtl(), this.getClass().getSimpleName()); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java index ce39ac0016..ccc9547208 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.qe.ShowResultSetMetaData; import org.apache.doris.statistics.TableStats; @@ -75,6 +76,8 @@ public class ShowTableStatsStmt extends ShowStmt { return; } tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTabletStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTabletStmt.java index 927c075ee6..576d848ad2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTabletStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTabletStmt.java @@ -28,6 +28,7 @@ import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; import org.apache.doris.common.proc.TabletsProcDir; import org.apache.doris.common.util.OrderByPair; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -38,6 +39,7 @@ import java.util.ArrayList; import java.util.List; public class ShowTabletStmt extends ShowStmt { + private TableName dbTableName; private String dbName; private String tableName; private long tabletId; @@ -60,6 +62,7 @@ public class ShowTabletStmt extends ShowStmt { public ShowTabletStmt(TableName dbTableName, long tabletId, PartitionNames partitionNames, Expr whereClause, List<OrderByElement> orderByElements, LimitElement limitElement) { + this.dbTableName = dbTableName; if (dbTableName == null) { this.dbName = null; this.tableName = null; @@ -152,6 +155,11 @@ public class ShowTabletStmt extends ShowStmt { } super.analyze(analyzer); + if (dbTableName != null) { + dbTableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(dbTableName.getCtl(), this.getClass().getSimpleName()); + } if (!isShowSingleTablet && Strings.isNullOrEmpty(dbName)) { dbName = analyzer.getDefaultDb(); if (Strings.isNullOrEmpty(dbName)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java index 14c677c90a..a689b0d9ef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java @@ -27,6 +27,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSetMetaData; @@ -87,6 +88,8 @@ public class ShowViewStmt extends ShowStmt { tbl.setDb(db); } tbl.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tbl.getCtl(), this.getClass().getSimpleName()); String dbName = tbl.getDb(); if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TruncateTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TruncateTableStmt.java index 2f25d091ab..df3c15e823 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TruncateTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TruncateTableStmt.java @@ -22,6 +22,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; @@ -42,6 +43,8 @@ public class TruncateTableStmt extends DdlStmt { public void analyze(Analyzer analyzer) throws AnalysisException, UserException { super.analyze(analyzer); tblRef.getName().analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tblRef.getName().getCtl(), this.getClass().getSimpleName()); if (tblRef.hasExplicitAlias()) { throw new AnalysisException("Not support truncate table with alias"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java index e86a76b215..ad6e1b498e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java @@ -26,6 +26,7 @@ import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.Util; import org.apache.doris.rewrite.ExprRewriter; import com.google.common.base.Preconditions; @@ -98,6 +99,8 @@ public class UpdateStmt extends DdlStmt { private void analyzeTargetTable(Analyzer analyzer) throws AnalysisException { // step1: analyze table name tableName.analyze(analyzer); + // disallow external catalog + Util.prohibitExternalCatalog(tableName.getCtl(), this.getClass().getSimpleName()); // step2: resolve table name with catalog, only unique olap table could be update String dbName = tableName.getDb(); String targetTableName = tableName.getTbl(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java index 628d7231bf..2d433e3642 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/Util.java @@ -487,4 +487,10 @@ public class Util { FeNameFormat.checkCommonName("catalog", catalog); } } + + public static void prohibitExternalCatalog(String catalog, String msg) throws AnalysisException { + if (!Strings.isNullOrEmpty(catalog) && !catalog.equals(InternalDataSource.INTERNAL_DS_NAME)) { + throw new AnalysisException(String.format("External catalog '%s' is not allowed in '%s'", catalog, msg)); + } + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index 1ed634f087..ac1a79d608 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -680,6 +680,8 @@ public class ShowExecutor { private void handleShowTable() throws AnalysisException { ShowTableStmt showTableStmt = (ShowTableStmt) stmt; List<List<String>> rows = Lists.newArrayList(); + // TODO(gaoxin): Whether to support "show tables from `ctl.db`" syntax in show statement? + String catalogName = ctx.getDefaultCatalog(); DatabaseIf<TableIf> db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showTableStmt.getDb()); PatternMatcher matcher = null; @@ -692,8 +694,8 @@ public class ShowExecutor { continue; } // check tbl privs - if (!Catalog.getCurrentCatalog().getAuth() - .checkTblPriv(ConnectContext.get(), db.getFullName(), tbl.getName(), PrivPredicate.SHOW)) { + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv( + ConnectContext.get(), catalogName, db.getFullName(), tbl.getName(), PrivPredicate.SHOW)) { continue; } if (showTableStmt.isVerbose()) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java index 69c18a5c06..879d771299 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java @@ -74,6 +74,10 @@ public class AccessTestUtil { minTimes = 0; result = true; + auth.checkTblPriv((ConnectContext) any, anyString, anyString, anyString, (PrivPredicate) any); + minTimes = 0; + result = true; + auth.setPassword((SetPassVar) any); minTimes = 0; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java index ba78968e50..39847b49a2 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java @@ -138,7 +138,7 @@ public class ShowDataStmtTest { @Test public void testNormal() throws AnalysisException, UserException { - ShowDataStmt stmt = new ShowDataStmt(null, null, null); + ShowDataStmt stmt = new ShowDataStmt(null, null); stmt.analyze(analyzer); Assert.assertEquals("SHOW DATA FROM `testCluster:testDb`", stmt.toString()); Assert.assertEquals(3, stmt.getMetaData().getColumnCount()); @@ -149,13 +149,13 @@ public class ShowDataStmtTest { SlotRef slotRefTwo = new SlotRef(null, "Size"); OrderByElement orderByElementTwo = new OrderByElement(slotRefTwo, false, false); - stmt = new ShowDataStmt("testDb", "test_tbl", Arrays.asList(orderByElementOne, orderByElementTwo)); + stmt = new ShowDataStmt(new TableName("testDb", "test_tbl"), Arrays.asList(orderByElementOne, orderByElementTwo)); stmt.analyze(analyzer); Assert.assertEquals("SHOW DATA FROM `default_cluster:testDb`.`test_tbl` ORDER BY `ReplicaCount` DESC, `Size` DESC", stmt.toString()); Assert.assertEquals(5, stmt.getMetaData().getColumnCount()); Assert.assertEquals(true, stmt.hasTable()); - stmt = new ShowDataStmt(null, null, Arrays.asList(orderByElementOne, orderByElementTwo)); + stmt = new ShowDataStmt(null, Arrays.asList(orderByElementOne, orderByElementTwo)); stmt.analyze(analyzer); Assert.assertEquals("SHOW DATA FROM `testCluster:testDb` ORDER BY `ReplicaCount` DESC, `Size` DESC", stmt.toString()); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java index 4760f6f498..a554d61bc1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java @@ -231,6 +231,7 @@ public class ShowExecutorTest { } }; + ctx.changeDefaultCatalog(InternalDataSource.INTERNAL_DS_NAME); ctx.setConnectScheduler(scheduler); ctx.setCatalog(AccessTestUtil.fetchAdminCatalog()); ctx.setQualifiedUser("testCluster:testUser"); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org