This commit is contained in:
wenshao
2017-11-20 14:59:45 +08:00
6 changed files with 192 additions and 1 deletions
@@ -28,6 +28,8 @@ public class SQLVariantRefExpr extends SQLExprImpl {
private boolean global = false;
private boolean hasSessionBefore = false;
private int index = -1;
public SQLVariantRefExpr(String name){
@@ -39,6 +41,12 @@ public class SQLVariantRefExpr extends SQLExprImpl {
this.global = global;
}
public SQLVariantRefExpr(String name, boolean global,boolean hasSessionBefore){
this.name = name;
this.global = global;
this.hasSessionBefore = hasSessionBefore;
}
public SQLVariantRefExpr(){
}
@@ -63,6 +71,15 @@ public class SQLVariantRefExpr extends SQLExprImpl {
buf.append(this.name);
}
public boolean isHasSessionBefore() {
return hasSessionBefore;
}
public void setHasSessionBefore(boolean hasSessionBefore) {
this.hasSessionBefore = hasSessionBefore;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
visitor.visit(this);
@@ -29,6 +29,17 @@ public class MySqlSetTransactionStatement extends MySqlStatementImpl {
private String accessModel;
private Boolean hasSessionBefore;
public Boolean getHasSessionBefore() {
return hasSessionBefore;
}
public void setHasSessionBefore(Boolean hasSessionBefore) {
this.hasSessionBefore = hasSessionBefore;
}
public void accept0(MySqlASTVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
@@ -596,7 +596,7 @@ public class MySqlExprParser extends SQLExprParser {
} else if (identHash == FnvHash.Constants.SESSION) {
ident = lexer.stringVal();
lexer.nextToken();
var = new SQLVariantRefExpr(ident, false);
var = new SQLVariantRefExpr(ident, false, true);
} else {
var = new SQLVariantRefExpr(ident);
}
@@ -2609,17 +2609,20 @@ public class MySqlStatementParser extends SQLStatementParser {
}
Boolean global = null;
Boolean sessionBefore = null;
if (lexer.identifierEquals(GLOBAL)) {
global = Boolean.TRUE;
lexer.nextToken();
} else if (lexer.identifierEquals(SESSION)) {
global = Boolean.FALSE;
sessionBefore = Boolean.TRUE;
lexer.nextToken();
}
if (lexer.identifierEquals("TRANSACTION")) {
MySqlSetTransactionStatement stmt = new MySqlSetTransactionStatement();
stmt.setGlobal(global);
stmt.setHasSessionBefore(sessionBefore);
lexer.nextToken();
if (lexer.identifierEquals("ISOLATION")) {
@@ -2724,6 +2727,11 @@ public class MySqlStatementParser extends SQLStatementParser {
varRef.setGlobal(true);
}
if(sessionBefore != null && sessionBefore.booleanValue()){
SQLVariantRefExpr varRef = (SQLVariantRefExpr) stmt.getItems().get(0).getTarget();
varRef.setHasSessionBefore(true);
}
if (lexer.token() == Token.HINT) {
stmt.setHints(this.exprParser.parseHints());
}
@@ -655,6 +655,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.isGlobal()) {
print0("@@global.");
}else if(x.isHasSessionBefore()){
print0("@@session.");
}
String varName = x.getName();
@@ -0,0 +1,153 @@
package com.alibaba.druid.mysql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.util.JdbcConstants;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
/**
* Created by szf on 2017/11/16.
*/
public class MysqlCreateTableTest {
@Test
public void test(){
String sql = "set session tx_variables = 1, session asdfsa = 2 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
Assert.assertTrue(resultExpr.isHasSessionBefore());
Assert.assertTrue(resultExpr2.isHasSessionBefore());
}
@Test
public void test22(){
String sql = "set session tx_variables = 1, session asdfsa = 2 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
String text = SQLUtils.toSQLString(stmtList, JdbcConstants.MYSQL);
Assert.assertEquals("SET @@session.tx_variables = 1, @@session.asdfsa = 2", text);
}
@Test
public void test11(){
String sql = "set session TRANSACTION ISOLATION LEVEL SERIALIZABLE";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
MySqlSetTransactionStatement x = (MySqlSetTransactionStatement)stmtList.get(0);
Assert.assertTrue(x.getHasSessionBefore());
}
@Test
public void test12(){
String sql = "set TRANSACTION ISOLATION LEVEL SERIALIZABLE";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
MySqlSetTransactionStatement x = (MySqlSetTransactionStatement)stmtList.get(0);
Assert.assertTrue(x.getHasSessionBefore()==null);
}
@Test
public void test2(){
String sql = "set session tx_variables = 1, asdfsa = 2 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
Assert.assertTrue(resultExpr.isHasSessionBefore());
Assert.assertTrue(!resultExpr2.isHasSessionBefore());
}
@Test
public void test3(){
String sql = "set tx_variables = 1, asdfsa = 2 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
Assert.assertTrue(!resultExpr.isHasSessionBefore());
Assert.assertTrue(!resultExpr2.isHasSessionBefore());
}
@Test
public void test4(){
String sql = "set tx_variables = 1,session asdfsa = 2 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
Assert.assertTrue(!resultExpr.isHasSessionBefore());
Assert.assertTrue(resultExpr2.isHasSessionBefore());
}
@Test
public void test5(){
String sql = "set tx_variables = 1,session asdfsa = 2,session dfd = 3 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
SQLVariantRefExpr resultExpr3 = (SQLVariantRefExpr)result.getItems().get(2).getTarget();
Assert.assertTrue(!resultExpr.isHasSessionBefore());
Assert.assertTrue(resultExpr2.isHasSessionBefore());
Assert.assertTrue(resultExpr3.isHasSessionBefore());
}
@Test
public void test6(){
String sql = "set tx_variables = 1,session asdfsa = 2,session dfd = 3, sdfsdf =3,session adfa =9 ";
SQLStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLSetStatement result= (SQLSetStatement)stmtList.get(0);
SQLVariantRefExpr resultExpr = (SQLVariantRefExpr)result.getItems().get(0).getTarget();
SQLVariantRefExpr resultExpr2 = (SQLVariantRefExpr)result.getItems().get(1).getTarget();
SQLVariantRefExpr resultExpr3 = (SQLVariantRefExpr)result.getItems().get(2).getTarget();
SQLVariantRefExpr resultExpr4 = (SQLVariantRefExpr)result.getItems().get(3).getTarget();
SQLVariantRefExpr resultExpr5 = (SQLVariantRefExpr)result.getItems().get(4).getTarget();
Assert.assertTrue(!resultExpr.isHasSessionBefore());
Assert.assertTrue(resultExpr2.isHasSessionBefore());
Assert.assertTrue(resultExpr3.isHasSessionBefore());
Assert.assertTrue(!resultExpr4.isHasSessionBefore());
Assert.assertTrue(resultExpr5.isHasSessionBefore());
}
}