refactor sql parser & support tableMapping. issue #1432

This commit is contained in:
wenshao
2016-09-25 05:06:50 +08:00
parent 2e478b1869
commit a26e4c546d
33 changed files with 430 additions and 177 deletions
@@ -0,0 +1,75 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.Collections;
import java.util.Map;
/**
* Created by wenshao on 16/9/25.
*/
public class MappingTest_createTable extends TestCase {
String sql = "create table user (\n" +
"source_key int,\n" +
"source_value varchar(32),\n" +
"primary key(source_key)\n" +
");";
Map<String, String> mapping = Collections.singletonMap("user", "user_01");
public void test_mapping_createTable() throws Exception {
String result = SQLUtils.refactor(null, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int,\n" +
"\tsource_value varchar(32),\n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
public void test_mapping_createTable_mysql() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.MYSQL, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int, \n" +
"\tsource_value varchar(32), \n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
public void test_mapping_createTable_oracle() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ORACLE, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int,\n" +
"\tsource_value varchar(32),\n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
public void test_mapping_createTable_pg() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.POSTGRESQL, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int,\n" +
"\tsource_value varchar(32),\n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
public void test_mapping_createTable_sqlserver() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.SQL_SERVER, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int,\n" +
"\tsource_value varchar(32),\n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
public void test_mapping_createTable_db2() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.DB2, sql, mapping);
assertEquals("CREATE TABLE user_01 (\n" +
"\tsource_key int,\n" +
"\tsource_value varchar(32),\n" +
"\tPRIMARY KEY (source_key)\n" +
")", result);
}
}
@@ -0,0 +1,46 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.Collections;
import java.util.Map;
/**
* Created by wenshao on 16/9/25.
*/
public class MappingTest_delete extends TestCase {
private String sql = "delete from user";
Map<String, String> mapping = Collections.singletonMap("user", "user_01");
public void test_mapping() throws Exception {
String result = SQLUtils.refactor(null, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
public void test_mapping_mysql() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.MYSQL, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
public void test_mapping_pg() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.POSTGRESQL, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
public void test_mapping_oracle() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ORACLE, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
public void test_mapping_sqlserver() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.SQL_SERVER, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
public void test_mapping_db2() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.DB2, sql, mapping);
assertEquals("DELETE FROM user_01", result);
}
}
@@ -0,0 +1,52 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.Collections;
import java.util.Map;
/**
* Created by wenshao on 16/9/25.
*/
public class MappingTest_insert extends TestCase {
private String sql = "insert into user (id, name) values (123, 'abc')";
Map<String, String> mapping = Collections.singletonMap("user", "user_01");
public void test_mapping() throws Exception {
String result = SQLUtils.refactor(null, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
public void test_mapping_mysql() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.MYSQL, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
public void test_mapping_pg() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.POSTGRESQL, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
public void test_mapping_oracle() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ORACLE, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
public void test_mapping_sqlserver() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.SQL_SERVER, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
public void test_mapping_db2() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.DB2, sql, mapping);
assertEquals("INSERT INTO user_01 (id, name)\n" +
"VALUES (123, 'abc')", result);
}
}
@@ -0,0 +1,52 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.Collections;
import java.util.Map;
/**
* Created by wenshao on 16/9/25.
*/
public class MappingTest_select extends TestCase {
String sql = "select * from user";
Map<String, String> mapping = Collections.singletonMap("user", "user_01");
public void test_mapping() throws Exception {
String result = SQLUtils.refactor(null, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
public void test_mapping_mysql() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.MYSQL, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
public void test_mapping_pg() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.POSTGRESQL, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
public void test_mapping_oracle() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ORACLE, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
public void test_mapping_sqlserver() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.SQL_SERVER, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
public void test_mapping_odps() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ODPS, sql, mapping);
assertEquals("SELECT *\n" +
"FROM user_01", result);
}
}
@@ -0,0 +1,58 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.Collections;
import java.util.Map;
/**
* Created by wenshao on 16/9/25.
*/
public class MappingTest_update extends TestCase {
private String sql = "update user set f1 = 1 where id = 3";
Map<String, String> mapping = Collections.singletonMap("user", "user_01");
public void test_mapping() throws Exception {
String result = SQLUtils.refactor(null, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
public void test_mapping_mysql() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.MYSQL, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
public void test_mapping_pg() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.POSTGRESQL, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
public void test_mapping_oracle() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.ORACLE, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
public void test_mapping_sqlserver() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.SQL_SERVER, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
public void test_mapping_db2() throws Exception {
String result = SQLUtils.refactor(JdbcConstants.DB2, sql, mapping);
assertEquals("UPDATE user_01\n" +
"SET f1 = 1\n" +
"WHERE id = 3", result);
}
}
@@ -59,10 +59,8 @@ public class DB2InsertTest_0 extends DB2Test {
// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name")));
String output = SQLUtils.toSQLString(stmt, JdbcConstants.DB2);
Assert.assertEquals("INSERT INTO t"
+ "\n\t(id, name)"
+ "\nVALUES"
+ "\n(?, ?), (?, ?), (?, ?)", //
Assert.assertEquals("INSERT INTO t (id, name)\n" +
"VALUES (?, ?), (?, ?), (?, ?)", //
output);
}
}
@@ -40,9 +40,8 @@ public class OracleInsertTest10 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO departments"//
+ "\nVALUES"//
+ "\n(280, 'Recreation', 121, 1700)",//
Assert.assertEquals("INSERT INTO departments\n" +
"VALUES (280, 'Recreation', 121, 1700)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -41,8 +41,7 @@ public class OracleInsertTest11 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO departments"//
+ "\nVALUES"//
+ "\n(280, 'Recreation', DEFAULT, 1700)",//
+ "\nVALUES (280, 'Recreation', DEFAULT, 1700)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -45,8 +45,7 @@ public class OracleInsertTest12 extends OracleTest {
Assert.assertEquals("INSERT INTO employees" //
+ "\n\t(employee_id, last_name, email, hire_date, job_id" //
+ "\n\t, salary, commission_pct)" //
+ "\nVALUES" //
+ "\n(207, 'Gregory', 'pgregory@example.com', SYSDATE, 'PU_CLERK'" //
+ "\nVALUES (207, 'Gregory', 'pgregory@example.com', SYSDATE, 'PU_CLERK'" //
+ "\n\t, 1.2E+3, NULL)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
@@ -43,8 +43,7 @@ public class OracleInsertTest15 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO employees@remote" //
+ "\nVALUES"//
+ "\n(8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL"//
+ "\nVALUES (8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL"//
+ "\n\t, TO_DATE('04-OCT-1992', 'DD-MON-YYYY'), 'SH_CLERK', 3000, NULL, 121"//
+ "\n\t, 20)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
@@ -41,8 +41,7 @@ public class OracleInsertTest16 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO departments" //
+ "\nVALUES"//
+ "\n(departments_seq.NEXTVAL, 'Entertainment', 162, 1400)",//
+ "\nVALUES (departments_seq.NEXTVAL, 'Entertainment', 162, 1400)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -39,10 +39,8 @@ public class OracleInsertTest17 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO sys_log"
+ "\n\t(ID, EXCEPTION)"
+ "\nVALUES"
+ "\n(?, ?)",//
Assert.assertEquals("INSERT INTO sys_log (ID, EXCEPTION)"
+ "\nVALUES (?, ?)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -39,10 +39,8 @@ public class OracleInsertTest18 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO sys_log"
+ "\n\t(ID, \"EXCEPTION\")"
+ "\nVALUES"
+ "\n(?, ?)",//
Assert.assertEquals("INSERT INTO sys_log (ID, \"EXCEPTION\")"
+ "\nVALUES (?, ?)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -42,8 +42,7 @@ public class OracleInsertTest19 extends OracleTest {
Assert.assertEquals(1, statementList.size());
Assert.assertEquals("INSERT INTO TB_DUOBAO_PARTICIPATE_NUMBER"
+ "\n\t(PARTICIPATE_NUMBER, PERIOD_ID, PRODUCT_ID, number_index)"
Assert.assertEquals("INSERT INTO TB_DUOBAO_PARTICIPATE_NUMBER (PARTICIPATE_NUMBER, PERIOD_ID, PRODUCT_ID, number_index)"
+ "\nSELECT ?, ?, ?, ?"
+ "\nFROM DUAL"
+ "\nUNION ALL"
@@ -46,10 +46,8 @@ public class PhoenixUpsertTest extends TestCase {
// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name")));
String output = SQLUtils.toSQLString(stmt, JdbcConstants.PHOENIX);
Assert.assertEquals("UPSERT INTO t_1\n" +
"\t(a, b, c)\n" +
"VALUES\n" +
"(?, ?, ?)", //
Assert.assertEquals("UPSERT INTO t_1 (a, b, c)\n" +
"VALUES (?, ?, ?)", //
output);
}
}
@@ -44,10 +44,8 @@ public class PhoenixUpsertTest_1 extends TestCase {
// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name")));
String output = SQLUtils.toSQLString(stmt, JdbcConstants.PHOENIX);
Assert.assertEquals("UPSERT INTO t_1\n" +
"\t(a BIGINT, b, c)\n" +
"VALUES\n" +
"(?, ?, ?)", //
Assert.assertEquals("UPSERT INTO t_1 (a BIGINT, b, c)\n" +
"VALUES (?, ?, ?)", //
output);
}
}
@@ -44,10 +44,8 @@ public class PhoenixUpsertTest_2 extends TestCase {
// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name")));
String output = SQLUtils.toSQLString(stmt, JdbcConstants.PHOENIX);
Assert.assertEquals("UPSERT INTO t_1\n" +
"\t(a CHAR(15), b, c)\n" +
"VALUES\n" +
"(?, ?, ?)", //
Assert.assertEquals("UPSERT INTO t_1 (a CHAR(15), b, c)\n" +
"VALUES (?, ?, ?)", //
output);
}
}
@@ -44,10 +44,8 @@ public class PhoenixUpsertTest_std extends TestCase {
// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name")));
String output = SQLUtils.toSQLString(stmt, JdbcConstants.PHOENIX);
Assert.assertEquals("UPSERT INTO t_1\n" +
"\t(a, b, c)\n" +
"VALUES\n" +
"(?, ?, ?)", //
Assert.assertEquals("UPSERT INTO t_1 (a, b, c)\n" +
"VALUES (?, ?, ?)", //
output);
}
}
@@ -21,17 +21,13 @@ public class SQLServerIfTest extends TestCase {
String sql = "if @is_exists is null begin insert into Inventory_1 (co_id,sku_id,order_lock) values (@0,@1,@2) end else begin insert into Inventory_2 (co_id,sku_id,order_lock) values (@0,@1,@2) end ";
String expect = "IF @is_exists IS NULL"//
+ "\n\tBEGIN"//
+ "\n\t\tINSERT INTO Inventory_1"//
+ "\n\t\t\t(co_id, sku_id, order_lock)"//
+ "\n\t\tVALUES"//
+ "\n\t\t(@0, @1, @2);"//
+ "\n\t\tINSERT INTO Inventory_1 (co_id, sku_id, order_lock)"//
+ "\n\t\tVALUES (@0, @1, @2);"//
+ "\n\tEND"//
+ "\nELSE"//
+ "\n\tBEGIN"//
+ "\n\t\tINSERT INTO Inventory_2"//
+ "\n\t\t\t(co_id, sku_id, order_lock)"//
+ "\n\t\tVALUES"//
+ "\n\t\t(@0, @1, @2);"//
+ "\n\t\tINSERT INTO Inventory_2 (co_id, sku_id, order_lock)"//
+ "\n\t\tVALUES (@0, @1, @2);"//
+ "\n\tEND";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
@@ -28,10 +28,8 @@ public class SQLServerInsertTest extends TestCase {
String sql = "INSERT INTO Cities (Location)" + //
"VALUES ( CONVERT(Point, '12.3:46.2') );";
String expect = "INSERT INTO Cities" + //
"\n\t(Location)" + //
"\nVALUES" + //
"\n(CONVERT(Point, '12.3:46.2'))";
String expect = "INSERT INTO Cities (Location)" + //
"\nVALUES (CONVERT(Point, '12.3:46.2'))";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
@@ -28,10 +28,8 @@ public class SQLServerInsertTest1 extends TestCase {
String sql = "INSERT INTO Cities (Location)" +
"VALUES ( dbo.CreateNewPoint(x, y) );";
String expect = "INSERT INTO Cities" + //
"\n\t(Location)" + //
"\nVALUES" + //
"\n(dbo.CreateNewPoint(x, y))";
String expect = "INSERT INTO Cities (Location)" + //
"\nVALUES (dbo.CreateNewPoint(x, y))";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
@@ -29,10 +29,8 @@ public class SQLServerInsertTest2 extends TestCase {
String sql = "INSERT INTO test (name)" + //
"VALUES (N'a'), (N'b'), (N'c')";
String expect = "INSERT INTO test" + //
"\n\t(name)" + //
"\nVALUES" + //
"\n(N'a')," + //
String expect = "INSERT INTO test (name)" + //
"\nVALUES (N'a')," + //
"\n(N'b')," + //
"\n(N'c')";
@@ -29,8 +29,7 @@ public class SQLServerInsertTest3 extends TestCase {
"VALUES (N'F2', N'Square Feet', GETDATE());;";
String expect = "INSERT INTO Production.UnitMeasure" + //
"\nVALUES" + //
"\n(N'F2', N'Square Feet', GETDATE())";
"\nVALUES (N'F2', N'Square Feet', GETDATE())";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
@@ -48,9 +48,8 @@ public class SQLServerInsertTest5 extends TestCase {
SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor();
stmt.accept(visitor);
String formatSql = "INSERT INTO t"//
+ "\n\t(a, b)"//
+ "\nVALUES" + "\n('a1', 'b1'),"//
String formatSql = "INSERT INTO t (a, b)"//
+ "\nVALUES ('a1', 'b1'),"//
+ "\n('a2', 'b2'),"//
+ "\n('a3', 'b3')";
Assert.assertEquals(formatSql, SQLUtils.toSQLServerString(insertStmt));
@@ -74,10 +73,8 @@ public class SQLServerInsertTest5 extends TestCase {
SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor();
stmt.accept(visitor);
String formatSql = "INSERT INTO t"//
+ "\n\t(a, b)"//
+ "\nVALUES"//
+ "\n('a1', 'b1'),"//
String formatSql = "INSERT INTO t (a, b)"//
+ "\nVALUES ('a1', 'b1'),"//
+ "\n('a2', 'b2'),"//
+ "\n('a3', 'b3'),"//
+ "\n('a4', 'b4')";
@@ -48,10 +48,8 @@ public class SQLServerInsertTest6 extends TestCase {
SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor();
stmt.accept(visitor);
String formatSql = "INSERT INTO [dbo].[SurveyAnswer]"//
+ "\n\t([CustomerId], [QuestionId], [OptionId], [CreateTime], [LastUpdateTime])"//
+ "\nVALUES" //
+ "\n(@0, @1, @2, @3, @4)";
String formatSql = "INSERT INTO [dbo].[SurveyAnswer] ([CustomerId], [QuestionId], [OptionId], [CreateTime], [LastUpdateTime])"//
+ "\nVALUES (@0, @1, @2, @3, @4)";
Assert.assertEquals(formatSql, SQLUtils.toSQLServerString(insertStmt));
}
@@ -51,8 +51,7 @@ public class SQLServerInsertTest8 extends TestCase {
String formatSql = "INSERT INTO Production.ScrapReason"//
+ "\nOUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate"//
+ "\n\tINTO @MyTableVar"//
+ "\nVALUES"//
+ "\n(N'Operator error', GETDATE())";
+ "\nVALUES (N'Operator error', GETDATE())";
Assert.assertEquals(formatSql, SQLUtils.toSQLServerString(insertStmt));
}