From 10ad8df0149c58158b9e92ae0e1773b397a51ccb Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 15 Oct 2011 10:09:13 +0000 Subject: [PATCH] subquery factoring git-svn-id: http://code.alibabatech.com/svn/druid/trunk@981 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../oracle/parser/OracleSelectParser.java | 2 +- .../oracle/OracleSubqueryFactoringTest2.java | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java 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 dd7dff65f8..0a093a0589 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 @@ -137,7 +137,7 @@ public class OracleSelectParser extends SQLSelectParser { createExprParser().exprList(cycleClause.getAliases()); accept(Token.SET); cycleClause.setMark(createExprParser().expr()); - acceptIdentifier("TO"); + accept(Token.TO); cycleClause.setValue(createExprParser().expr()); accept(Token.DEFAULT); cycleClause.setDefaultValue(createExprParser().expr()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java new file mode 100644 index 0000000000..2e4183eee2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java @@ -0,0 +1,59 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.test.TestUtils; + +public class OracleSubqueryFactoringTest2 extends TestCase { + + public void test_interval() throws Exception { + String sql = "WITH org_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id) AS\n" + + "(\n" + + "SELECT employee_id, last_name, manager_id, 0 reportLevel, salary, job_id\n" + + "FROM employees\n" + + "WHERE manager_id is null\n" + + "UNION ALL\n" + + "SELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel+1 reportLevel, e.salary, e.job_id\n" + + "FROM org_chart r, employees e\n" + + "WHERE r.eid = e.manager_id\n" + + ")\n" + + "SEARCH DEPTH FIRST BY emp_last SET order1\n" + + "CYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'" + + "SELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, salary, job_id\n" + + "FROM org_chart\n" + + "ORDER BY order1;\n"; + + String expected = "WITH\n" + + "\torg_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id)\n" + + "\tAS\n" + + "\t(\n" + + "\t\tSELECT employee_id, last_name, manager_id, 0 AS reportLevel, salary\n" + + "\t\t\t, job_id\n" + + "\t\tFROM employees\n" + + "\t\tWHERE manager_id IS NULL\n" + + "\t\tUNION ALL\n" + + "\t\tSELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel + 1 AS reportLevel, e.salary\n" + + "\t\t\t, e.job_id\n" + + "\t\tFROM org_chart r, employees e\n" + + "\t\tWHERE r.eid = e.manager_id\n" + + "\t)\n" + + "\tSEARCH DEPTH FIRST BY emp_last SET order1\n" + + "\tCYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\n" + + "SELECT lpad(' ', 2 * reportLevel) || emp_last AS emp_name, eid, mgr_id, salary, job_id\n" + + "FROM org_chart\n" + + "ORDER BY order1;\n"; + + OracleStatementParser parser = new OracleStatementParser(sql); + SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); + + String text = TestUtils.outputOracle(stmt); + + Assert.assertEquals(expected, text); + + System.out.println(text); + } + +}