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 4eb0b49079..fdb88d4f75 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -967,6 +967,19 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + if ("LEVEL".equalsIgnoreCase(ident)) { + SQLObject parent = x.getParent(); + if (parent instanceof SQLSelectItem) { + SQLObject parent2 = parent.getParent(); + if (parent2 instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) parent2; + if (queryBlock.getStartWith() != null || queryBlock.getConnectBy() != null) { + return false; + } + } + } + } + Column column = null; if (currentTable != null) { column = addColumn(currentTable, ident); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java index 216f716500..dfcd24b22a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java @@ -64,7 +64,7 @@ public class DB2SelectTest_hierarchical_1 extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(1, visitor.getTables().size()); - assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java index 12c21a73ac..c3c9071e5d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java @@ -58,7 +58,7 @@ public class OceanbaseSelectTest extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(1, visitor.getTables().size()); - assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java index 8febda0be2..774f74d38b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java @@ -64,7 +64,7 @@ public class OceanbaseSelectTest_hierarchical_1 extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(1, visitor.getTables().size()); - assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest16.java index 310ed806dc..caeaf5f1c1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest16.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest16.java @@ -17,27 +17,25 @@ package com.alibaba.druid.bvt.sql.oracle.select; import java.util.List; -import org.junit.Assert; - import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; public class OracleSelectTest16 extends OracleTest { public void test_0() throws Exception { String sql = "select privilege#,level from sysauth$ connect by grantee#=prior privilege# and privilege#>0 start with grantee#=:1 and privilege#>0"; // - OracleStatementParser parser = new OracleStatementParser(sql); - List statementList = parser.parseStatementList(); + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); SQLStatement statemen = statementList.get(0); print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); - OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); statemen.accept(visitor); System.out.println("Tables : " + visitor.getTables()); @@ -46,11 +44,11 @@ public class OracleSelectTest16 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + assertEquals(1, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sysauth$"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("sysauth$"))); - Assert.assertEquals(3, visitor.getColumns().size()); + assertEquals(2, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR")));