From 54e9620dc3bfef3aeab36e01ce9dacc1c341131c Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 25 Jun 2017 19:04:59 +0800 Subject: [PATCH] bug fixed for mysql parser. --- .../sql/dialect/mysql/parser/MySqlLexer.java | 32 +++++----- .../mysql/parser/MySqlStatementParser.java | 10 +++ ...ySqlParameterizedOutputVisitorTest_42.java | 63 +++++++++++++++++++ 3 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_42.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index ee2d4a1819..d7bd5a0812 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -262,22 +262,22 @@ public class MySqlLexer extends Lexer { ch = charAt(++pos); if (!isIdentifierChar(ch)) { - if (ch == '-' && pos < text.length() - 1) { - if (mark > 0 && text.charAt(mark - 1) == '.') { - break; - } - - char next_char = text.charAt(pos + 1); - if (isIdentifierChar(next_char)) { - bufPos++; - continue; - } - } - if (last_ch == '-' && charAt(pos-2) != '-') { - ch = last_ch; - bufPos--; - pos--; - } +// if (ch == '-' && pos < text.length() - 1) { +// if (mark > 0 && text.charAt(mark - 1) == '.') { +// break; +// } +// +// char next_char = text.charAt(pos + 1); +// if (isIdentifierChar(next_char)) { +// bufPos++; +// continue; +// } +// } +// if (last_ch == '-' && charAt(pos-2) != '-') { +// ch = last_ch; +// bufPos--; +// pos--; +// } break; } 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 45e330cb45..26bc99e3a3 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 @@ -1583,6 +1583,16 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLName database = exprParser.name(); + if (lexer.token() == Token.SUB && database instanceof SQLIdentifierExpr) { + lexer.mark(); + lexer.nextToken(); + String strVal = lexer.stringVal(); + lexer.nextToken(); + if (database instanceof SQLIdentifierExpr) { + SQLIdentifierExpr ident = (SQLIdentifierExpr) database; + ident.setName(ident.getName() + "-" + strVal); + } + } stmt.setDatabase(database); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_42.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_42.java new file mode 100644 index 0000000000..815cb18d04 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_42.java @@ -0,0 +1,63 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_42 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "UPDATE offline_file_user" + + " SET sended_file_num = sended_file_num-1, sended_flie_total_size = sended_flie_total_size-19039064" + + " WHERE login_id = ?"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("UPDATE offline_file_user\n" + + "SET sended_file_num = sended_file_num - ?, sended_flie_total_size = sended_flie_total_size - ?\n" + + "WHERE login_id = ?", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[1,19039064]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("UPDATE offline_file_user\n" + + "SET sended_file_num = sended_file_num - 1, sended_flie_total_size = sended_flie_total_size - 19039064\n" + + "WHERE login_id = ?", rsql); + } +}