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 81f0d243fb..a23b71a0cf 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 @@ -597,10 +597,12 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.setLockType(LockType.READ); } } else if (lexer.identifierEquals(WRITE)) { + lexer.nextToken(); stmt.setLockType(LockType.WRITE); } else if (lexer.identifierEquals(FnvHash.Constants.LOW_PRIORITY)) { lexer.nextToken(); acceptIdentifier(WRITE); + lexer.nextToken(); stmt.setLockType(LockType.LOW_PRIORITY_WRITE); } else { throw new ParserException("syntax error, expect READ or WRITE, actual " + lexer.token() + ", " + lexer.info()); diff --git a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java index 3e5920f707..e5bb146e42 100644 --- a/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java +++ b/src/test/java/com/alibaba/druid/test/wall/MySqlResourceWallTest.java @@ -25,25 +25,19 @@ import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallCheckResult; import com.alibaba.druid.wall.WallProvider; import com.alibaba.druid.wall.spi.MySqlWallProvider; +import org.junit.Assert; +import org.junit.Test; public class MySqlResourceWallTest extends TestCase { private String[] items; - protected void setUp() throws Exception { -// File file = new File("/home/wenshao/error_sql"); - File file = new File("/home/wenshao/scan_result"); - FileInputStream is = new FileInputStream(file); - String text = Utils.read(is); - is.close(); - items = text.split("\\|\\n\\|"); - } public void test_false() throws Exception { WallProvider provider = new MySqlWallProvider(); - + provider.getConfig().setConditionDoubleConstAllow(true); - + provider.getConfig().setUseAllow(true); provider.getConfig().setStrictSyntaxCheck(false); provider.getConfig().setMultiStatementAllow(true); @@ -76,4 +70,58 @@ public class MySqlResourceWallTest extends TestCase { // Assert.assertFalse(provider.checkValid(sql)); } + + + @Test + public void test_lock_table() throws Exception { + WallProvider provider = new MySqlWallProvider(); + provider.getConfig().setNoneBaseStatementAllow(true); + + String sql = "lock tables etstsun write"; + WallCheckResult result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "lock tables etstsun LOW_PRIORITY write"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "UNLOCK TABLES"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "lock table dsdfsdf read"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + sql = "lock table dsdfsdf read local"; + result = provider.check(sql); + if (result.getViolations().size() > 0) { + Violation violation = result.getViolations().get(0); + System.out.println("error () : " + violation.getMessage()); + } + Assert.assertTrue(provider.checkValid(sql)); + + + } + }