Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix](show-table-status) fix priv error on show table status stmt #22918

Merged
merged 2 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions fe/fe-core/src/main/cup/sql_parser.cup
Original file line number Diff line number Diff line change
Expand Up @@ -3822,12 +3822,12 @@ show_param ::=
/* show table status */
| KW_TABLE KW_STATUS opt_db:db opt_wild_where
{:
RESULT = new ShowTableStatusStmt(db, null, parser.wild, parser.where);
RESULT = new ShowTableStatusStmt(null, db, parser.wild, parser.where);
:}
/* show table status */
| KW_TABLE KW_STATUS from_or_in ident:ctl DOT ident:db opt_wild_where
{:
RESULT = new ShowTableStatusStmt(db, ctl, parser.wild, parser.where);
RESULT = new ShowTableStatusStmt(ctl, db, parser.wild, parser.where);
:}
/* show tables */
| opt_full KW_TABLES opt_db:db opt_wild_where
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,27 +59,27 @@ public class ShowTableStatusStmt extends ShowStmt {
.addColumn(new Column("Comment", ScalarType.createVarchar(64)))
.build();

private String db;
private String catalog;
private String db;
private String wild;
private Expr where;
private SelectStmt selectStmt;

public ShowTableStatusStmt(String db, String catalog, String wild, Expr where) {
public ShowTableStatusStmt(String catalog, String db, String wild, Expr where) {
this.catalog = catalog;
this.db = db;
this.wild = wild;
this.where = where;
this.catalog = catalog;
}

public String getDb() {
return db;
}

public String getCatalog() {
return catalog;
}

public String getDb() {
return db;
}

public String getPattern() {
return wild;
}
Expand All @@ -101,7 +101,8 @@ public void analyze(Analyzer analyzer) throws AnalysisException {
}
}

if (!Env.getCurrentEnv().getAccessManager().checkDbPriv(ConnectContext.get(), db, PrivPredicate.SHOW)) {
if (!Env.getCurrentEnv().getAccessManager().checkDbPriv(ConnectContext.get(),
catalog, db, PrivPredicate.SHOW)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_DBACCESS_DENIED_ERROR, analyzer.getQualifiedUser(), db);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -871,7 +871,8 @@ private void handleShowTableStatus() throws AnalysisException {

// check tbl privs
if (!Env.getCurrentEnv().getAccessManager()
.checkTblPriv(ConnectContext.get(), db.getFullName(), table.getName(), PrivPredicate.SHOW)) {
.checkTblPriv(ConnectContext.get(), showStmt.getCatalog(),
db.getFullName(), table.getName(), PrivPredicate.SHOW)) {
continue;
}
List<String> row = Lists.newArrayList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.apache.doris.analysis.DropCatalogStmt;
import org.apache.doris.analysis.GrantStmt;
import org.apache.doris.analysis.ShowCatalogStmt;
import org.apache.doris.analysis.ShowTableStatusStmt;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.Env;
Expand All @@ -39,6 +40,7 @@
import org.apache.doris.mysql.privilege.CatalogAccessController;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.qe.ShowExecutor;
import org.apache.doris.qe.ShowResultSet;
import org.apache.doris.utframe.TestWithFeService;

Expand Down Expand Up @@ -80,6 +82,17 @@ protected void runBeforeAll() throws Exception {
rootCtx);
env.getCatalogMgr().createCatalog(testCatalog);

CreateCatalogStmt testCatalog2 = (CreateCatalogStmt) parseAndAnalyzeStmt(
"create catalog test2 properties(\n"
+ " \"type\" = \"test\",\n"
+ " \"catalog_provider.class\" "
+ "= \"org.apache.doris.datasource.ColumnPrivTest$MockedCatalogProvider\",\n"
+ " \"access_controller.properties.key1\" = \"val1\",\n"
+ " \"access_controller.properties.key2\" = \"val2\"\n"
+ ");",
rootCtx);
env.getCatalogMgr().createCatalog(testCatalog2);

// 2. create internal db and tbl
CreateDbStmt createDbStmt = (CreateDbStmt) parseAndAnalyzeStmt("create database innerdb1");
env.createDb(createDbStmt);
Expand Down Expand Up @@ -132,7 +145,7 @@ public void testColumnPrivs() throws Exception {
String showCatalogSql = "SHOW CATALOGS";
ShowCatalogStmt showStmt = (ShowCatalogStmt) parseAndAnalyzeStmt(showCatalogSql);
ShowResultSet showResultSet = mgr.showCatalogs(showStmt);
Assertions.assertEquals(2, showResultSet.getResultRows().size());
Assertions.assertEquals(3, showResultSet.getResultRows().size());

CreateRoleStmt createRole1 = (CreateRoleStmt) parseAndAnalyzeStmt("create role role1;", rootCtx);
auth.createRole(createRole1);
Expand Down Expand Up @@ -197,12 +210,38 @@ public void testColumnPrivs() throws Exception {
testSql(user1Ctx, "select * from numbers(\"number\" = \"1\");", "0:VDataGenScanNode");
}

@Test
public void testShowTableStatusPrivs() throws Exception {
ConnectContext root = createCtx(UserIdentity.ROOT, "127.0.0.1");
CreateUserStmt createUserStmt = (CreateUserStmt) parseAndAnalyzeStmt("create user show_table_status"
+ " identified by '123456'", root);
auth.createUser(createUserStmt);
GrantStmt grant = (GrantStmt) parseAndAnalyzeStmt(
"grant select_priv on test2.*.* to show_table_status;", root);
auth.grant(grant);

UserIdentity user = UserIdentity.createAnalyzedUserIdentWithIp("default_cluster:show_table_status", "%");
ConnectContext userCtx = createCtx(user, "127.0.0.1");

ShowTableStatusStmt stmt = (ShowTableStatusStmt) parseAndAnalyzeStmt(
"show table status from test2.db1 LIKE \"%tbl%\";");
ShowExecutor executor = new ShowExecutor(userCtx, stmt);
ShowResultSet resultSet = executor.execute();
Assert.assertEquals(2, resultSet.getResultRows().size());
}

private void testSql(ConnectContext ctx, String sql, String expectedMsg) throws Exception {
String res = getSQLPlanOrErrorMsg(ctx, "explain " + sql, false);
System.out.println(res);
Assert.assertTrue(res.contains(expectedMsg));
}

private void testShow(ConnectContext ctx, String sql, String expectedMsg) throws Exception {
String res = getSQLPlanOrErrorMsg(ctx, "explain " + sql, false);
System.out.println(res);
Assert.assertTrue(res.contains(expectedMsg));
}

public static class TestAccessControllerFactory implements AccessControllerFactory {
@Override
public CatalogAccessController createAccessController(Map<String, String> prop) {
Expand Down
Loading