From 89575d14de36323bd2cbf27b63470fc575feba3e Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 24 Aug 2016 15:18:41 +0800 Subject: [PATCH] bug fixed for oracle sql parser schemastat visitor --- .../oracle/parser/OracleExprParser.java | 6 +++- .../visitor/OracleSchemaStatVisitor.java | 14 +------- .../druid/sql/visitor/SchemaStatVisitor.java | 5 +-- .../bvt/sql/schemaStat/SchemaStatTest8.java | 36 +++++++++++++++++++ 4 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest8.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 3fa93cb33f..eaa334c035 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -512,7 +512,11 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() != Token.FROM) { SQLExpr trim_character = this.primary(); trim_character.setParent(methodExpr); - methodExpr.putAttribute("trim_character", trim_character); + if (trim_character instanceof SQLCharExpr) { + methodExpr.putAttribute("trim_character", trim_character); + } else { + methodExpr.getParameters().add(trim_character); + } } if (lexer.token() == Token.FROM) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index bebddcad19..f2b290607d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -498,19 +498,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleSelectJoin x) { - x.getLeft().accept(this); - x.getRight().accept(this); - - { - String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); - String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); - if (leftTable != null && leftTable.equals(rightTable)) { - x.putAttribute(ATTR_TABLE, leftTable); - } - } - if (x.getCondition() != null) { - x.getCondition().accept(this); - } + super.visit(x); for (SQLExpr item : x.getUsing()) { if (item instanceof SQLIdentifierExpr) { 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 4a44523836..fefba543b9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -736,8 +736,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLJoinTableSource x) { x.getLeft().accept(this); x.getRight().accept(this); - if (x.getCondition() != null) { - x.getCondition().accept(this); + SQLExpr condition = x.getCondition(); + if (condition != null) { + condition.accept(this); } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest8.java new file mode 100644 index 0000000000..abda4951e4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest8.java @@ -0,0 +1,36 @@ +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.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; +import org.junit.Assert; + +public class SchemaStatTest8 extends TestCase { + + public void test_schemaStat() throws Exception { + String sql = "SELECT * FROM AQLQCAT " + + "JOIN AQLQCATB " + + " ON AQLQCAT.ZZ = AQLQCATB.RR " + + " AND trim(AQLQCAT.BB) = AQLQCATB.DD " + + "WHERE AQLQCAT.MANDT = 'A0' " + + " AND AQLQCATB.NUM = 'A1'"; + + String dbType = JdbcConstants.ORACLE; + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + SQLStatement stmt = parser.parseStatementList().get(0); + + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); + stmt.accept(statVisitor); + +// System.out.println(statVisitor.getColumns()); +// System.out.println(statVisitor.getGroupByColumns()); // group by + System.out.println("relationships : " + statVisitor.getRelationships()); // group by + + Assert.assertEquals(6, statVisitor.getColumns().size()); + Assert.assertEquals(6, statVisitor.getConditions().size()); + } +}