This commit is contained in:
温少
2012-05-17 21:43:50 +08:00
parent a6ab1d846f
commit 0ee9928637
8 changed files with 146 additions and 16 deletions
@@ -0,0 +1,51 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlLockTableStatement extends MySqlStatementImpl {
private static final long serialVersionUID = 1L;
private SQLExprTableSource tableSource;
private LockType lockType;
public SQLExprTableSource getTableSource() {
return tableSource;
}
public void setTableSource(SQLExprTableSource tableSource) {
this.tableSource = tableSource;
}
public void setTableSource(SQLName name) {
this.tableSource = new SQLExprTableSource(name);
}
public LockType getLockType() {
return lockType;
}
public void setLockType(LockType lockType) {
this.lockType = lockType;
}
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, tableSource);
}
visitor.endVisit(this);
}
public static enum LockType {
READ("READ"), READ_LOCAL("READ LOCAL"), WRITE("WRITE"), LOW_PRIORITY_WRITE("LOW_PRIORITY WRITE");
public final String name;
LockType(String name){
this.name = name;
}
}
}
@@ -55,6 +55,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplicateStatement;
@@ -476,18 +478,6 @@ public class MySqlStatementParser extends SQLStatementParser {
return true;
}
if (identifierEquals("COMMIT")) {
MySqlCommitStatement stmt = parseCommit();
statementList.add(stmt);
return true;
}
if (identifierEquals("ROLLBACK")) {
MySqlRollbackStatement stmt = parseRollback();
statementList.add(stmt);
return true;
}
if (identifierEquals("SHOW")) {
SQLStatement stmt = parseShow();
statementList.add(stmt);
@@ -511,6 +501,33 @@ public class MySqlStatementParser extends SQLStatementParser {
statementList.add(stmt);
return true;
}
if (lexer.token() == Token.LOCK) {
lexer.nextToken();
acceptIdentifier("TABLES");
MySqlLockTableStatement stmt = new MySqlLockTableStatement();
stmt.setTableSource(this.exprParser.name());
if (identifierEquals("READ")) {
lexer.nextToken();
if (identifierEquals("LOCAL")) {
lexer.nextToken();
stmt.setLockType(LockType.READ_LOCAL);
} else {
stmt.setLockType(LockType.READ);
}
} else if (identifierEquals("WRITE")) {
stmt.setLockType(LockType.WRITE);
} else if (identifierEquals("LOW_PRIORITY")) {
lexer.nextToken();
acceptIdentifier("WRITE");
stmt.setLockType(LockType.LOW_PRIORITY_WRITE);
}
statementList.add(stmt);
return true;
}
return false;
}
@@ -43,6 +43,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
@@ -460,4 +461,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlIgnoreIndexHint x);
void endVisit(MySqlIgnoreIndexHint x);
boolean visit(MySqlLockTableStatement x);
void endVisit(MySqlLockTableStatement x);
}
@@ -29,6 +29,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
@@ -1002,4 +1003,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
public void endVisit(MySqlIgnoreIndexHint x) {
}
@Override
public boolean visit(MySqlLockTableStatement x) {
return true;
}
@Override
public void endVisit(MySqlLockTableStatement x) {
}
}
@@ -62,6 +62,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
@@ -2441,4 +2442,20 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
return false;
}
@Override
public boolean visit(MySqlLockTableStatement x) {
print("LOCK TABLES ");
x.getTableSource().accept(this);
if (x.getLockType() != null) {
print(' ');
print(x.getLockType().name);
}
return false;
}
@Override
public void endVisit(MySqlLockTableStatement x) {
}
}
@@ -39,6 +39,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
@@ -1066,4 +1067,14 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlIgnoreIndexHint x) {
}
@Override
public boolean visit(MySqlLockTableStatement x) {
return false;
}
@Override
public void endVisit(MySqlLockTableStatement x) {
}
}
@@ -187,10 +187,6 @@ public class SQLStatementParser extends SQLParser {
continue;
}
if (parseStatementListDialect(statementList)) {
continue;
}
if (lexer.token() == Token.LPAREN) {
char mark_ch = lexer.current();
int mark_bp = lexer.bp();
@@ -202,6 +198,10 @@ public class SQLStatementParser extends SQLParser {
continue;
}
}
if (parseStatementListDialect(statementList)) {
continue;
}
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
@@ -72,4 +72,22 @@ public class MTSParserTest extends TestCase {
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("ROLLBACK TO x1", output);
}
public void test_lockTable() throws Exception {
String sql = "LOCK TABLES t1 READ;";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("LOCK TABLES t1 READ", output);
}
public void test_lockTable_1() throws Exception {
String sql = "LOCK TABLES t2 READ LOCAL;";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("LOCK TABLES t2 READ LOCAL", output);
}
}