mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
sql server parser support 'Start Tran' issue #1504
This commit is contained in:
+20
-3
@@ -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<SQLCommentHint> 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<SQLCommentHint> hints) {
|
||||
this.hints = hints;
|
||||
}
|
||||
|
||||
public SQLExpr getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLExpr name) {
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
}
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
+1
-11
@@ -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) {
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
+15
-13
@@ -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);
|
||||
|
||||
+14
-7
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -682,4 +682,7 @@ public interface SQLASTVisitor {
|
||||
|
||||
boolean visit(SQLLimit x);
|
||||
void endVisit(SQLLimit x);
|
||||
|
||||
void endVisit(SQLStartTransactionStatement x);
|
||||
boolean visit(SQLStartTransactionStatement x);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user