mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor sql parser.
This commit is contained in:
@@ -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());;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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" +
|
||||
|
||||
Reference in New Issue
Block a user