improved oracle pl/sql parser.

This commit is contained in:
wenshao
2017-05-12 01:56:39 +08:00
parent 9c971bc013
commit 46d738010c
6 changed files with 235 additions and 14 deletions
@@ -34,6 +34,9 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
private SQLStatement block;
private List<SQLParameter> parameters = new ArrayList<SQLParameter>();
// for oracle
private String javaCallSpec;
@Override
public void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
@@ -66,6 +69,9 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
}
public void setBlock(SQLStatement block) {
if (block != null) {
block.setParent(this);
}
this.block = block;
}
@@ -92,4 +98,12 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
public void setCreate(boolean create) {
this.create = create;
}
public String getJavaCallSpec() {
return javaCallSpec;
}
public void setJavaCallSpec(String javaCallSpec) {
this.javaCallSpec = javaCallSpec;
}
}
@@ -18,12 +18,7 @@ package com.alibaba.druid.sql.dialect.oracle.parser;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLParameter;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
@@ -1062,8 +1057,10 @@ public class OracleStatementParser extends SQLStatementParser {
if (lexer.token() == Token.DECLARE) {
lexer.nextToken();
}
parserParameters(block.getParameters());
if (lexer.token() == Token.IDENTIFIER) {
parserParameters(block.getParameters(), block);
for (SQLParameter param : block.getParameters()) {
param.setParent(block);
}
@@ -1078,7 +1075,7 @@ public class OracleStatementParser extends SQLStatementParser {
return block;
}
private void parserParameters(List<SQLParameter> parameters) {
private void parserParameters(List<SQLParameter> parameters, SQLObject parent) {
for (;;) {
SQLParameter parameter = new SQLParameter();
@@ -1591,7 +1588,7 @@ public class OracleStatementParser extends SQLStatementParser {
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
parserParameters(stmt.getParameters());
parserParameters(stmt.getParameters(), stmt);
accept(Token.RPAREN);
}
@@ -1601,6 +1598,20 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.AS);
}
if (identifierEquals("LANGUAGE")) {
lexer.nextToken();
if (identifierEquals("JAVA")) {
lexer.nextToken();
acceptIdentifier("NAME");
String javaCallSpec = lexer.stringVal();
accept(Token.LITERAL_CHARS);
stmt.setJavaCallSpec(javaCallSpec);
} else {
throw new ParserException("TODO : " + lexer.info());
}
return stmt;
}
SQLBlockStatement block = this.parseBlock();
stmt.setBlock(block);
@@ -1355,9 +1355,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
@Override
public boolean visit(SQLBlockStatement x) {
if (x.getParameters().size() != 0) {
print0(ucase ? "DECLARE" : "declare");
incrementIndent();
println();
if (!(x.getParent() instanceof SQLCreateProcedureStatement)) {
print0(ucase ? "DECLARE" : "declare");
println();
}
for (int i = 0, size = x.getParameters().size(); i < size; ++i) {
if (i != 0) {
@@ -2542,14 +2544,30 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print(')');
}
SQLStatement block = x.getBlock();
if (!create) {
println();
println("IS");
} else {
println();
if (block instanceof SQLBlockStatement) {
SQLBlockStatement blockStatement = (SQLBlockStatement) block;
if (blockStatement.getParameters().size() > 0) {
println("AS");
}
}
}
x.getBlock().setParent(x);
x.getBlock().accept(this);
String javaCallSpec = x.getJavaCallSpec();
if (javaCallSpec != null) {
print0(ucase ? "LANGUAGE JAVA NAME '" : "language java name '");
print0(javaCallSpec);
print('\'');
return false;
}
block.accept(this);
return false;
}
@@ -1709,6 +1709,10 @@ public class SQLStatementParser extends SQLParser {
return parseCreateView();
} else if (token == Token.TRIGGER) {
return parseCreateTrigger();
} else if (token == Token.PROCEDURE) {
SQLCreateProcedureStatement stmt = parseCreateProcedure();
stmt.setCreate(true);
return stmt;
}
throw new ParserException("TODO " + lexer.token());
@@ -1791,7 +1795,7 @@ public class SQLStatementParser extends SQLParser {
return stmt;
}
public SQLStatement parseCreateProcedure() {
public SQLCreateProcedureStatement parseCreateProcedure() {
throw new ParserException("TODO " + lexer.token());
}