bug fixed for oracle sql parser

This commit is contained in:
温少
2012-03-02 12:30:44 +08:00
parent 9d9ceb37a3
commit a67026f478
12 changed files with 207 additions and 19 deletions
@@ -0,0 +1,35 @@
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleGotoStatement extends OracleStatementImpl {
private static final long serialVersionUID = 1L;
private SQLName label;
public OracleGotoStatement(){
}
public OracleGotoStatement(SQLName label){
this.label = label;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, label);
}
visitor.endVisit(this);
}
public SQLName getLabel() {
return label;
}
public void setLabel(SQLName label) {
this.label = label;
}
}
@@ -0,0 +1,35 @@
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleLabelStatement extends OracleStatementImpl {
private static final long serialVersionUID = 1L;
private SQLName label;
public OracleLabelStatement(){
}
public OracleLabelStatement(SQLName label){
this.label = label;
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, label);
}
visitor.endVisit(this);
}
public SQLName getLabel() {
return label;
}
public void setLabel(SQLName label) {
this.label = label;
}
}
@@ -266,6 +266,13 @@ public class OracleExprParser extends SQLExprParser {
}
public SQLExpr primaryRest(SQLExpr expr) throws ParserException {
if (lexer.token() == Token.DOTDOT) {
lexer.nextToken();
SQLExpr upBound = expr();
return new OracleRangeExpr(expr, upBound);
}
if (lexer.token() == Token.MONKEYS_AT) {
lexer.nextToken();
@@ -369,13 +376,6 @@ public class OracleExprParser extends SQLExprParser {
}
protected SQLExpr dotRest(SQLExpr expr) {
if (lexer.token() == Token.DOT) {
lexer.nextToken();
SQLExpr upBound = expr();
return new OracleRangeExpr(expr, upBound);
}
if (lexer.token() == Token.LITERAL_ALIAS) {
String name = '"' + lexer.stringVal() + '"';
lexer.nextToken();
@@ -135,6 +135,7 @@ public class OracleLexer extends Lexer {
map.put("LOOP", Token.LOOP);
map.put("IF", Token.IF);
map.put("ELSE", Token.ELSE);
map.put("GOTO", Token.GOTO);
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
}
@@ -307,6 +308,10 @@ public class OracleLexer extends Lexer {
boolean isDouble = false;
if (ch == '.') {
if (buf[bp + 1] == '.') {
token = Token.LITERAL_INT;
return;
}
sp++;
ch = buf[++bp];
isDouble = true;
@@ -57,9 +57,11 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
@@ -273,6 +275,25 @@ public class OracleStatementParser extends SQLStatementParser {
statementList.add(this.parseIf());
continue;
}
if (lexer.token() == Token.GOTO) {
lexer.nextToken();
SQLName label = this.exprParser.name();
OracleGotoStatement stmt = new OracleGotoStatement(label);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.LTLT) {
lexer.nextToken();
SQLName label = this.exprParser.name();
OracleLabelStatement stmt = new OracleLabelStatement(label);
accept(Token.GTGT);
statementList.add(stmt);
continue;
}
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
@@ -61,11 +61,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
@@ -1149,4 +1151,24 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleGotoStatement x) {
return true;
}
@Override
public void endVisit(OracleGotoStatement x) {
}
@Override
public boolean visit(OracleLabelStatement x) {
return true;
}
@Override
public void endVisit(OracleLabelStatement x) {
}
}
@@ -67,11 +67,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
@@ -505,4 +507,12 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(StorageItem x);
void endVisit(StorageItem x);
boolean visit(OracleGotoStatement x);
void endVisit(OracleGotoStatement x);
boolean visit(OracleLabelStatement x);
void endVisit(OracleLabelStatement x);
}
@@ -101,11 +101,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
@@ -2419,4 +2421,28 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public void endVisit(StorageItem x) {
}
@Override
public boolean visit(OracleGotoStatement x) {
print("GOTO ");
x.getLabel().accept(this);
return false;
}
@Override
public void endVisit(OracleGotoStatement x) {
}
@Override
public boolean visit(OracleLabelStatement x) {
print("<<");
x.getLabel().accept(this);
print(">>");
return false;
}
@Override
public void endVisit(OracleLabelStatement x) {
}
}
@@ -79,11 +79,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause;
@@ -1491,4 +1493,24 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
public void endVisit(StorageItem x) {
}
@Override
public boolean visit(OracleGotoStatement x) {
return false;
}
@Override
public void endVisit(OracleGotoStatement x) {
}
@Override
public boolean visit(OracleLabelStatement x) {
return false;
}
@Override
public void endVisit(OracleLabelStatement x) {
}
}
@@ -270,8 +270,12 @@ public class Lexer {
unscan();
scanNumber();
return;
} else if (ch == '.') {
scanChar();
token = Token.DOTDOT;
} else {
token = Token.DOT;
}
token = Token.DOT;
return;
case '\'':
scanString();
@@ -689,6 +693,10 @@ public class Lexer {
boolean isDouble = false;
if (ch == '.') {
if (buf[bp + 1] == '.') {
token = Token.LITERAL_INT;
return;
}
sp++;
ch = buf[++bp];
isDouble = true;
@@ -869,15 +877,15 @@ public class Lexer {
return result;
}
}
public int bp() {
return this.bp;
}
public char current() {
return this.ch;
}
public void reset(int mark, char mark_ch, Token token) {
this.bp = mark;
this.ch = mark_ch;
@@ -170,6 +170,7 @@ public enum Token {
EXCEPTION("EXCEPTION"),
GRANT("GRANT"),
LOOP("LOOP"),
GOTO("GOTO"),
// transact-sql
TOP("TOP"),
@@ -207,6 +208,7 @@ public enum Token {
SEMI(";"),
COMMA(","),
DOT("."),
DOTDOT(".."),
EQ("="),
GT(">"),
LT("<"),