From 3be4bf53352a6dff27076581f234ecb6d53b0465 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 15 Oct 2011 01:48:43 +0000 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=B5=8B=E8=AF=95=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E4=BF=AE=E6=AD=A3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@966 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../oracle/parser/OracleExprParser.java | 2 +- .../oracle/visitor/OracleOutputVisitor.java | 26 ++++++----- ...iteralTest.java => OracleLiteralTest.java} | 3 +- .../druid/bvt/sql/oracle/OraclePriorTest.java | 46 +++++++++++++++++++ 4 files changed, 62 insertions(+), 15 deletions(-) rename src/test/java/com/alibaba/druid/bvt/sql/oracle/{OracleIsLiteralTest.java => OracleLiteralTest.java} (88%) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OraclePriorTest.java 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); + } +}