Revert "bug: 修复多处oracle与mysql解析sql 语法不正确"

This commit is contained in:
温绍锦
2020-11-07 20:00:56 +08:00
committed by GitHub
parent cefbbe54b9
commit 91490f2e7c
12 changed files with 144 additions and 248 deletions
@@ -39,7 +39,6 @@ public class MySqlLexer extends Lexer {
map.put("DUAL", Token.DUAL);
map.put("FALSE", Token.FALSE);
map.put("IF", Token.IF);
map.put("ELSEIF", Token.ELSEIF);
map.put("KILL", Token.KILL);
map.put("LIMIT", Token.LIMIT);
@@ -8818,24 +8818,28 @@ public class MySqlStatementParser extends SQLStatementParser {
this.parseStatementList(stmt.getStatements(), -1, stmt);
while (lexer.token() == Token.ELSEIF) {
while (lexer.token() == Token.ELSE) {
lexer.nextToken();
SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf();
elseIf.setCondition(this.exprParser.expr());
elseIf.setParent(stmt);
accept(Token.THEN);
this.parseStatementList(elseIf.getStatements(), -1, stmt);
stmt.getElseIfList().add(elseIf);
}
if(lexer.token() == Token.ELSE) {
lexer.nextToken();
SQLIfStatement.Else elseItem = new SQLIfStatement.Else();
this.parseStatementList(elseItem.getStatements(), -1, elseItem);
stmt.setElseItem(elseItem);
if (lexer.token() == Token.IF) {
lexer.nextToken();
SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf();
elseIf.setCondition(this.exprParser.expr());
elseIf.setParent(stmt);
accept(Token.THEN);
this.parseStatementList(elseIf.getStatements(), -1, elseIf);
stmt.getElseIfList().add(elseIf);
} else {
SQLIfStatement.Else elseItem = new SQLIfStatement.Else();
this.parseStatementList(elseItem.getStatements(), -1, elseItem);
stmt.setElseItem(elseItem);
break;
}
}
accept(Token.END);
@@ -9099,8 +9103,6 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlLeaveStatement leaveStmt = new MySqlLeaveStatement();
leaveStmt.setLabelName(exprParser.name().getSimpleName());
accept(Token.SEMI);
leaveStmt.setAfterSemi(true);
return leaveStmt;
}
@@ -9170,8 +9172,7 @@ public class MySqlStatementParser extends SQLStatementParser {
stmt.setSelect(select);
accept(Token.SEMI);
stmt.setAfterSemi(true);
return stmt;
}
@@ -9307,8 +9308,7 @@ public class MySqlStatementParser extends SQLStatementParser {
if (!(stmt.getSpStatement() instanceof SQLBlockStatement)) {
accept(Token.SEMI);
}
stmt.setAfterSemi(true);
return stmt;
}
@@ -4261,7 +4261,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSEIF " : "elseif ");
print0(ucase ? "ELSE IF " : "else if ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
this.indentCount++;
@@ -26,8 +26,6 @@ import java.util.List;
public class OracleExecuteImmediateStatement extends OracleStatementImpl {
private SQLExpr dynamicSql;
private boolean bulkCollect;
private final List<SQLArgument> arguments = new ArrayList<SQLArgument>();
@@ -88,14 +86,6 @@ public class OracleExecuteImmediateStatement extends OracleStatementImpl {
}
this.dynamicSql = dynamicSql;
}
public boolean isBulkCollect() {
return bulkCollect;
}
public void setBulkCollect(boolean bulkCollect) {
this.bulkCollect = bulkCollect;
}
public void setDynamicSql(String dynamicSql) {
this.setDynamicSql(new SQLCharExpr(dynamicSql));
@@ -49,8 +49,7 @@ public class OracleLexer extends Lexer {
map.put("GOTO", Token.GOTO);
map.put("IF", Token.IF);
map.put("ELSIF", Token.ELSIF);
map.put("RECORD", Token.RECORD);
map.put("LIMIT", Token.LIMIT);
map.put("LOOP", Token.LOOP);
map.put("MATCHED", Token.MATCHED);
@@ -168,9 +168,6 @@ public class OracleStatementParser extends SQLStatementParser {
SQLStatement stmt = parseBlock();
stmt.setParent(parent);
statementList.add(stmt);
if(parent instanceof SQLCreateTriggerStatement) {
return;
}
continue;
}
@@ -791,11 +788,7 @@ public class OracleStatementParser extends SQLStatementParser {
SQLExpr dyanmiacSql = this.exprParser.primary();
stmt.setDynamicSql(dyanmiacSql);
if (lexer.identifierEquals("BULK")) {
lexer.nextToken();
acceptIdentifier("COLLECT");
stmt.setBulkCollect(true);
}
if (lexer.token() == Token.INTO) {
lexer.nextToken();
@@ -905,7 +898,7 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.END);
accept(Token.LOOP);
accept(Token.SEMI);
stmt.setAfterSemi(true);
return stmt;
}
@@ -1907,7 +1900,6 @@ public class OracleStatementParser extends SQLStatementParser {
|| lexer.token() == Token.TABLE) {
break;
} else if (lexer.identifierEquals(FnvHash.Constants.TYPE)) {
lexer.nextToken();
name = this.exprParser.name();
accept(Token.IS);
@@ -1922,7 +1914,7 @@ public class OracleStatementParser extends SQLStatementParser {
lexer.nextToken();
accept(Token.OF);
SQLName tname = this.exprParser.name();
name = this.exprParser.name();
if (lexer.token() == Token.PERCENT) {
lexer.nextToken();
@@ -1930,15 +1922,10 @@ public class OracleStatementParser extends SQLStatementParser {
String typeName;
if (lexer.identifierEquals(FnvHash.Constants.ROWTYPE)) {
lexer.nextToken();
typeName = "TABLE OF " + tname.toString() + "%ROWTYPE";
} else if (lexer.token() == Token.LPAREN && lexer.stringVal().equalsIgnoreCase("Varchar2")) {
accept(Token.LPAREN);
int len = this.exprParser.acceptInteger();
accept(Token.RPAREN);
typeName = "TABLE OF " + tname.toString() + "(" + len + ")";
typeName = "TABLE OF " + name.toString() + "%ROWTYPE";
} else {
acceptIdentifier("TYPE");
typeName = "TABLE OF " + tname.toString() + "%TYPE";
typeName = "TABLE OF " + name.toString() + "%TYPE";
}
dataType = new SQLDataTypeImpl(typeName);
@@ -1957,8 +1944,6 @@ public class OracleStatementParser extends SQLStatementParser {
SQLExpr indexBy = this.exprParser.primary();
((SQLDataTypeImpl) dataType).setIndexBy(indexBy);
}
}else if (lexer.token() == Token.SEMI) {
dataType = new SQLDataTypeImpl("TABLE OF " + tname.toString());
}
dataType.setDbType(dbType);
} else if (lexer.identifierEquals("VARRAY")) {
@@ -1994,18 +1979,6 @@ public class OracleStatementParser extends SQLStatementParser {
} else {
throw new ParserException("TODO : " + lexer.info());
}
} else if (lexer.token() == Token.RECORD) {
lexer.nextToken();
String typeName = "RECORD";
SQLRecordDataType sqlRecordDataType = new SQLRecordDataType();
sqlRecordDataType.setDbType(dbType);
sqlRecordDataType.setName(typeName);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
this.parseColumnsList(sqlRecordDataType.getColumns(), sqlRecordDataType);
accept(Token.RPAREN);
}
dataType = sqlRecordDataType;
} else {
throw new ParserException("TODO : " + lexer.info());
}
@@ -2131,19 +2104,7 @@ public class OracleStatementParser extends SQLStatementParser {
break;
}
}
private void parseColumnsList(List<SQLColumnDefinition> columns, SQLObject parent) {
for ( ; ; ) {
SQLColumnDefinition columnDefinition = this.exprParser.parseColumn();
columns.add(columnDefinition);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
}
public OracleSelectParser createSQLSelectParser() {
return new OracleSelectParser(this.exprParser, selectListCache);
}
@@ -1523,7 +1523,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSIF " : "elsif ");
print0(ucase ? "ELSE IF " : "else if ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
this.indentCount++;
@@ -2612,11 +2612,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public boolean visit(OracleExecuteImmediateStatement x) {
print0(ucase ? "EXECUTE IMMEDIATE " : "execute immediate ");
x.getDynamicSql().accept(this);
if (x.isBulkCollect()) {
print0(ucase ? " BULK COLLECT " : " bulk collect ");
}
List<SQLExpr> into = x.getInto();
if (into.size() > 0) {
print0(ucase ? " INTO " : " into ");
@@ -531,11 +531,6 @@ public class SQLExprParser extends SQLParser {
break;
}
}
} else if (DbType.oracle == dbType) {
lexer.nextTokenValue();
if (lexer.token == Token.BARBAR) {
sqlExpr = additiveRest(sqlExpr);
}
} else {
lexer.nextToken();
}
@@ -1312,7 +1307,7 @@ public class SQLExprParser extends SQLParser {
expr = dotRest(expr);
return primaryRest(expr);
} else if (lexer.identifierEquals(FnvHash.Constants.SETS) //
&& expr.getClass() == SQLIdentifierExpr.class //
&& expr.getClass() == SQLIdentifierExpr.class //
&& "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) {
SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr();
lexer.nextToken();
@@ -582,12 +582,7 @@ public class SQLStatementParser extends SQLParser {
stmt.setParent(parent);
continue;
}
if (lexer.token() == Token.ELSEIF
&& parent instanceof SQLIfStatement) {
break;
}
int size = statementList.size();
if (parseStatementListDialect(statementList)) {
if (parent != null) {
@@ -595,9 +590,6 @@ public class SQLStatementParser extends SQLParser {
SQLStatement dialectStmt = statementList.get(j);
dialectStmt.setParent(parent);
}
if (parent instanceof SQLCreateTriggerStatement) {
return;
}
}
continue;
@@ -3851,7 +3843,7 @@ public class SQLStatementParser extends SQLParser {
stmt.setWhen(condition);
}
List<SQLStatement> body = this.parseStatementList(stmt);
List<SQLStatement> body = this.parseStatementList();
if (body == null || body.isEmpty()) {
throw new ParserException("syntax error");
}
@@ -16,56 +16,56 @@
package com.alibaba.druid.sql.parser;
/**
*
* SQL Token
*
* SQL Token
* @author wenshao [szujobs@hotmail.com]
*/
public enum Token {
SELECT("SELECT"),
DELETE("DELETE"),
INSERT("INSERT"),
UPDATE("UPDATE"),
SELECT("SELECT"),
DELETE("DELETE"),
INSERT("INSERT"),
UPDATE("UPDATE"),
FROM("FROM"),
HAVING("HAVING"),
WHERE("WHERE"),
ORDER("ORDER"),
FROM("FROM"),
HAVING("HAVING"),
WHERE("WHERE"),
ORDER("ORDER"),
BY("BY"),
GROUP("GROUP"),
INTO("INTO"),
AS("AS"),
GROUP("GROUP"),
INTO("INTO"),
AS("AS"),
CREATE("CREATE"),
ALTER("ALTER"),
DROP("DROP"),
SET("SET"),
ALTER("ALTER"),
DROP("DROP"),
SET("SET"),
NULL("NULL"),
NOT("NOT"),
NULL("NULL"),
NOT("NOT"),
DISTINCT("DISTINCT"),
TABLE("TABLE"),
TABLESPACE("TABLESPACE"),
VIEW("VIEW"),
SEQUENCE("SEQUENCE"),
TRIGGER("TRIGGER"),
USER("USER"),
INDEX("INDEX"),
TABLE("TABLE"),
TABLESPACE("TABLESPACE"),
VIEW("VIEW"),
SEQUENCE("SEQUENCE"),
TRIGGER("TRIGGER"),
USER("USER"),
INDEX("INDEX"),
SESSION("SESSION"),
PROCEDURE("PROCEDURE"),
FUNCTION("FUNCTION"),
PRIMARY("PRIMARY"),
KEY("KEY"),
DEFAULT("DEFAULT"),
CONSTRAINT("CONSTRAINT"),
CHECK("CHECK"),
UNIQUE("UNIQUE"),
FOREIGN("FOREIGN"),
REFERENCES("REFERENCES"),
PRIMARY("PRIMARY"),
KEY("KEY"),
DEFAULT("DEFAULT"),
CONSTRAINT("CONSTRAINT"),
CHECK("CHECK"),
UNIQUE("UNIQUE"),
FOREIGN("FOREIGN"),
REFERENCES("REFERENCES"),
EXPLAIN("EXPLAIN"),
FOR("FOR"),
EXPLAIN("EXPLAIN"),
FOR("FOR"),
IF("IF"),
@@ -73,55 +73,55 @@ public enum Token {
GLOBAL("GLOBAL"),
ALL("ALL"),
UNION("UNION"),
EXCEPT("EXCEPT"),
INTERSECT("INTERSECT"),
EXCEPT("EXCEPT"),
INTERSECT("INTERSECT"),
MINUS("MINUS"),
INNER("INNER"),
LEFT("LEFT"),
RIGHT("RIGHT"),
FULL("FULL"),
OUTER("OUTER"),
INNER("INNER"),
LEFT("LEFT"),
RIGHT("RIGHT"),
FULL("FULL"),
OUTER("OUTER"),
JOIN("JOIN"),
STRAIGHT_JOIN("STRAIGHT_JOIN"),
ON("ON"),
SCHEMA("SCHEMA"),
SCHEMA("SCHEMA"),
CAST("CAST"),
COLUMN("COLUMN"),
USE("USE"),
DATABASE("DATABASE"),
TO("TO"),
AND("AND"),
OR("OR"),
XOR("XOR"),
CASE("CASE"),
WHEN("WHEN"),
THEN("THEN"),
AND("AND"),
OR("OR"),
XOR("XOR"),
CASE("CASE"),
WHEN("WHEN"),
THEN("THEN"),
ELSE("ELSE"),
ELSIF("ELSIF"),
END("END"),
EXISTS("EXISTS"),
END("END"),
EXISTS("EXISTS"),
IN("IN"),
NEW("NEW"),
ASC("ASC"),
DESC("DESC"),
IS("IS"),
LIKE("LIKE"),
ESCAPE("ESCAPE"),
BETWEEN("BETWEEN"),
VALUES("VALUES"),
NEW("NEW"),
ASC("ASC"),
DESC("DESC"),
IS("IS"),
LIKE("LIKE"),
ESCAPE("ESCAPE"),
BETWEEN("BETWEEN"),
VALUES("VALUES"),
INTERVAL("INTERVAL"),
LOCK("LOCK"),
SOME("SOME"),
LOCK("LOCK"),
SOME("SOME"),
ANY("ANY"),
TRUNCATE("TRUNCATE"),
RETURN("RETURN"),
// mysql
TRUE("TRUE"),
TRUE("TRUE"),
FALSE("FALSE"),
LIMIT("LIMIT"),
KILL("KILL"),
@@ -132,7 +132,7 @@ public enum Token {
SHOW("SHOW"),
REPLACE("REPLACE"),
PERIOD("PERIOD"),
ELSEIF("ELSEIF"),
BITS,
// MySql procedure add by zz
@@ -211,7 +211,6 @@ public enum Token {
COMMIT("COMMIT"),
SAVEPOINT("SAVEPOINT"),
CROSS("CROSS"),
RECORD("RECORD"),
PCTFREE("PCTFREE"),
INITRANS("INITRANS"),
@@ -254,7 +253,7 @@ public enum Token {
// hive
EOF,
EOF,
ERROR,
IDENTIFIER,
HINT,
@@ -299,19 +298,19 @@ public enum Token {
UPSERT("UPSERT"), // Phoenix
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
RBRACE("}"),
LBRACKET("["),
RBRACKET("]"),
SEMI(";"),
COMMA(","),
DOT("."),
DOTDOT(".."),
DOTDOTDOT("..,"),
EQ("="),
GT(">"),
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
RBRACE("}"),
LBRACKET("["),
RBRACKET("]"),
SEMI(";"),
COMMA(","),
DOT("."),
DOTDOT(".."),
DOTDOTDOT("..,"),
EQ("="),
GT(">"),
LT("<"),
LT_SUB_GT("<->"),
BANG("!"),
@@ -325,34 +324,34 @@ public enum Token {
QUESQUES("??"),
QUESBAR("?|"),
QUESAMP("?&"),
COLON(":"),
COLONCOLON("::"),
COLONEQ(":="),
COLON(":"),
COLONCOLON("::"),
COLONEQ(":="),
EQEQ("=="),
EQGT("=>"),
LTEQ("<="),
LTEQGT("<=>"),
LTGT("<>"),
GTEQ(">="),
BANGEQ("!="),
BANGGT("!>"),
LTEQ("<="),
LTEQGT("<=>"),
LTGT("<>"),
GTEQ(">="),
BANGEQ("!="),
BANGGT("!>"),
BANGLT("!<"),
AMPAMP("&&"),
BARBAR("||"),
BARBARSLASH("||/"),
BARSLASH("|/"),
PLUS("+"),
SUB("-"),
SUBGT("->"),
SUBGTGT("->>"),
STAR("*"),
SLASH("/"),
AMP("&"),
BAR("|"),
AMPAMP("&&"),
BARBAR("||"),
BARBARSLASH("||/"),
BARSLASH("|/"),
PLUS("+"),
SUB("-"),
SUBGT("->"),
SUBGTGT("->>"),
STAR("*"),
SLASH("/"),
AMP("&"),
BAR("|"),
CARET("^"),
CARETEQ("^="),
PERCENT("%"),
LTLT("<<"),
PERCENT("%"),
LTLT("<<"),
GTGT(">>"),
MONKEYS_AT("@"),
MONKEYS_AT_AT("@@"),
@@ -2890,8 +2890,6 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
} else if (expr instanceof SQLMethodInvokeExpr) {
visit((SQLMethodInvokeExpr) expr);
} else if (expr instanceof SQLListExpr) {
printAndAccept(((SQLListExpr) expr).getItems(), ",");
} else {
expr.accept(this);
}
@@ -4387,19 +4385,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
if (x.isDropStorage()) {
print0(ucase ? " DROP STORAGE" : " drop storage");
print0(ucase ? " DROP STORAGE" : " drop storage");
}
if (x.isReuseStorage()) {
print0(ucase ? " REUSE STORAGE" : " reuse storage");
print0(ucase ? " REUSE STORAGE" : " reuse storage");
}
if (x.isIgnoreDeleteTriggers()) {
print0(ucase ? " IGNORE DELETE TRIGGERS" : " ignore delete triggers");
print0(ucase ? " IGNORE DELETE TRIGGERS" : " ignore delete triggers");
}
if (x.isRestrictWhenDeleteTriggers()) {
print0(ucase ? " RESTRICT WHEN DELETE TRIGGERS" : " restrict when delete triggers");
print0(ucase ? " RESTRICT WHEN DELETE TRIGGERS" : " restrict when delete triggers");
}
if (x.isContinueIdentity()) {
@@ -4407,7 +4405,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
if (x.isImmediate()) {
print0(ucase ? " IMMEDIATE" : " immediate");
print0(ucase ? " IMMEDIATE" : " immediate");
}
return false;
@@ -5100,7 +5098,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
@Override
public boolean visit(SQLKeep x) {
if (x.getDenseRank() == SQLKeep.DenseRank.FIRST) {
print0(ucase ? "KEEP (DENSE_RANK FIRST " : "keep (dense_rank first ");
print0(ucase ? "KEEP (DENSE_RANK FIRST " : "keep (dense_rank first ");
} else {
print0(ucase ? "KEEP (DENSE_RANK LAST " : "keep (dense_rank last ");
}
@@ -6827,8 +6825,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
String dataTypeName = dataType.getName();
boolean printType = (dataTypeName.startsWith("TABLE OF") && x.getDefaultValue() == null)
|| dataTypeName.equalsIgnoreCase("REF CURSOR")
|| dataTypeName.startsWith("VARRAY(")
|| dataTypeName.startsWith("RECORD");
|| dataTypeName.startsWith("VARRAY(");
if (printType) {
print0(ucase ? "TYPE " : "type ");
}
@@ -7473,7 +7470,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
protected void printPartitions(List<SQLName> partitions) {
if (partitions.size() == 1 && "ALL".equalsIgnoreCase(partitions.get(0).getSimpleName())) {
print0(ucase ? "ALL" : "all");
print0(ucase ? "ALL" : "all");
} else {
printAndAccept(partitions, ", ");
}
@@ -1,32 +0,0 @@
package com.alibaba.druid.sql.parser;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
public class MySQL_IF_ELSEIF_Test extends TestCase {
public void test_IF_ELSEIF(){
String sql = "CREATE TRIGGER trg_test1 BEFORE INSERT ON test_table_name FOR EACH ROW\n" +
"begin\n" +
"\tIF new.BSRQ IS NOT NULL THEN\n" +
"\t\tset new.SJRQ1 = new.BSRQ;\n" +
"\tELSEIF new.SJRQ1 IS NOT NULL THEN\n" +
"\t\tset new.BSRQ = new.SJRQ1;\n" +
"\t\tset new.SJRQ2 =new.SJRQ1;\n" +
" ELSEIF new.SJRQ2 IS NOT NULL THEN\n" +
"\t\tset new.SJRQ1 =new.SJRQ2;\n" +
"\tEND IF;\n" +
"end;";
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
StringBuilder out = new StringBuilder();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmtList.get(0).accept(visitor);
System.out.println(stmtList.get(0).toString());
}
}