diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java index 03b84d2af5..d1c5e4d275 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java index e6630f4568..e731b84c73 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 332acfa7d2..1efbd56c0e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -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); } 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 0982ddb9e3..135f9e832e 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 @@ -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()); } 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 873d12a7f7..eed6787f79 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 @@ -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(); diff --git a/src/test/java/com/alibaba/druid/mysql/MysqlCreateTableTest.java b/src/test/java/com/alibaba/druid/mysql/MysqlCreateTableTest.java new file mode 100644 index 0000000000..452d3f8fe0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/mysql/MysqlCreateTableTest.java @@ -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 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 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 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 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 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 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 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 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 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()); + } + +}