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 0ef015339c..85f8b7a796 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 @@ -332,7 +332,7 @@ public class OracleExprParser extends SQLExprParser { lexer.nextToken(); - if (identifierEquals("SIBINGS")) { + if (identifierEquals("SIBLINGS")) { lexer.nextToken(); orderBy.setSibings(true); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index ad006a9b9a..9e74180520 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -359,10 +359,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } public boolean visit(OracleSelectHierachicalQueryClause x) { - print("START WITH "); - x.getStartWith().accept(this); + if (x.getStartWith() != null) { + print("START WITH "); + x.getStartWith().accept(this); + println(); + } - println(); print("CONNECT BY "); if (x.isPrior()) { @@ -1325,19 +1327,19 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(opt.name); } } - + if (x.getIterate() != null) { print(" ITERATE ("); x.getIterate().accept(this); print(")"); - + if (x.getUntil() != null) { print(" UNTIL ("); x.getUntil().accept(this); print(")"); } } - + print(" ("); printAndAccept(x.getCellAssignmentItems(), ", "); print(")"); @@ -1356,23 +1358,23 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(x.getOption().name); print(" "); } - + x.getCellAssignment().accept(this); - + if (x.getOrderBy() != null) { print(" "); x.getOrderBy().accept(this); } - + print(" = "); x.getExpr().accept(this); - + return false; } @Override public void endVisit(CellAssignmentItem x) { - + } @Override @@ -1386,6 +1388,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(CellAssignment x) { - + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIsLiteralTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleLiteralTest.java similarity index 88% rename from src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIsLiteralTest.java rename to src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleLiteralTest.java index 6227627968..1d1dc9d6aa 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIsLiteralTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleLiteralTest.java @@ -5,10 +5,9 @@ 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.parser.SQLStatementParser; import com.alibaba.druid.sql.test.TestUtils; -public class OracleIsLiteralTest extends TestCase { +public class OracleLiteralTest extends TestCase { public void test_oracle() throws Exception { String sql = "SELECT FROM_TZ(TIMESTAMP '2007-11-20 08:00:00', '3:00') FROM DUAL;"; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePriorTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePriorTest.java new file mode 100644 index 0000000000..e7121832a8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePriorTest.java @@ -0,0 +1,46 @@ +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 OraclePriorTest extends TestCase { + + public void test_oracle() throws Exception { + String sql = "SELECT employee_id, last_name, manager_id FROM employees CONNECT BY PRIOR employee_id = manager_id;"; + + String expect = "SELECT employee_id, last_name, manager_id\n" + "FROM employees\n" + + "CONNECT BY PRIOR employee_id = manager_id;\n"; + + OracleStatementParser parser = new OracleStatementParser(sql); + SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); + + String text = TestUtils.outputOracle(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } + + public void test_oracle_2() throws Exception { + String sql = "SELECT last_name, employee_id, manager_id, LEVEL\n" + "FROM employees\n" + + "START WITH employee_id = 100\n" + "CONNECT BY PRIOR employee_id = manager_id\n" + + "ORDER SIBLINGS BY last_name;"; + + String expect = "SELECT last_name, employee_id, manager_id, LEVEL\n" + "FROM employees\n" + + "START WITH employee_id = 100\n" + "CONNECT BY PRIOR employee_id = manager_id\n" + + "ORDER SIBLINGS BY last_name;\n"; + + OracleStatementParser parser = new OracleStatementParser(sql); + SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); + + String text = TestUtils.outputOracle(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } +}