mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
增强Parser
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@132 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
+5
-2
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user