diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLObjectType.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLObjectType.java index c6f68d086d..9e59a6c593 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLObjectType.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLObjectType.java @@ -1,5 +1,5 @@ package com.alibaba.druid.sql.ast.statement; public enum SQLObjectType { - TABLE, FUNCTION, PROCEDURE, USER + TABLE, FUNCTION, PROCEDURE, USER, DATABASE } \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index de08199dcf..7efc2e39e0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -29,7 +29,7 @@ public class SQLSelect extends SQLObjectImpl { protected SQLSelectQuery query; protected SQLOrderBy orderBy; - private List hints; + protected List hints; public SQLSelect(){ diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java index 16c8e594ac..5d424c2bdf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java @@ -15,8 +15,82 @@ */ package com.alibaba.druid.sql.dialect.sqlserver.ast; -import com.alibaba.druid.sql.ast.statement.SQLSelect; +import java.util.ArrayList; +import java.util.List; -public class SQLServerSelect extends SQLSelect { +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLServerSelect extends SQLSelect implements SQLServerObject { + + private boolean forBrowse; + private List forXmlOptions = new ArrayList(4); + + public boolean isForBrowse() { + return forBrowse; + } + + public void setForBrowse(boolean forBrowse) { + this.forBrowse = forBrowse; + } + + public List getForXmlOptions() { + return forXmlOptions; + } + + public void setForXmlOptions(List forXmlOptions) { + this.forXmlOptions = forXmlOptions; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + this.accept0((SQLServerASTVisitor) visitor); + } + + @Override + public void accept0(SQLServerASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.query); + acceptChild(visitor, this.orderBy); + acceptChild(visitor, this.hints); + } + + visitor.endVisit(this); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (forBrowse ? 1231 : 1237); + result = prime * result + ((forXmlOptions == null) ? 0 : forXmlOptions.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + SQLServerSelect other = (SQLServerSelect) obj; + if (forBrowse != other.forBrowse) { + return false; + } + if (forXmlOptions == null) { + if (other.forXmlOptions != null) { + return false; + } + } else if (!forXmlOptions.equals(other.forXmlOptions)) { + return false; + } + return true; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java index e337ae08f8..93c94c5f1f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; +import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; @@ -39,9 +40,9 @@ public class SQLServerSelectParser extends SQLSelectParser { super(exprParser); } - public SQLSelect select() { + public SQLSelect select() { SQLServerSelect select = new SQLServerSelect(); - + withSubquery(select); select.setQuery(query()); @@ -51,10 +52,50 @@ public class SQLServerSelectParser extends SQLSelectParser { select.setOrderBy(parseOrderBy()); } + if (lexer.token() == Token.FOR) { + lexer.nextToken(); + + if (identifierEquals("BROWSE")) { + lexer.nextToken(); + select.setForBrowse(true); + } else if (identifierEquals("XML")) { + lexer.nextToken(); + + for (;;) { + if (identifierEquals("AUTO") // + || identifierEquals("TYPE") // + || identifierEquals("XMLSCHEMA") // + ) { + select.getForXmlOptions().add(lexer.stringVal()); + lexer.nextToken(); + } else if (identifierEquals("ELEMENTS")) { + lexer.nextToken(); + if (identifierEquals("XSINIL")) { + lexer.nextToken(); + select.getForXmlOptions().add("ELEMENTS XSINIL"); + } else { + select.getForXmlOptions().add("ELEMENTS"); + } + } else { + break; + } + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } + } + } else { + throw new ParserException("syntax error, not support option : " + lexer.token()); + } + } + return select; } - public SQLSelectQuery query() { + public SQLSelectQuery query() { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); @@ -68,7 +109,7 @@ public class SQLServerSelectParser extends SQLSelectParser { if (lexer.token() == Token.SELECT) { lexer.nextToken(); - + if (lexer.token() == Token.COMMENT) { lexer.nextToken(); } @@ -88,10 +129,10 @@ public class SQLServerSelectParser extends SQLSelectParser { parseSelectList(queryBlock); } - + if (lexer.token() == Token.INTO) { lexer.nextToken(); - + SQLTableSource into = this.parseTableSource(); queryBlock.setInto((SQLExprTableSource) into); } @@ -104,16 +145,16 @@ public class SQLServerSelectParser extends SQLSelectParser { return queryRest(queryBlock); } - + protected SQLServerExprParser createExprParser() { return new SQLServerExprParser(lexer); } - + protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) { if (lexer.token() == Token.WITH) { lexer.nextToken(); accept(Token.LPAREN); - + for (;;) { SQLExpr expr = this.expr(); SQLExprHint hint = new SQLExprHint(expr); @@ -126,10 +167,10 @@ public class SQLServerSelectParser extends SQLSelectParser { break; } } - + accept(Token.RPAREN); } - + return super.parseTableSourceRest(tableSource); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java index 4dcc822fa2..0cd3b966a1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -97,5 +98,9 @@ public interface SQLServerASTVisitor extends SQLASTVisitor { boolean visit(SQLServerBlockStatement x); void endVisit(SQLServerBlockStatement x); + + boolean visit(SQLServerSelect x); + + void endVisit(SQLServerSelect x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java index cb9c017a0e..ac14f09c0e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -193,5 +194,15 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements public void endVisit(SQLServerBlockStatement x) { } + + @Override + public boolean visit(SQLServerSelect x) { + return true; + } + + @Override + public void endVisit(SQLServerSelect x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index c7a69f339c..0d4a0b2a7c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -22,10 +22,12 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLGrantStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -553,4 +555,44 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe public void endVisit(SQLServerBlockStatement x) { } + + @Override + protected void printGrantOn(SQLGrantStatement x) { + if (x.getOn() != null) { + print(" ON "); + + if (x.getObjectType() != null) { + print(x.getObjectType().name()); + print("::"); + } + + x.getOn().accept(this); + } + } + + @Override + public void endVisit(SQLServerSelect x) { + + } + + @Override + public boolean visit(SQLServerSelect x) { + super.visit(x); + if (x.isForBrowse()) { + println(); + print("FOR BROWSE"); + } + + if (x.getForXmlOptions().size() > 0) { + println(); + print("FOR XML "); + for (int i = 0; i < x.getForXmlOptions().size(); ++i) { + if (i != 0) { + print(", "); + print(x.getForXmlOptions().get(i)); + } + } + } + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index 66881cc3ee..f39c524d0b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -230,4 +231,14 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL } + @Override + public boolean visit(SQLServerSelect x) { + return super.visit(x); + } + + @Override + public void endVisit(SQLServerSelect x) { + + } + } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 13165c89e7..f8d3c86486 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -379,6 +379,13 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token() == Token.USER) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.USER); + } else if (lexer.token() == Token.DATABASE) { + lexer.nextToken(); + stmt.setObjectType(SQLObjectType.DATABASE); + } + + if (stmt.getObjectType() != null && lexer.token() == Token.COLONCOLON) { + lexer.nextToken(); // sql server } SQLExpr expr = this.exprParser.expr(); @@ -631,6 +638,13 @@ public class SQLStatementParser extends SQLParser { } else if (identifierEquals("SUPER")) { lexer.nextToken(); privilege = "SUPER"; + + } else if (identifierEquals("CONTROL")) { // sqlserver + lexer.nextToken(); + privilege = "CONTROL"; + } else if (identifierEquals("IMPERSONATE")) { // sqlserver + lexer.nextToken(); + privilege = "IMPERSONATE"; } if (privilege != null) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 5f6b831a2f..c2deade239 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1808,16 +1808,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print("GRANT "); printAndAccept(x.getPrivileges(), ", "); - if (x.getOn() != null) { - print(" ON "); - - if (x.getObjectType() != null) { - print(x.getObjectType().name()); - print(' '); - } - - x.getOn().accept(this); - } + printGrantOn(x); if (x.getTo() != null) { print(" TO "); @@ -1877,6 +1868,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + protected void printGrantOn(SQLGrantStatement x) { + if (x.getOn() != null) { + print(" ON "); + + if (x.getObjectType() != null) { + print(x.getObjectType().name()); + print(' '); + } + + x.getOn().accept(this); + } + } + @Override public boolean visit(SQLRevokeStatement x) { print("ROVOKE "); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsListResourcesTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsListResourcesTest.java new file mode 100644 index 0000000000..e21f1d3f49 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsListResourcesTest.java @@ -0,0 +1,91 @@ +/* + * Copyright 1999-2011 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.bvt.sql.odps; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.List; + +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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; +import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsSchemaStatVisitor; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.Utils; + +public class OdpsListResourcesTest extends TestCase { + + public void test_0() throws Exception { + exec_test("bvt/parser/odps-3.sql"); + } + + public void exec_test(String resource) throws Exception { + System.out.println(resource); + InputStream is = null; + + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); + Reader reader = new InputStreamReader(is, "UTF-8"); + String input = Utils.read(reader); + JdbcUtils.close(reader); + String[] items = input.split("---------------------------"); + String sql = items[0].trim(); + String expect = items[1].trim(); + + OdpsStatementParser parser = new OdpsStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = new OdpsSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + System.out.println(); + System.out.println("---------------------------"); + System.out.println(SQLUtils.toOdpsString(stmt)); + } + + void mergValidate(String sql, String expect) { + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + StringBuilder out = new StringBuilder(); + MySqlParameterizedOutputVisitor visitor = new MySqlParameterizedOutputVisitor(out); + statemen.accept(visitor); + + System.out.println(out.toString()); + + Assert.assertEquals(expect, out.toString()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest18.java new file mode 100644 index 0000000000..e313bafd70 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest18.java @@ -0,0 +1,51 @@ +/* + * Copyright 1999-2011 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.bvt.sql.sqlserver; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.test.TestUtils; + +public class SQLServerSelectTest18 extends TestCase { + + public void test_simple() throws Exception { + String sql = "SELECT T0.[Address], T0.[Address] "// + + "FROM [dbo].[CRD1] T0 " // + + "WHERE T0.[CardCode] = (@P1) AND T0.[AdresType] = (@P2) " // + + "ORDER BY T0.[Address] " // + + "FOR BROWSE"; // + + String expect = "SELECT T0.[Address], T0.[Address]" + + "\nFROM [dbo].[CRD1] T0" + + "\nWHERE T0.[CardCode] = @P1" + + "\n\tAND T0.[AdresType] = @P2" + + "\nORDER BY T0.[Address]" + + "\nFOR BROWSE"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + + String text = TestUtils.outputSqlServer(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest19.java new file mode 100644 index 0000000000..54f91e215b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest19.java @@ -0,0 +1,52 @@ +/* + * Copyright 1999-2011 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.bvt.sql.sqlserver; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.test.TestUtils; + +public class SQLServerSelectTest19 extends TestCase { + + public void test_simple() throws Exception { + String sql = "SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone" + + "\nFROM Person.Person AS p" + + "\nJOIN Person.PersonPhone AS pph ON p.BusinessEntityID = pph.BusinessEntityID" + + "\nWHERE LastName LIKE 'G%'" + + "\nORDER BY LastName, FirstName " + + "\nFOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;"; // + + String expect = "SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone" + + "\nFROM Person.Person p" + + "\n\tJOIN Person.PersonPhone pph ON p.BusinessEntityID = pph.BusinessEntityID" + + "\nWHERE LastName LIKE 'G%'" + + "\nORDER BY LastName, FirstName" + + "\nFOR XML , TYPE, XMLSCHEMA, ELEMENTS XSINIL"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + + String text = TestUtils.outputSqlServer(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_0.java new file mode 100644 index 0000000000..4da9ce91a6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_0.java @@ -0,0 +1,36 @@ +package com.alibaba.druid.bvt.sql.sqlserver.grants; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.util.JdbcConstants; + +import junit.framework.TestCase; + + +public class SQLServerGrantTest_0 extends TestCase { + public void test_grants() throws Exception { + String sql = "grant all on database::TestDataBase to User1"; + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("GRANT ALL ON DATABASE::TestDataBase TO User1", output); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_1.java new file mode 100644 index 0000000000..fb78a2eefd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_1.java @@ -0,0 +1,36 @@ +package com.alibaba.druid.bvt.sql.sqlserver.grants; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.util.JdbcConstants; + +import junit.framework.TestCase; + + +public class SQLServerGrantTest_1 extends TestCase { + public void test_grants() throws Exception { + String sql = "GRANT CONTROL ON USER::Wanida TO RolandX;"; + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("GRANT CONTROL ON USER::Wanida TO RolandX", output); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_2.java new file mode 100644 index 0000000000..d8e6d0c5f7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/grants/SQLServerGrantTest_2.java @@ -0,0 +1,36 @@ +package com.alibaba.druid.bvt.sql.sqlserver.grants; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.util.JdbcConstants; + +import junit.framework.TestCase; + + +public class SQLServerGrantTest_2 extends TestCase { + public void test_grants() throws Exception { + String sql = "GRANT IMPERSONATE ON USER::HamithaL TO AccountsPayable17;"; + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("GRANT IMPERSONATE ON USER::HamithaL TO AccountsPayable17", output); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + } +}