From 8b8a3f9e50c0ff1c68034cb326964d45f10b0f3c Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 25 Nov 2016 03:02:55 +0800 Subject: [PATCH] sql server parser support 'Start Tran' issue #1504 --- .../SQLStartTransactionStatement.java} | 23 ++++++++++-- .../mysql/parser/MySqlStatementParser.java | 8 ++--- .../mysql/visitor/MySqlASTVisitor.java | 6 +--- .../mysql/visitor/MySqlASTVisitorAdapter.java | 12 +------ .../mysql/visitor/MySqlOutputVisitor.java | 10 ++---- .../mysql/visitor/MySqlSchemaStatVisitor.java | 6 ++-- .../parser/SQLServerStatementParser.java | 28 ++++++++------- .../visitor/SQLServerOutputVisitor.java | 21 +++++++---- .../druid/sql/visitor/SQLASTVisitor.java | 3 ++ .../sql/visitor/SQLASTVisitorAdapter.java | 11 ++++++ .../druid/wall/spi/WallVisitorUtils.java | 4 +-- .../sql/mysql/MySqlASTVisitorAdapterTest.java | 4 +-- .../SQLServerStartTransactionTest.java | 35 +++++++++++++++++++ 13 files changed, 113 insertions(+), 58 deletions(-) rename src/main/java/com/alibaba/druid/sql/{dialect/mysql/ast/statement/MySqlStartTransactionStatement.java => ast/statement/SQLStartTransactionStatement.java} (69%) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerStartTransactionTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStartTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java similarity index 69% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStartTransactionStatement.java rename to src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java index 5fa556bdff..8340fe4f16 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStartTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java @@ -13,19 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; +package com.alibaba.druid.sql.ast.statement; import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; +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.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlStartTransactionStatement extends MySqlStatementImpl { +public class SQLStartTransactionStatement extends SQLStatementImpl { private boolean consistentSnapshot = false; private boolean begin = false; private boolean work = false; + private SQLExpr name; private List hints; @@ -53,7 +59,7 @@ public class MySqlStartTransactionStatement extends MySqlStatementImpl { this.work = work; } - public void accept0(MySqlASTVisitor visitor) { + public void accept0(SQLASTVisitor visitor) { visitor.visit(this); visitor.endVisit(this); @@ -66,4 +72,15 @@ public class MySqlStartTransactionStatement extends MySqlStatementImpl { public void setHints(List hints) { this.hints = hints; } + + public SQLExpr getName() { + return name; + } + + public void setName(SQLExpr name) { + if (name != null) { + name.setParent(this); + } + this.name = name; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 091e8f8ff1..d488da462f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -179,7 +179,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusSta import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement; @@ -634,7 +634,7 @@ public class MySqlStatementParser extends SQLStatementParser { } if (identifierEquals("START")) { - MySqlStartTransactionStatement stmt = parseStart(); + SQLStartTransactionStatement stmt = parseStart(); statementList.add(stmt); return true; } @@ -1565,11 +1565,11 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - public MySqlStartTransactionStatement parseStart() { + public SQLStartTransactionStatement parseStart() { acceptIdentifier("START"); acceptIdentifier("TRANSACTION"); - MySqlStartTransactionStatement stmt = new MySqlStartTransactionStatement(); + SQLStartTransactionStatement stmt = new SQLStartTransactionStatement(); if (lexer.token() == Token.WITH) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index ba533c7809..ed830e2592 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -118,7 +118,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusSta import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -194,10 +194,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlReplaceStatement x); - void endVisit(MySqlStartTransactionStatement x); - - boolean visit(MySqlStartTransactionStatement x); - void endVisit(MySqlCommitStatement x); boolean visit(MySqlCommitStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index b4ef679a85..1127d58873 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.mysql.visitor; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.*; import com.alibaba.druid.sql.dialect.mysql.ast.clause.*; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; @@ -177,17 +178,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq return true; } - @Override - public void endVisit(MySqlStartTransactionStatement x) { - - } - - @Override - public boolean visit(MySqlStartTransactionStatement x) { - - return true; - } - @Override public void endVisit(MySqlCommitStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 49568e625b..7444787058 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -93,7 +93,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRollbackStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; @@ -140,7 +139,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusSta import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -1289,12 +1288,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } @Override - public void endVisit(MySqlStartTransactionStatement x) { - - } - - @Override - public boolean visit(MySqlStartTransactionStatement x) { + public boolean visit(SQLStartTransactionStatement x) { print0(ucase ? "START TRANSACTION" : "start transaction"); if (x.isConsistentSnapshot()) { print0(ucase ? " WITH CONSISTENT SNAPSHOT" : " with consistent snapshot"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index d90e2d19a3..50fcbf53e2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -136,7 +136,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusSta import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -399,12 +399,12 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } @Override - public void endVisit(MySqlStartTransactionStatement x) { + public void endVisit(SQLStartTransactionStatement x) { } @Override - public boolean visit(MySqlStartTransactionStatement x) { + public boolean visit(SQLStartTransactionStatement x) { return true; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index ce8bb542ad..8f88969480 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -25,16 +25,7 @@ import com.alibaba.druid.sql.ast.SQLDeclareItem; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.statement.SQLBlockStatement; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLConstraint; -import com.alibaba.druid.sql.ast.statement.SQLIfStatement; -import com.alibaba.druid.sql.ast.statement.SQLInsertInto; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLSetStatement; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; @@ -469,11 +460,22 @@ public class SQLServerStatementParser extends SQLStatementParser { return stmt; } - public SQLBlockStatement parseBlock() { - SQLBlockStatement block = new SQLBlockStatement(); - + public SQLStatement parseBlock() { accept(Token.BEGIN); + if (identifierEquals("TRANSACTION") || identifierEquals("TRAN")) { + lexer.nextToken(); + + SQLStartTransactionStatement startTrans = new SQLStartTransactionStatement(); + + if (lexer.token() == Token.IDENTIFIER) { + SQLName name = this.exprParser.name(); + startTrans.setName(name); + } + return startTrans; + } + + SQLBlockStatement block = new SQLBlockStatement(); parseStatementList(block.getStatementList()); accept(Token.END); 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 62a2ca6d61..417f915a64 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 @@ -18,12 +18,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.statement.SQLAssignItem; -import com.alibaba.druid.sql.ast.statement.SQLBlockStatement; -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.ast.statement.*; 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; @@ -569,7 +564,19 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe @Override public void endVisit(SQLServerParameter x) { - // TODO Auto-generated method stub + } + + @Override + public boolean visit(SQLStartTransactionStatement x) { + print0(ucase ? "BEGIN TRANSACTION" : "begin transaction"); + + if (x.getName() != null) { + print(' '); + x.getName().accept(this); + } + + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 9796379eec..41858c64fb 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -682,4 +682,7 @@ public interface SQLASTVisitor { boolean visit(SQLLimit x); void endVisit(SQLLimit x); + + void endVisit(SQLStartTransactionStatement x); + boolean visit(SQLStartTransactionStatement x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 59a663664c..102eb5f9e1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -1554,4 +1554,15 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLLimit x) { } + + + @Override + public void endVisit(SQLStartTransactionStatement x) { + + } + + @Override + public boolean visit(SQLStartTransactionStatement x) { + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 533e026841..6e4c403c20 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -78,7 +78,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatemen import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowGrantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; @@ -2451,7 +2451,7 @@ public class WallVisitorUtils { allow = config.isLockTableAllow(); denyMessage = "lock table not allow"; errorCode = ErrorCode.LOCK_TABLE_NOT_ALLOW; - } else if (x instanceof MySqlStartTransactionStatement) { + } else if (x instanceof SQLStartTransactionStatement) { allow = config.isStartTransactionAllow(); denyMessage = "start transaction not allow"; errorCode = ErrorCode.START_TRANSACTION_NOT_ALLOW; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index d8f4c71416..18aa412fd4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -79,7 +79,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatemen import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; +import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement; @@ -107,7 +107,7 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlInsertStatement().accept(adapter); new MySqlLoadXmlStatement().accept(adapter); new MySqlReplaceStatement().accept(adapter); - new MySqlStartTransactionStatement().accept(adapter); + new SQLStartTransactionStatement().accept(adapter); new MySqlRollbackStatement().accept(adapter); new MySqlShowColumnsStatement().accept(adapter); new MySqlShowDatabasesStatement().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerStartTransactionTest.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerStartTransactionTest.java new file mode 100644 index 0000000000..39f25c9a17 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerStartTransactionTest.java @@ -0,0 +1,35 @@ +/* + * 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.bvt.sql.sqlserver; + +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.test.TestUtils; +import junit.framework.TestCase; +import org.junit.Assert; + +public class SQLServerStartTransactionTest extends TestCase { + + public void test_stmt() throws Exception { + String sql = "BEGIN TRAN T1;"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + + assertEquals("BEGIN TRANSACTION T1", SQLUtils.toSQLServerString(stmt)); + } +}