增强Parser

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@132 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-19 06:52:32 +00:00
parent 6311c67f54
commit d9776a1530
13 changed files with 215 additions and 41 deletions
@@ -560,6 +560,10 @@ 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()) {
@@ -571,8 +575,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
x.getConnectBy().accept(this);
print(" START WITH ");
x.getStartWith().accept(this);
return false;
}
@@ -15,8 +15,10 @@
*/
package com.alibaba.druid.sql.dialect.oracle.parser;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
@@ -55,6 +57,24 @@ public class OracleExprParser extends SQLExprParser {
return false;
}
public SQLExpr primary() throws ParserException {
final Token tok = lexer.token();
switch (tok) {
case COLON:
lexer.nextToken();
if (lexer.token() == Token.LITERAL_INT) {
String name = ":" + lexer.numberString();
lexer.nextToken();
return new SQLVariantRefExpr(name);
} else{
throw new ParserException("syntax error : " + lexer.token());
}
default:
return super.primary();
}
}
@Override
public OracleOrderBy parseOrderBy() {
if (lexer.token() == (Token.ORDER)) {
@@ -15,7 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.oracle.parser;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
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;
@@ -32,7 +32,7 @@ public class OracleInsertParser extends SQLStatementParser {
super(lexer);
}
public SQLInsertStatement parseInsert() throws ParserException {
public SQLStatement parseInsert() throws ParserException {
throw new ParserException("TODO");
}
@@ -36,6 +36,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot;
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;
@@ -48,6 +49,10 @@ public class OracleSelectParser extends SQLSelectParser {
public OracleSelectParser(Lexer lexer){
super(lexer);
}
protected SQLExprParser createExprParser() {
return new OracleExprParser(lexer);
}
public OracleSelect select() {
OracleSelect select = new OracleSelect();
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateViewStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
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;
@@ -37,6 +38,10 @@ public class OracleStatementParser extends SQLStatementParser {
public OracleStatementParser(Lexer lexer){
super(lexer);
}
protected SQLExprParser createExprParser() {
return new OracleExprParser(lexer);
}
@Override
public void parseStatementList(List<SQLStatement> statementList) throws ParserException {
@@ -84,6 +84,7 @@ public class CharTypes {
whitespaceFlags['\t'] = true;
whitespaceFlags['\f'] = true;
whitespaceFlags['\b'] = true;
whitespaceFlags[160] = true; // 特别处理
}
/**
@@ -85,7 +85,7 @@ public class SQLStatementParser extends SQLParser {
}
if (lexer.token() == (Token.INSERT)) {
SQLInsertStatement insertStatement = parseInsert();
SQLStatement insertStatement = parseInsert();
statementList.add(insertStatement);
continue;
@@ -130,7 +130,7 @@ public class SQLStatementParser extends SQLParser {
}
}
public SQLInsertStatement parseInsert() {
public SQLStatement parseInsert() {
accept(Token.INSERT);
accept(Token.INTO);
@@ -102,7 +102,8 @@ public enum Token {
PRIOR("PRIOR"),
CONNECT("CONNECT"),
EOF, ERROR,
EOF,
ERROR,
IDENTIFIER,
HINT,
VARIANT,