bug fixed for schema stat. for issue #2422

This commit is contained in:
wenshao
2018-03-22 21:53:08 +08:00
parent 23e68d13cb
commit d6812d290e
3 changed files with 79 additions and 0 deletions
@@ -747,6 +747,19 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
return new Column("UNKNOWN", column);
}
if (expr instanceof SQLMethodInvokeExpr) {
SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr;
List<SQLExpr> arguments = methodInvokeExpr.getParameters();
long nameHash = methodInvokeExpr.methodNameHashCode64();
if (nameHash == FnvHash.Constants.DATE_FORMAT) {
if (arguments.size() == 2
&& arguments.get(0) instanceof SQLName
&& arguments.get(1) instanceof SQLCharExpr) {
return getColumn(arguments.get(0));
}
}
}
return null;
}
@@ -640,5 +640,6 @@ public final class FnvHash {
long KEY_BLOCK_SIZE = fnv1a_64_lower("KEY_BLOCK_SIZE");
long CHECKSUM = fnv1a_64_lower("CHECKSUM");
long ROUTINE = fnv1a_64_lower("ROUTINE");
long DATE_FORMAT = fnv1a_64_lower("DATE_FORMAT");
}
}
@@ -0,0 +1,65 @@
package com.alibaba.druid.bvt.sql.schemaStat;
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.repository.SchemaRepository;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
public class SchemaStatTest16 extends TestCase {
public void test_schemaStat() throws Exception {
SchemaRepository repository = new SchemaRepository(JdbcConstants.MYSQL);
String sql = "SELECT\n" +
"\tid AS id,\n" +
"\tactivity_code AS activityCode,\n" +
"\tactivity_name AS activityName,\n" +
"\tstart_time AS startTime,\n" +
"\tend_time AS endTime,\n" +
"\t`state`,\n" +
"\tbonus_type AS bonusType,\n" +
"\tsend_num AS sendNum,\n" +
"\tpoints,\n" +
"\texchange_flag AS exchangeFlag,\n" +
"\texchange_points AS exchangePoints,\n" +
"\tauth_code_key AS authCodeKey,\n" +
"\tauth_code_key_repeat AS authCodeKeyRepeat,\n" +
"\t`type`,\n" +
"\tmobile_flag AS mobileFlag,\n" +
"\tactivity_code_list AS activityCodeList,\n" +
"\tregister_product_id AS registerProductId,\n" +
"\tadd_user AS addUser,\n" +
"\tadd_time AS addTime,\n" +
"\tmod_user AS modUser,\n" +
"\tdelete_flag AS deleteFlag\n" +
"FROM\n" +
"\ttb_activity\n" +
"WHERE\n" +
"\tid != 1\n" +
"AND id NOT IN (1, 2)\n" +
"and DATE_FORMAT(add_time, '%Y-%m-%d') = '2018-08-08';";
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcConstants.MYSQL);
SQLStatement stmt = parser.parseStatementList().get(0);
SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL);
stmt.accept(statVisitor);
System.out.println("Tables : " + statVisitor.getTables());
System.out.println(statVisitor.getColumns());
// System.out.println(statVisitor.getGroupByColumns()); // group by
System.out.println("relationships : " + statVisitor.getRelationships()); // group by
System.out.println(statVisitor.getConditions());
assertEquals(21, statVisitor.getColumns().size());
assertEquals(3, statVisitor.getConditions().size());
assertEquals(1, statVisitor.getFunctions().size());
assertTrue(statVisitor.containsTable("tb_activity"));
assertTrue(statVisitor.containsColumn("tb_activity", "id"));
}
}