refactor sql parser.

This commit is contained in:
wenshao
2017-08-28 01:26:21 +08:00
parent a983b2685b
commit 833a9b5a65
91 changed files with 2964 additions and 1368 deletions
@@ -29,8 +29,8 @@ public class MySqlInsertBenchmark_2 extends TestCase {
System.out.println(sql);
for (int i = 0; i < 5; ++i) {
// perf(); // 5043
// perf_toString(); // 2101
perf_toString_featured();
perf_toString(); // 2101
// perf_toString_featured(); // 7493
}
}
@@ -70,7 +70,7 @@ public class MySqlInsertBenchmark_2 extends TestCase {
public void perf_toString_featured() {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
for (int i = 0; i < 1000 * 1000 * 10; ++i) {
SQLUtils.toMySqlString(stmtList.get(0), VisitorFeature.OutputUseInsertValueClauseOriginalString);
}
long millis = System.currentTimeMillis() - startMillis;
@@ -2,8 +2,13 @@ package com.alibaba.druid.benckmark.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.repository.SchemaRepository;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import org.junit.Test;
@@ -18,14 +23,24 @@ public class MySqlParameterizedBenchmark extends TestCase {
String sql = "select id as id, gmt_create as gmtCreate, gmt_modified as gmtModified, name as name, owner as owner, type as type, statement as statement, datasource as datasource, meta as meta, param_file as paramFile, sharable as sharable, data_type as dataType, status as status, config as config, project_id as projectId, plugins as plugins, field_compare as fieldCompare, field_ext as fieldExt, openx as openx from quark_s_dataset where id = 12569434";
String sql2 = "/* ///6ea6f232/ */select count(*) FROM (SELECT * FROM cluster_ins_mapping WHERE `engine` = 'MySQL' and `status`='Activation' GROUP BY ip,port ) a;";
String sql3 = "/* 0be5256b15035048614234260e129b/0.1//722b9d1a/ */ select count(*) from (SELECT message_id,employee_name,employee_id FROM tunning_overview where instance_info IS NOT NULL and instance_info = '11.179.218.9:3306' and gmt_modified >= '2017-08-23 00:00:00' and gmt_modified <= '2017-08-24 00:00:00' ) o join (SELECT message_id,index_advice_count,index_advice,gmt_created FROM tunning_task_detail where gmt_modified >= '2017-08-23 00:00:00' and gmt_modified <= '2017-08-24 00:00:00' and index_advice_count >= 0 and error_code='0000' ) t on o.message_id=t.message_id where o.employee_name!='system' or ( o.employee_name='system' and t.index_advice_count>0);";
String sql4 = "UPDATE ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 "
+ "`table_3966` AS `table_3966_11` SET `version` = `version` + 3, `gmt_modified` = NOW(), `optype` = ?, `feature` = ? "
+ "WHERE `sub_biz_order_id` = ? AND `biz_order_type` = ? AND `id` = ? AND `ti_id` = ? AND `optype` = ? AND `root_id` = ?";
for (int i = 0; i < 5; ++i) {
// perf(sql); // 6740 6201 4752 4514
// perf(sql2); // 2948 2928 2869 2780 2502
perf(sql3); // 15093 10392 10416 10154 10007 9126 8907
// perf_parse(sql); // 4643 4377 4345 3801 3627 3228
// perf(sql3); // 15093 10392 10416 10154 10007 9126 8907
// perf(sql4); // 4429 4190 4023 3747
// perf_parse(sql); // 4643 4377 4345 3801 3627 3228 2961
// perf_parse(sql2); // 1918 1779 1666 1646
// perf_parse(sql3); // 9174 5875 5805 5536
// perf_parse(sql3); // 9174 5875 5805 5536 5717
// perf_parse(sql4); // 2953 2502
perf_stat(sql); // 11793 13628 13561 13259
// perf_resolve(sql); // 4970 4586
}
}
public void perf(String sql) {
@@ -46,4 +61,29 @@ public class MySqlParameterizedBenchmark extends TestCase {
System.out.println("millis : " + millis);
}
public void perf_stat(String sql) {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
SqlHolder holder = SqlHolder.of(sql);
holder.ensureParsed();
//new SchemaRepository(JdbcConstants.MYSQL).resolve(holder.ast);
SQLASTVisitor visitor = new MySqlSchemaStatVisitor();
holder.ast.accept(visitor);
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
public void perf_resolve(String sql) {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
SqlHolder holder = SqlHolder.of(sql);
holder.ensureParsed();
new SchemaRepository(JdbcConstants.MYSQL).resolve(holder.ast);
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
}
@@ -8,6 +8,8 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLParserFeature;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
@@ -23,7 +25,7 @@ public class SqlHolder {
private String dialect;
private boolean parsed;
private SQLStatement ast;
public SQLStatement ast;
public static SqlHolder of(String sql) {
return new SqlHolder(sql);
@@ -113,4 +115,100 @@ public class SqlHolder {
params = StringUtils.replace(params, "\"", "\\\"");
return params;
}
public String getSqlItems(String db) {
Map<String, LinkedHashSet<String>> itemMap = new HashMap<String, LinkedHashSet<String>>();
try {
SchemaStatVisitor schemaStatVisitor = new MySqlSchemaStatVisitor();
ast.accept(schemaStatVisitor);
List<TableStat.Condition> conditionList = schemaStatVisitor.getConditions();
for (TableStat.Condition condition : conditionList) {
String tableName = condition.getColumn().getTable();
LinkedHashSet<String> condLinkedSet = itemMap.get(tableName);
if (condLinkedSet == null) {
condLinkedSet = new LinkedHashSet<String>();
itemMap.put(tableName, condLinkedSet);
}
TableStat.Column column = condition.getColumn();
String upperClnName = column.toString().toUpperCase();
String finalClnName = filterChar(db, upperClnName);
condLinkedSet.add(finalClnName);
}
} catch (Exception ex) {
}
if (itemMap.isEmpty())
return null;
StringBuilder resSb = new StringBuilder();
for (Map.Entry<String, LinkedHashSet<String>> entry : itemMap.entrySet()) {
resSb.append(StringUtils.join(entry.getValue(), ",")).append(",");
}
return resSb.substring(0, resSb.length() - 1);
}
public static String filterChar(String db, String name) {
String resName;
if (StringUtils.isNotBlank(name)) {
String[] names = name.split("\\.");
StringBuilder nameSb = new StringBuilder();
boolean isFirst = true;
int size = names.length;
int k = 0;
for (String n : names) {
String tempN = n;
if (n.startsWith("`") && n.endsWith("`")) {
tempN = n.substring(1, n.length() - 1);
}
if (k == size - 1) {
nameSb.append(tempN).append(".");
} else if (isFirst) {
if (!n.startsWith(db)) {
nameSb.append(convert(tempN)).append(".");
}
isFirst = false;
} else {
nameSb.append(convert(tempN)).append(".");
}
k++;
}
resName = nameSb.substring(0, nameSb.length() - 1);
} else {
resName = name;
}
return db + "." + resName;
}
public static String convert(String tableName) {
if (StringUtils.isBlank(tableName)) {
return tableName;
}
int len = tableName.length();
int k = -1;
int min = Math.min(4, len);
for (int i = 1; i <= min; i++) {
String ch = String.valueOf(tableName.charAt(len - i));
boolean isNum = StringUtils.isNumeric(ch);
if (isNum) {
k = i;
} else {
break;
}
}
if (k != -1) {
tableName = tableName.substring(0, len - k);
if (tableName.endsWith("_")) {
tableName = tableName.substring(0, tableName.length() - 1);
}
}
int idx = tableName.lastIndexOf("_");
if (idx == -1 || (tableName.length() - 1 == idx)) {
return tableName;
}
String num = tableName.substring(idx + 1);
boolean isNum = StringUtils.isNumeric(num);
if (isNum) {
return tableName.substring(0, idx);
}
return tableName;
}
}
@@ -0,0 +1,21 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import junit.framework.TestCase;
public class HashTest_0 extends TestCase {
public void test_issue() throws Exception {
assertEquals(new SQLIdentifierExpr("a").name_hash_lower()
, new SQLIdentifierExpr("A").name_hash_lower());;
}
public void test_issue_1() throws Exception {
assertEquals(new SQLIdentifierExpr("a").name_hash_lower()
, new SQLIdentifierExpr("`A`").name_hash_lower());;
}
public void test_issue_2() throws Exception {
assertEquals(new SQLIdentifierExpr("\"a\"").name_hash_lower()
, new SQLIdentifierExpr("`A`").name_hash_lower());;
}
}
@@ -0,0 +1,22 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import junit.framework.TestCase;
public class HashTest_1_propertyExpr extends TestCase {
public void test_issue() throws Exception {
assertEquals(new SQLPropertyExpr("t","a").name_hash_lower()
, new SQLPropertyExpr("t","A").name_hash_lower());;
}
public void test_issue_1() throws Exception {
assertEquals(new SQLPropertyExpr("t","a").name_hash_lower()
, new SQLPropertyExpr("t","`A`").name_hash_lower());;
}
public void test_issue_2() throws Exception {
assertEquals(new SQLPropertyExpr("t","\"a\"").name_hash_lower()
, new SQLPropertyExpr("t","`A`").name_hash_lower());;
}
}
@@ -58,7 +58,7 @@ public class MySqlCreateTableTest18 extends MysqlTest {
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
// System.out.println("orderBy : " + visitor.getOrderByColumns());
@@ -59,13 +59,17 @@ public class MySqlSelectTest_16 extends MysqlTest {
Assert.assertTrue(binaryWhere.getRight() instanceof SQLNotExpr);
}
// print(statementList);
Assert.assertEquals(1, statementList.size());
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
// System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(2, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
@@ -1,7 +1,5 @@
package com.alibaba.druid.bvt.sql.postgresql;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause;
@@ -19,8 +17,6 @@ public class PGASTVisitorAdapterTest extends TestCase {
new WindowClause().accept(adapter);
new FetchClause().accept(adapter);
new ForClause().accept(adapter);
new PGWithQuery().accept(adapter);
new PGWithClause().accept(adapter);
new PGDeleteStatement().accept(adapter);
new PGFunctionTableSource().accept(adapter);
}
@@ -41,7 +41,7 @@ public class PGDeleteTest5 extends PGTest {
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("films")));
@@ -44,12 +44,11 @@ public class PGDeleteTest6 extends PGTest {
// print(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("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products")));
@@ -48,17 +48,16 @@ public class PGDeleteTest8 extends PGTest {
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("parts")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("included_parts")));
Assert.assertTrue(visitor.getColumns().size() == 3);
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "sub_part")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("included_parts", "sub_part")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "sub_part")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "part")));
}
@@ -45,8 +45,8 @@ public class PGInsertTest5 extends PGTest {
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
stmt.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees_log")));
@@ -44,12 +44,12 @@ public class PGSelectTest13 extends PGTest {
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
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());
Assert.assertEquals(0, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getTables().size());
}
}
@@ -40,20 +40,20 @@ public class PGSelectTest14 extends PGTest {
PGSQLStatementParser parser = new PGSQLStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
SQLStatement stmt = statementList.get(0);
// print(statementList);
Assert.assertEquals(1, statementList.size());
assertEquals(1, statementList.size());
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
stmt.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertEquals(5, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getTables().size());
assertEquals(4, visitor.getColumns().size());
assertEquals(1, visitor.getTables().size());
}
}
@@ -39,20 +39,31 @@ public class PGSelectTest15 extends PGTest {
PGSQLStatementParser parser = new PGSQLStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
SQLStatement stmt = statementList.get(0);
// print(statementList);
Assert.assertEquals(1, statementList.size());
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
stmt.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
assertEquals("WITH RECURSIVE search_graph (id, link, data, depth) AS (\n" +
"\t\tSELECT g.id, g.link, g.data, 1\n" +
"\t\tFROM graph g\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT g.id, g.link, g.data, sg.depth + 1\n" +
"\t\tFROM graph g, search_graph sg\n" +
"\t\tWHERE g.id = sg.link\n" +
"\t)\n" +
"SELECT *\n" +
"FROM search_graph;", stmt.toString());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertEquals(7, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(5, visitor.getColumns().size());
Assert.assertEquals(1, visitor.getTables().size());
}
}
@@ -52,19 +52,19 @@ public class PGSelectTest16 extends PGTest {
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
assertEquals(9, visitor.getColumns().size());
assertEquals(2, visitor.getTables().size());
assertEquals(7, visitor.getColumns().size());
assertEquals(1, visitor.getTables().size());
assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "id")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "link")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "data")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("search_graph", "depth")));
// assertTrue(visitor.getColumns().contains(new TableStat.Column("search_graph", "depth")));
// assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "path")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("search_graph", "link")));
// assertTrue(visitor.getColumns().contains(new TableStat.Column("search_graph", "link")));
// assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "cycle")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("sg", "depth")));
assertTrue(visitor.getColumns().contains(new TableStat.Column("sg", "link")));
@@ -51,12 +51,12 @@ public class PGSelectTest17 extends PGTest {
PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
statemen.accept(visitor);
// System.out.println("Tables : " + visitor.getTables());
// System.out.println("fields : " + visitor.getColumns());
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertEquals(11, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(9, visitor.getColumns().size());
Assert.assertEquals(1, visitor.getTables().size());
}
}
@@ -40,33 +40,27 @@ public class PGSelectTest18 extends PGTest {
SQLStatement stmt = statementList.get(0);
{
String result = SQLUtils.toPGString(stmt);
Assert.assertEquals("WITH RECURSIVE "
+ "\n\tt (n)"
+ "\n\tAS"
+ "\n\t("
+ "\n\t\tSELECT 1"
+ "\n\t\tUNION ALL"
+ "\n\t\tSELECT n + 1"
+ "\n\t\tFROM t"
+ "\n\t)"
+ "\nSELECT n"
+ "\nFROM t"
+ "\nLIMIT 100;", result);
Assert.assertEquals("WITH RECURSIVE t (n) AS (\n" +
"\t\tSELECT 1\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT n + 1\n" +
"\t\tFROM t\n" +
"\t)\n" +
"SELECT n\n" +
"FROM t\n" +
"LIMIT 100;", result);
}
{
String result = SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("with recursive "
+ "\n\tt (n)"
+ "\n\tas"
+ "\n\t("
+ "\n\t\tselect 1"
+ "\n\t\tunion all"
+ "\n\t\tselect n + 1"
+ "\n\t\tfrom t"
+ "\n\t)"
+ "\nselect n"
+ "\nfrom t"
+ "\nlimit 100;", result);
Assert.assertEquals("with recursive t (n) as (\n" +
"\t\tselect 1\n" +
"\t\tunion all\n" +
"\t\tselect n + 1\n" +
"\t\tfrom t\n" +
"\t)\n" +
"select n\n" +
"from t\n" +
"limit 100;", result);
}
Assert.assertEquals(1, statementList.size());
@@ -78,8 +72,8 @@ public class PGSelectTest18 extends PGTest {
// System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
Assert.assertEquals(1, visitor.getColumns().size());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(0, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getTables().size());
}
}
@@ -59,10 +59,10 @@ public class PGSelectTest21 extends PGTest {
// print(statementList);
assertTrue(statemen instanceof PGSelectStatement);
assertTrue(((PGSelectStatement)statemen).getWith().getWithQuery().size()==1);
assertEquals(1, ((PGSelectStatement)statemen).getSelect().getWithSubQuery().getEntries().size());
StringBuffer sb = new StringBuffer();
((PGSelectStatement)statemen).getWith().getWithQuery().get(0).getName().output(sb);
assertTrue("a".equals(sb.toString()));
assertTrue(((PGSelectStatement)statemen).getWith().getWithQuery().get(0).getColumns().size()==2);
String alias = ((PGSelectStatement)statemen).getSelect().getWithSubQuery().getEntries().get(0).getAlias();
assertEquals("a", alias);
assertEquals(2, ((PGSelectStatement)statemen).getSelect().getWithSubQuery().getEntries().get(0).getColumns().size());
}
}
@@ -37,10 +37,7 @@ public class PGSelectTest49 extends TestCase {
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
SQLStatement stmt = stmtList.get(0);
assertEquals("WITH\n" +
"\tsel\n" +
"\tAS\n" +
"\t(\n" +
assertEquals("WITH sel AS (\n" +
"\t\tSELECT unnest(ARRAY[4275]) AS gdid, unnest(ARRAY[1]) AS gdnumber\n" +
"\t)\n" +
"UPDATE goods_detail\n" +
@@ -48,10 +45,7 @@ public class PGSelectTest49 extends TestCase {
"FROM sel\n" +
"WHERE gd_id = gdid;", SQLUtils.toPGString(stmt));
assertEquals("with\n" +
"\tsel\n" +
"\tas\n" +
"\t(\n" +
assertEquals("with sel as (\n" +
"\t\tselect unnest(ARRAY[4275]) as gdid, unnest(ARRAY[1]) as gdnumber\n" +
"\t)\n" +
"update goods_detail\n" +