diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index a6a8075410..ad6967f524 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -142,6 +142,7 @@ public class OracleLexer extends Lexer { map.put("COMMIT", Token.COMMIT); map.put("ROLLBACK", Token.ROLLBACK); map.put("SAVEPOINT", Token.SAVEPOINT); + map.put("CROSS", Token.CROSS); DEFAULT_ORACLE_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index a5e373d9ab..dcad30fe22 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -909,6 +909,11 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.JOIN); joinType = OracleSelectJoin.JoinType.INNER_JOIN; } + if (lexer.token() == Token.CROSS) { + lexer.nextToken(); + accept(Token.JOIN); + joinType = OracleSelectJoin.JoinType.CROSS_JOIN; + } if (lexer.token() == Token.JOIN) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 66aa69b055..eed79cabdf 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -175,6 +175,7 @@ public enum Token { COMMIT("COMMIT"), ROLLBACK("ROLLBACK"), SAVEPOINT("SAVEPOINT"), + CROSS("CROSS"), // transact-sql TOP("TOP"), diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest35.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest35.java new file mode 100644 index 0000000000..b717df559d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest35.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +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.stat.TableStat; + +public class OracleSelectTest35 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select typefuncti0_.id as id104_, typefuncti0_.function_id as function2_104_, " + // + "typefuncti0_.in_container as in3_104_, typefuncti0_.inherited as inherited104_," + // + "typefuncti0_.overriding as overriding104_, typefuncti0_.sn as sn104_, " + // + "typefuncti0_.type_id as type7_104_ from com_function_ontype typefuncti0_ cross " + // + " join com_function function1_ where typefuncti0_.function_id=function1_.id " + // + "and (typefuncti0_.type_id in (? , ? , ? , ?)) and function1_.code=?"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("com_function_ontype"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("com_function"))); + + Assert.assertEquals(9, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}