From d6812d290e5d4431e1a065212f237ab837b3a765 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 22 Mar 2018 21:53:08 +0800 Subject: [PATCH] bug fixed for schema stat. for issue #2422 --- .../druid/sql/visitor/SchemaStatVisitor.java | 13 ++++ .../java/com/alibaba/druid/util/FnvHash.java | 1 + .../bvt/sql/schemaStat/SchemaStatTest16.java | 65 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest16.java diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index a6b14aaf46..24608413d3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -747,6 +747,19 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return new Column("UNKNOWN", column); } + if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr; + List 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; } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 965b162c17..a8d233dfcb 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -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"); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest16.java new file mode 100644 index 0000000000..8f63c51956 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest16.java @@ -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")); + } +}