mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for oracle sql parser
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
+22
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+22
@@ -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("<"),
|
||||
|
||||
Reference in New Issue
Block a user