From 214c5eb0963d64fec42938cd059ea48e655f0e40 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 19 May 2011 07:08:16 +0000 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BAParser?= 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@133 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../ast/stmt/OracleInsertStatement.java | 215 +----------------- .../oracle/ast/visitor/OracleASTVisitor.java | 25 -- .../ast/visitor/OracleOutputVisitor.java | 84 +------ .../oracle/parser/OracleExprParser.java | 10 +- .../oracle/parser/OracleInsertParser.java | 65 +----- .../druid/sql/parser/SQLStatementParser.java | 2 +- .../sql/oracle/bvt/OracleSQLParserTest.java | 4 +- 7 files changed, 22 insertions(+), 383 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java index 0aa97bfac9..649c8991c7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java @@ -15,217 +15,10 @@ */ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; -import java.util.ArrayList; -import java.util.List; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.sql.ast.SQLStatementImpl; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; -import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; +public class OracleInsertStatement extends SQLInsertStatement { + private static final long serialVersionUID = 1L; -public class OracleInsertStatement extends SQLStatementImpl { - - private static final long serialVersionUID = 1L; - - private final List hints = new ArrayList(); - private Insert insert; - - public OracleInsertStatement(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof OracleASTVisitor) { - accept0((OracleASTVisitor) visitor); - return; - } - super.accept0(visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.hints); - acceptChild(visitor, this.insert); - } - - visitor.endVisit(this); - } - - public OracleInsertStatement(Insert insert){ - - this.insert = insert; - } - - public List getHints() { - return this.hints; - } - - public Insert getInsert() { - return this.insert; - } - - public void setInsert(Insert insert) { - this.insert = insert; - } - - public static class IntoSubQuery extends OracleInsertStatement.InsertSource { - - private static final long serialVersionUID = 1L; - - public IntoSubQuery(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - visitor.visit(this); - - visitor.endVisit(this); - } - } - - public static class IntoValues extends OracleInsertStatement.InsertSource { - - private static final long serialVersionUID = 1L; - - private final List values = new ArrayList(); - - public IntoValues(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.values); - } - - visitor.endVisit(this); - } - - public List getValues() { - return this.values; - } - } - - public static abstract class InsertSource extends SQLObjectImpl { - - private static final long serialVersionUID = 1L; - - public InsertSource(){ - - } - } - - public static class Into extends SQLObjectImpl { - - private static final long serialVersionUID = 1L; - - private SQLExpr target; - private String alias; - private final List columns = new ArrayList(); - - public Into(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.target); - acceptChild(visitor, this.columns); - } - - visitor.endVisit(this); - } - - public SQLExpr getTarget() { - return this.target; - } - - public void setTarget(SQLExpr target) { - this.target = target; - } - - public String getAlias() { - return this.alias; - } - - public void setAlias(String alias) { - this.alias = alias; - } - - public List getColumns() { - return this.columns; - } - } - - public static class MultiTableInsert { - } - - public static class SigleTableInert extends OracleInsertStatement.Insert { - - private static final long serialVersionUID = 1L; - - private OracleInsertStatement.Into into; - private OracleInsertStatement.InsertSource source; - - public SigleTableInert(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.into); - acceptChild(visitor, this.source); - } - - visitor.endVisit(this); - } - - public OracleInsertStatement.Into getInto() { - return this.into; - } - - public void setInto(OracleInsertStatement.Into into) { - this.into = into; - } - - public OracleInsertStatement.InsertSource getSource() { - return this.source; - } - - public void setSource(OracleInsertStatement.InsertSource source) { - this.source = source; - } - } - - public static abstract class Insert extends SQLObjectImpl { - - private static final long serialVersionUID = 1L; - - public Insert(){ - - } - } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java index 8482cdb7d9..ffda4114c7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java @@ -40,7 +40,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRefDataType; @@ -135,18 +134,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleHint x); - void endVisit(OracleInsertStatement x); - - void endVisit(OracleInsertStatement.InsertSource x); - - void endVisit(OracleInsertStatement.Into x); - - void endVisit(OracleInsertStatement.IntoSubQuery x); - - void endVisit(OracleInsertStatement.IntoValues x); - - void endVisit(OracleInsertStatement.SigleTableInert x); - void endVisit(OracleIntervalExpr x); void endVisit(SQLObjectCreateExpr x); @@ -267,18 +254,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleHint x); - boolean visit(OracleInsertStatement x); - - boolean visit(OracleInsertStatement.InsertSource x); - - boolean visit(OracleInsertStatement.Into x); - - boolean visit(OracleInsertStatement.IntoSubQuery x); - - boolean visit(OracleInsertStatement.IntoValues x); - - boolean visit(OracleInsertStatement.SigleTableInert x); - boolean visit(OracleIntervalExpr x); boolean visit(SQLObjectCreateExpr x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java index b0c6d318a4..c30fdb3312 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java @@ -66,12 +66,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement.InsertSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement.Into; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement.IntoSubQuery; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement.IntoValues; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement.SigleTableInert; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRefDataType; @@ -382,40 +376,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - public boolean visit(OracleInsertStatement x) { - print("INSERT "); - printHints(x.getHints()); - x.getInsert().accept(this); - return false; - } - - public boolean visit(OracleInsertStatement.InsertSource x) { - throw new UnsupportedOperationException(); - } - - public boolean visit(OracleInsertStatement.Into x) { - print("INTO "); - x.getTarget().accept(this); - printAlias(x.getAlias()); - if (x.getColumns().size() > 0) { - print("("); - printAndAccept(x.getColumns(), ", "); - print(")"); - } - return false; - } - - public boolean visit(OracleInsertStatement.IntoSubQuery x) { - throw new UnsupportedOperationException(); - } - - public boolean visit(OracleInsertStatement.IntoValues x) { - print("VALUES ("); - printAndAccept(x.getValues(), ", "); - print(")"); - return false; - } - public boolean visit(OracleIntervalExpr x) { print("INTERVAL '"); print(x.getValue()); @@ -562,18 +522,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleSelectHierachicalQueryClause x) { print("START WITH "); x.getStartWith().accept(this); - + println(); print("CONNECT BY "); - + if (x.isPrior()) { print("PRIOR "); } - + if (x.isNoCycle()) { print("NOCYCLE "); } - + x.getConnectBy().accept(this); return false; @@ -1357,36 +1317,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public void endVisit(OracleInsertStatement x) { - - } - - @Override - public void endVisit(InsertSource x) { - - } - - @Override - public void endVisit(Into x) { - - } - - @Override - public void endVisit(IntoSubQuery x) { - - } - - @Override - public void endVisit(IntoValues x) { - - } - - @Override - public void endVisit(SigleTableInert x) { - - } - @Override public void endVisit(OracleIntervalExpr x) { @@ -1517,10 +1447,4 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - public boolean visit(OracleInsertStatement.SigleTableInert x) { - x.getInto().accept(this); - print(" "); - x.getSource().accept(this); - return false; - } } 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 3f1b88a156..6a9d485ba2 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 @@ -28,6 +28,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectOrderByItem; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; +import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; public class OracleExprParser extends SQLExprParser { @@ -67,7 +68,14 @@ public class OracleExprParser extends SQLExprParser { String name = ":" + lexer.numberString(); lexer.nextToken(); return new SQLVariantRefExpr(name); - } else{ + } else if (lexer.token() == Token.IDENTIFIER) { + String name = lexer.stringVal(); + if (name.startsWith("B")) { + lexer.nextToken(); + return new SQLVariantRefExpr(":" + name); + } + throw new ParserException("syntax error : " + lexer.token()); + } else { throw new ParserException("syntax error : " + lexer.token()); } default: diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleInsertParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleInsertParser.java index c3c7db3125..aab39b1b4b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleInsertParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleInsertParser.java @@ -15,12 +15,10 @@ */ package com.alibaba.druid.sql.dialect.oracle.parser; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLStatementParser; -import com.alibaba.druid.sql.parser.Token; public class OracleInsertParser extends SQLStatementParser { @@ -32,64 +30,7 @@ public class OracleInsertParser extends SQLStatementParser { super(lexer); } - public SQLStatement parseInsert() throws ParserException { - throw new ParserException("TODO"); - } - - public OracleInsertStatement parseOracleInsert() throws ParserException { - accept(Token.INSERT); - - OracleInsertStatement insertStatement = new OracleInsertStatement(); - - parseHints(insertStatement); - - if (lexer.token() == Token.INTO) { - OracleInsertStatement.SigleTableInert sigleTableInsert = new OracleInsertStatement.SigleTableInert(); - sigleTableInsert.setInto(parseInto()); - - if (lexer.token() == Token.VALUES) { - OracleInsertStatement.IntoValues values = new OracleInsertStatement.IntoValues(); - - lexer.nextToken(); - accept(Token.LPAREN); - this.exprParser.exprList(values.getValues()); - accept(Token.RPAREN); - - sigleTableInsert.setSource(values); - } - - if (identifierEquals("LOG")) { - throw new ParserException("TODO"); - } - - insertStatement.setInsert(sigleTableInsert); - } else { - if (lexer.token() == Token.ALL) { - throw new ParserException("TODO"); - } - throw new ParserException("syntax error"); - } - - return insertStatement; - } - - private OracleInsertStatement.Into parseInto() throws ParserException { - accept(Token.INTO); - - OracleInsertStatement.Into into = new OracleInsertStatement.Into(); - into.setTarget(this.exprParser.expr()); - into.setAlias(as()); - - if (lexer.token() == (Token.LPAREN)) { - lexer.nextToken(); - this.exprParser.exprList(into.getColumns()); - accept(Token.RPAREN); - } - - return into; - } - - private void parseHints(OracleInsertStatement parseInsert) throws ParserException { - if (lexer.token() == Token.HINT) throw new ParserException("TODO"); + protected SQLExprParser createExprParser() { + return new OracleExprParser(lexer); } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 98fa3bccdc..29b096cda4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -153,7 +153,7 @@ public class SQLStatementParser extends SQLParser { insertStatement.setValues(values); accept(Token.RPAREN); } else if (lexer.token() == (Token.SELECT)) { - SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); + SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr(); insertStatement.setQuery(queryExpr); } return insertStatement; diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserTest.java index 53efa101d9..7a3bd62eeb 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserTest.java @@ -11,13 +11,11 @@ import junit.framework.TestCase; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.oracle.ast.visitor.OracleOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.Token; import com.alibaba.druid.util.JdbcUtils; public class OracleSQLParserTest extends TestCase { - public void test_1() throws Exception { + public void f_test_1() throws Exception { InputStream is = null; is = Thread.currentThread().getContextClassLoader().getResourceAsStream("bvt/parser/oracle-0.txt");