From bf8b6e4b7244a2f1b72704a09e0af0ac92ce7e03 Mon Sep 17 00:00:00 2001 From: Yako Date: Tue, 3 Nov 2015 09:57:27 +0800 Subject: [PATCH] support odps show grants ... --- .../dialect/odps/ast/OdpsShowGrantsStmt.java | 64 +++++++++++++++++++ .../odps/parser/OdpsStatementParser.java | 19 ++++++ .../dialect/odps/visitor/OdpsASTVisitor.java | 5 ++ .../odps/visitor/OdpsASTVisitorAdapter.java | 11 ++++ .../odps/visitor/OdpsOutputVisitor.java | 21 ++++++ .../odps/visitor/OdpsSchemaStatVisitor.java | 11 ++++ .../druid/sql/parser/SQLExprParser.java | 1 + .../bvt/sql/odps/OdpsShowGrantsTest.java | 34 ++++++++++ 8 files changed, 166 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowGrantsStmt.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowGrantsTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowGrantsStmt.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowGrantsStmt.java new file mode 100644 index 0000000000..a279d44425 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowGrantsStmt.java @@ -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; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index 6ba6303a4e..18f30d53fe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -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()); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java index 9efed2fd1d..dd626d3cd4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java @@ -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); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java index 4d7d65afa9..b43104abad 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java @@ -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; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index 5dcc0e0679..9bc143b171 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java index 1feb7be649..312a62d6b8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 76e5b2d976..82dfd7bdfd 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -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; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowGrantsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowGrantsTest.java new file mode 100644 index 0000000000..d251a17731 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowGrantsTest.java @@ -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); + } + +}