From c4d1d22fb5254b0a3e20a7bdd41cabdc1258e948 Mon Sep 17 00:00:00 2001 From: Yako Date: Sun, 21 Dec 2014 22:12:00 +0800 Subject: [PATCH] improve sqlparser --- .../mysql/visitor/MySqlOutputVisitor.java | 2 +- .../postgresql/visitor/PGOutputVisitor.java | 2 +- .../alibaba/druid/bvt/bug/Bug_for_weizhi.java | 48 +++++++++++++++++ .../bvt/sql/mysql/RegularExpressionsTest.java | 4 +- .../mysql/StringComparisonFunctionsTest.java | 2 +- .../bvt/sql/postgresql/PGSelectTest21.java | 51 +++++++++++++++++++ 6 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/bug/Bug_for_weizhi.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java 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 2f516a0cd2..afeb79dbc1 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 @@ -592,7 +592,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV String text = x.getText(); text = text.replaceAll("'", "''"); - text = text.replaceAll("\\\\", "\\\\"); + text = text.replace("\\", "\\\\"); print(text); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 3c20564650..3895100da7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -180,7 +180,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { print("DISTINCT "); - if (x.getDistinctOn() != null) { + if (x.getDistinctOn() != null && x.getDistinctOn().size() > 0) { print("ON "); printAndAccept(x.getDistinctOn(), ", "); } diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_weizhi.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_weizhi.java new file mode 100644 index 0000000000..c68ca62e79 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_weizhi.java @@ -0,0 +1,48 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.bug; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; + +public class Bug_for_weizhi extends TestCase { + + public void test_for_issue() throws Exception { + String sql = "insert into aaa values(1,2,'这是个反斜杠\\\\');"; + + String expected = "INSERT INTO aaa\nVALUES (1, 2, '这是个反斜杠\\\\');"; + + StringBuilder out = new StringBuilder(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(out); + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + for (SQLStatement statement : statementList) { + statement.accept(visitor); + visitor.print(";"); + } + + System.out.println(out.toString()); + + Assert.assertEquals(expected, out.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/RegularExpressionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/RegularExpressionsTest.java index ffb1f79014..3604f8a658 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/RegularExpressionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/RegularExpressionsTest.java @@ -45,8 +45,10 @@ public class RegularExpressionsTest extends TestCase { List stmtList = parser.parseStatementList(); String text = output(stmtList); + + String e = "SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';"; - Assert.assertEquals("SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';", text); + Assert.assertEquals("SELECT 'new*\n*line' REGEXP 'new\\\\*.\\\\*line';", text); } public void test_2() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java index 471a846714..39db210921 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java @@ -134,7 +134,7 @@ public class StringComparisonFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT filename, filename LIKE '%\\'\nFROM t1;", text); + Assert.assertEquals("SELECT filename, filename LIKE '%\\\\'\nFROM t1;", text); } public void test_10() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java new file mode 100644 index 0000000000..d9286b3d90 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest21.java @@ -0,0 +1,51 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.postgresql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; + +public class PGSelectTest21 extends PGTest { + + public void test_0() throws Exception { + String sql = "SELECT DISTINCT(type) FROM dbmis2_databases"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals("SELECT DISTINCT type\nFROM dbmis2_databases", output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getTables().size()); + } +}