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 399a8ab6e5..77975b0a97 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 @@ -350,6 +350,11 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); joinType = OracleSelectJoin.JoinType.JOIN; } + + if (lexer.token() == (Token.COMMA)) { + lexer.nextToken(); + joinType = OracleSelectJoin.JoinType.COMMA; + } if (joinType != null) { OracleSelectJoin join = new OracleSelectJoin(); @@ -369,7 +374,7 @@ public class OracleSelectParser extends SQLSelectParser { return join; } - + return tableSource; } diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java index cfa593ba44..bc5b7aefb9 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java @@ -16,51 +16,19 @@ import com.alibaba.druid.util.JdbcUtils; public class OracleSQLParserResourceTest extends TestCase { public void test_0() throws Exception { - InputStream is = null; - - is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-0.txt"); - Reader reader = new InputStreamReader(is); - String input = JdbcUtils.read(reader); - JdbcUtils.close(reader); - String[] items = input.split("---------------------------"); - String sql = items[0].trim(); - String expect = items[1].trim(); - - OracleStatementParser parser = new OracleStatementParser(sql); - List statementList = parser.parseStatementList(); - - Assert.assertEquals(1, statementList.size()); - - String text = output(statementList); - Assert.assertEquals(expect, text.trim()); - System.out.println(text); + exec_test("bvt/parser/oracle-0.txt"); + exec_test("bvt/parser/oracle-1.txt"); + exec_test("bvt/parser/oracle-2.txt"); + exec_test("bvt/parser/oracle-3.txt"); + exec_test("bvt/parser/oracle-4.txt"); + exec_test("bvt/parser/oracle-5.txt"); } - public void test_1() throws Exception { - InputStream is = null; - - is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-0.txt"); - Reader reader = new InputStreamReader(is); - String input = JdbcUtils.read(reader); - JdbcUtils.close(reader); - String[] items = input.split("---------------------------"); - String sql = items[0].trim(); - String expect = items[1].trim(); - - OracleStatementParser parser = new OracleStatementParser(sql); - List statementList = parser.parseStatementList(); - - Assert.assertEquals(1, statementList.size()); - - String text = output(statementList); - Assert.assertEquals(expect, text.trim()); - System.out.println(text); - } - public void test_2() throws Exception { + public void exec_test(String resource) throws Exception { InputStream is = null; - is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-0.txt"); + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); Reader reader = new InputStreamReader(is); String input = JdbcUtils.read(reader); JdbcUtils.close(reader); @@ -74,8 +42,9 @@ public class OracleSQLParserResourceTest extends TestCase { Assert.assertEquals(1, statementList.size()); String text = output(statementList); - Assert.assertEquals(expect, text.trim()); System.out.println(text); + Assert.assertEquals(expect, text.trim()); + } private String output(List stmtList) { diff --git a/src/test/resources/bvt/parser/oracle-2.txt b/src/test/resources/bvt/parser/oracle-2.txt index b76f02771c..f5cc399f82 100644 --- a/src/test/resources/bvt/parser/oracle-2.txt +++ b/src/test/resources/bvt/parser/oracle-2.txt @@ -1,7 +1,7 @@ -SELECT employee_id FROM (SELECT * FROM employees) - FOR UPDATE OF employee_id; +SELECT employee_id FROM (SELECT employee_id+1 AS employee_id FROM employees) + FOR UPDATE; --------------------------- SELECT employee_id -FROM (SELECT * +FROM (SELECT employee_id + 1 AS employee_id FROM employees) -FOR UPDATE(employee_id); +FOR UPDATE; diff --git a/src/test/resources/bvt/parser/oracle-3.txt b/src/test/resources/bvt/parser/oracle-3.txt new file mode 100644 index 0000000000..f5cc399f82 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-3.txt @@ -0,0 +1,7 @@ +SELECT employee_id FROM (SELECT employee_id+1 AS employee_id FROM employees) + FOR UPDATE; +--------------------------- +SELECT employee_id +FROM (SELECT employee_id + 1 AS employee_id + FROM employees) +FOR UPDATE; diff --git a/src/test/resources/bvt/parser/oracle-4.txt b/src/test/resources/bvt/parser/oracle-4.txt new file mode 100644 index 0000000000..91b5dc2cb0 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-4.txt @@ -0,0 +1,9 @@ +SELECT * + FROM employees + WHERE department_id = 30 + ORDER BY last_name; +--------------------------- +SELECT * +FROM employees +WHERE department_id = 30 +ORDER BY last_name; \ No newline at end of file diff --git a/src/test/resources/bvt/parser/oracle-5.txt b/src/test/resources/bvt/parser/oracle-5.txt new file mode 100644 index 0000000000..b51da97529 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-5.txt @@ -0,0 +1,17 @@ +SELECT a.department_id "Department", + a.num_emp/b.total_count "%_Employees", + a.sal_sum/b.total_sal "%_Salary" +FROM +(SELECT department_id, COUNT(*) num_emp, SUM(salary) sal_sum + FROM employees + GROUP BY department_id) a, +(SELECT COUNT(*) total_count, SUM(salary) total_sal + FROM employees) b +ORDER BY a.department_id; +--------------------------- +SELECT a.department_id AS 'department_id', a.num_emp / b.total_count AS 'total_count', a.sal_sum / b.total_sal AS 'total_sal' +FROM (SELECT department_id, COUNT(*) AS 'num_emp', SUM(salary) AS 'sal_sum' + FROM employees + GROUP BY department_id) 'a' , (SELECT COUNT(*) AS 'total_count', SUM(salary) AS 'total_sal' + FROM employees) 'b' +ORDER BY a.department_id; \ No newline at end of file