mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #986 from yakolee/master
support odps show grants ...
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 1999-2101 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.druid.sql.dialect.odps.ast;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.SQLStatementImpl;
|
||||
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class OdpsShowGrantsStmt extends SQLStatementImpl implements SQLStatement {
|
||||
|
||||
private SQLExpr user;
|
||||
|
||||
private SQLExpr objectType;
|
||||
|
||||
@Override
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
accept0((OdpsASTVisitor) visitor);
|
||||
}
|
||||
|
||||
public void accept0(OdpsASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, user);
|
||||
acceptChild(visitor, objectType);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLExpr getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(SQLExpr user) {
|
||||
if (user != null) {
|
||||
user.setParent(this);
|
||||
}
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public SQLExpr getObjectType() {
|
||||
return objectType;
|
||||
}
|
||||
|
||||
public void setObjectType(SQLExpr objectType) {
|
||||
if (objectType != null) {
|
||||
objectType.setParent(this);
|
||||
}
|
||||
this.objectType = objectType;
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
|
||||
@@ -318,6 +319,24 @@ public class OdpsStatementParser extends SQLStatementParser {
|
||||
return stmt;
|
||||
}
|
||||
|
||||
if (identifierEquals("GRANTS")) {
|
||||
lexer.nextToken();
|
||||
OdpsShowGrantsStmt stmt = new OdpsShowGrantsStmt();
|
||||
|
||||
if (lexer.token() == Token.FOR) {
|
||||
lexer.nextToken();
|
||||
stmt.setUser(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.ON) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("type");
|
||||
stmt.setObjectType(this.exprParser.expr());
|
||||
}
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
|
||||
@@ -103,4 +104,8 @@ public interface OdpsASTVisitor extends SQLASTVisitor {
|
||||
void endVisit(OdpsReadStatement x);
|
||||
|
||||
boolean visit(OdpsReadStatement x);
|
||||
|
||||
void endVisit(OdpsShowGrantsStmt x);
|
||||
|
||||
boolean visit(OdpsShowGrantsStmt x);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
|
||||
@@ -213,4 +214,14 @@ public class OdpsASTVisitorAdapter extends SQLASTVisitorAdapter implements OdpsA
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OdpsShowGrantsStmt x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OdpsShowGrantsStmt x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
|
||||
@@ -753,4 +754,24 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
|
||||
print(name);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OdpsShowGrantsStmt x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OdpsShowGrantsStmt x) {
|
||||
print("SHOW GRANTS");
|
||||
if (x.getUser() != null) {
|
||||
print(" FOR ");
|
||||
x.getUser().accept(this);
|
||||
}
|
||||
|
||||
if (x.getObjectType() != null) {
|
||||
print(" ON TYPE ");
|
||||
x.getObjectType().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
|
||||
@@ -216,4 +217,14 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
|
||||
public boolean visit(OdpsReadStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OdpsShowGrantsStmt x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OdpsShowGrantsStmt x) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -330,6 +330,7 @@ public class SQLExprParser extends SQLParser {
|
||||
case TYPE:
|
||||
case OPEN:
|
||||
case REPEAT:
|
||||
case TABLE:
|
||||
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.alibaba.druid.bvt.sql.odps;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
public class OdpsShowGrantsTest extends TestCase {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "show grants for aliyun$DXP_XXXX@aliyun.com";
|
||||
OdpsStatementParser parser = new OdpsStatementParser(sql);
|
||||
SQLStatement stmt = parser.parseStatementList().get(0);
|
||||
parser.match(Token.EOF);
|
||||
String output = SQLUtils.toOdpsString(stmt);
|
||||
//System.out.println(output);
|
||||
Assert.assertEquals("SHOW GRANTS FOR aliyun$DXP_XXXX@aliyun.com", output);
|
||||
}
|
||||
|
||||
public void test_1() throws Exception {
|
||||
String sql = "show grants for aliyun$DXP_XXXX@aliyun.com on type table";
|
||||
OdpsStatementParser parser = new OdpsStatementParser(sql);
|
||||
SQLStatement stmt = parser.parseStatementList().get(0);
|
||||
parser.match(Token.EOF);
|
||||
String output = SQLUtils.toOdpsString(stmt);
|
||||
//System.out.println(output);
|
||||
Assert.assertEquals("SHOW GRANTS FOR aliyun$DXP_XXXX@aliyun.com ON TYPE table", output);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user