mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser. for issue #1919
This commit is contained in:
@@ -112,6 +112,9 @@ public class FilterManager {
|
||||
|
||||
try {
|
||||
filter = (Filter) filterClass.newInstance();
|
||||
} catch (ClassCastException e) {
|
||||
LOG.error("load filter error.", e);
|
||||
continue;
|
||||
} catch (InstantiationException e) {
|
||||
throw new SQLException("load managed jdbc driver event listener error. " + filterName, e);
|
||||
} catch (IllegalAccessException e) {
|
||||
|
||||
@@ -78,6 +78,12 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
this.lexer.nextToken();
|
||||
}
|
||||
|
||||
|
||||
public MySqlExprParser(String sql, boolean skipComment,boolean keepComments){
|
||||
this(new MySqlLexer(sql, skipComment, keepComments));
|
||||
this.lexer.nextToken();
|
||||
}
|
||||
|
||||
public SQLExpr relationalRest(SQLExpr expr) {
|
||||
if (identifierEquals("REGEXP")) {
|
||||
lexer.nextToken();
|
||||
|
||||
@@ -98,6 +98,10 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
super(new MySqlExprParser(sql, keepComments));
|
||||
}
|
||||
|
||||
public MySqlStatementParser(String sql, boolean skipComment, boolean keepComments) {
|
||||
super(new MySqlExprParser(sql, skipComment, keepComments));
|
||||
}
|
||||
|
||||
public MySqlStatementParser(Lexer lexer) {
|
||||
super(new MySqlExprParser(lexer));
|
||||
}
|
||||
|
||||
+10
@@ -1003,4 +1003,14 @@ public class OracleToMySqlOutputVisitor extends MySqlOutputVisitor implements Or
|
||||
public void endVisit(OracleTreatExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateSynonymStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateSynonymStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
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 OracleCreateSynonymStatement extends OracleStatementImpl {
|
||||
private boolean orReplace;
|
||||
private SQLName name;
|
||||
private boolean isPublic;
|
||||
private SQLName object;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, object);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return isPublic;
|
||||
}
|
||||
|
||||
public void setPublic(boolean value) {
|
||||
isPublic = value;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
}
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public SQLName getObject() {
|
||||
return object;
|
||||
}
|
||||
|
||||
public void setObject(SQLName object) {
|
||||
if (object != null) {
|
||||
object.setParent(this);
|
||||
}
|
||||
this.object = object;
|
||||
}
|
||||
|
||||
public boolean isOrReplace() {
|
||||
return orReplace;
|
||||
}
|
||||
|
||||
public void setOrReplace(boolean orReplace) {
|
||||
this.orReplace = orReplace;
|
||||
}
|
||||
}
|
||||
@@ -968,8 +968,19 @@ public class OracleExprParser extends SQLExprParser {
|
||||
}
|
||||
OracleDbLinkExpr dbLink = new OracleDbLinkExpr();
|
||||
dbLink.setExpr(name);
|
||||
dbLink.setDbLink(lexer.stringVal());
|
||||
|
||||
|
||||
String link = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
while (lexer.token() == Token.DOT) {
|
||||
lexer.nextToken();
|
||||
|
||||
String stringVal = lexer.stringVal();
|
||||
accept(Token.IDENTIFIER);
|
||||
link += "." + stringVal;
|
||||
}
|
||||
|
||||
dbLink.setDbLink(link);
|
||||
return dbLink;
|
||||
}
|
||||
|
||||
|
||||
@@ -2293,4 +2293,29 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
accept(Token.SEMI);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
public SQLStatement parseCreateSynonym() {
|
||||
OracleCreateSynonymStatement stmt = new OracleCreateSynonymStatement();
|
||||
accept(Token.CREATE);
|
||||
|
||||
if (lexer.token() == Token.OR) {
|
||||
lexer.nextToken();
|
||||
accept(Token.REPLACE);
|
||||
stmt.setOrReplace(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("PUBLIC")) {
|
||||
lexer.nextToken();
|
||||
stmt.setPublic(true);
|
||||
}
|
||||
|
||||
acceptIdentifier("SYNONYM");
|
||||
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
accept(Token.FOR);
|
||||
|
||||
stmt.setObject(this.exprParser.name());
|
||||
return stmt;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,4 +427,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleTreatExpr x);
|
||||
|
||||
void endVisit(OracleTreatExpr x);
|
||||
|
||||
boolean visit(OracleCreateSynonymStatement x);
|
||||
|
||||
void endVisit(OracleCreateSynonymStatement x);
|
||||
}
|
||||
|
||||
+10
@@ -1052,4 +1052,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleTreatExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateSynonymStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateSynonymStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3268,4 +3268,32 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleTreatExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateSynonymStatement x) {
|
||||
|
||||
if (x.isOrReplace()) {
|
||||
print0(ucase ? "CREATE OR REPLACE " : "create or replace ");
|
||||
} else {
|
||||
print0(ucase ? "CREATE " : "create ");
|
||||
}
|
||||
|
||||
if (x.isPublic()) {
|
||||
print0(ucase ? "PUBLIC " : "public ");
|
||||
}
|
||||
|
||||
print0(ucase ? "SYNONYM " : "synonym ");
|
||||
|
||||
x.getName().accept(this);
|
||||
|
||||
print0(ucase ? " FOR " : " for ");
|
||||
x.getObject().accept(this);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateSynonymStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+10
@@ -1445,4 +1445,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleTreatExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateSynonymStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateSynonymStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1853,9 +1853,21 @@ public class SQLStatementParser extends SQLParser {
|
||||
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateDatabase();
|
||||
} else if (identifierEquals("PUBLIC") || identifierEquals("SHARE")) {
|
||||
} else if (identifierEquals("PUBLIC")) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("SYNONYM")) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateSynonym();
|
||||
} else {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateDbLink();
|
||||
}
|
||||
} else if (identifierEquals("SHARE")) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateDbLink();
|
||||
} else if (identifierEquals("SYNONYM")) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateSynonym();
|
||||
} else if (token == Token.VIEW) {
|
||||
return parseCreateView();
|
||||
} else if (token == Token.TRIGGER) {
|
||||
@@ -1963,6 +1975,10 @@ public class SQLStatementParser extends SQLParser {
|
||||
throw new ParserException("TODO " + lexer.token());
|
||||
}
|
||||
|
||||
public SQLStatement parseCreateSynonym() {
|
||||
throw new ParserException("TODO " + lexer.token());
|
||||
}
|
||||
|
||||
public SQLStatement parseCreateTrigger() {
|
||||
accept(Token.CREATE);
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ public interface JdbcConstants {
|
||||
public static final String MYSQL = "mysql";
|
||||
public static final String MYSQL_DRIVER = "com.mysql.jdbc.Driver";
|
||||
public static final String MYSQL_DRIVER_6 = "com.mysql.cj.jdbc.Driver";
|
||||
public static final String MYSQL_DRIVER_REPLICATE = "com.mysql.jdbc.ReplicationDriver";
|
||||
public static final String MYSQL_DRIVER_REPLICATE = "com.mysql.jdbc.";
|
||||
|
||||
public static final String MARIADB = "mariadb";
|
||||
public static final String MARIADB_DRIVER = "org.mariadb.jdbc.Driver";
|
||||
|
||||
Reference in New Issue
Block a user