mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
support taobao urgly update returning sql. for issue 1196. https://github.com/alibaba/druid/issues/1196
This commit is contained in:
+24
-7
@@ -15,7 +15,11 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
@@ -24,14 +28,16 @@ import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlStatement {
|
||||
|
||||
private SQLOrderBy orderBy;
|
||||
private Limit limit;
|
||||
private SQLOrderBy orderBy;
|
||||
private Limit limit;
|
||||
|
||||
private boolean lowPriority = false;
|
||||
private boolean ignore = false;
|
||||
|
||||
public MySqlUpdateStatement() {
|
||||
super (JdbcConstants.MYSQL);
|
||||
private boolean lowPriority = false;
|
||||
private boolean ignore = false;
|
||||
|
||||
private List<SQLSelectItem> returning = new ArrayList<SQLSelectItem>();
|
||||
|
||||
public MySqlUpdateStatement(){
|
||||
super(JdbcConstants.MYSQL);
|
||||
}
|
||||
|
||||
public Limit getLimit() {
|
||||
@@ -45,6 +51,17 @@ public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlSta
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
public List<SQLSelectItem> getReturning() {
|
||||
return returning;
|
||||
}
|
||||
|
||||
public void addReturning(List<SQLSelectItem> returning) {
|
||||
for (SQLSelectItem item : returning) {
|
||||
item.setParent(this);
|
||||
this.returning.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
if (visitor instanceof MySqlASTVisitor) {
|
||||
|
||||
@@ -45,6 +45,9 @@ import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
public class MySqlSelectParser extends SQLSelectParser {
|
||||
|
||||
protected boolean returningFlag = false;
|
||||
protected MySqlUpdateStatement updateStmt;
|
||||
|
||||
public MySqlSelectParser(SQLExprParser exprParser){
|
||||
super(exprParser);
|
||||
}
|
||||
@@ -52,7 +55,25 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
public MySqlSelectParser(String sql){
|
||||
this(new MySqlExprParser(sql));
|
||||
}
|
||||
|
||||
public void parseFrom(SQLSelectQueryBlock queryBlock) {
|
||||
if (lexer.token() != Token.FROM) {
|
||||
return;
|
||||
}
|
||||
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.UPDATE) { // taobao returning to urgly syntax
|
||||
updateStmt = this.parseUpdateStatment();
|
||||
updateStmt.addReturning(queryBlock.getSelectList());
|
||||
returningFlag = true;
|
||||
return;
|
||||
}
|
||||
|
||||
queryBlock.setFrom(parseTableSource());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SQLSelectQuery query() {
|
||||
if (lexer.token() == (Token.LPAREN)) {
|
||||
|
||||
@@ -18,7 +18,6 @@ package com.alibaba.druid.sql.dialect.mysql.parser;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
@@ -230,9 +229,16 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
return parser.parseCrateTable();
|
||||
}
|
||||
|
||||
public SQLSelectStatement parseSelect() {
|
||||
public SQLStatement parseSelect() {
|
||||
MySqlSelectParser selectParser = new MySqlSelectParser(this.exprParser);
|
||||
return new SQLSelectStatement(selectParser.select(), JdbcConstants.MYSQL);
|
||||
|
||||
SQLSelect select = selectParser.select();
|
||||
|
||||
if (selectParser.returningFlag) {
|
||||
return selectParser.updateStmt;
|
||||
}
|
||||
|
||||
return new SQLSelectStatement(select, JdbcConstants.MYSQL);
|
||||
}
|
||||
|
||||
public SQLUpdateStatement parseUpdateStatement() {
|
||||
@@ -3664,7 +3670,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
accept(Token.FOR);
|
||||
|
||||
stmt.setSelect(parseSelect());
|
||||
SQLSelectStatement selelctStmt = (SQLSelectStatement)parseSelect();
|
||||
stmt.setSelect(selelctStmt);
|
||||
|
||||
accept(Token.SEMI);
|
||||
|
||||
|
||||
@@ -1629,6 +1629,13 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlUpdateStatement x) {
|
||||
if (x.getReturning() != null && x.getReturning().size() > 0) {
|
||||
print0(ucase ? "SELECT " : "select ");
|
||||
printAndAccept(x.getReturning(), ", ");
|
||||
println();
|
||||
print0(ucase ? "FROM " : "from ");
|
||||
}
|
||||
|
||||
print0(ucase ? "UPDATE " : "update ");
|
||||
|
||||
if (x.isLowPriority()) {
|
||||
|
||||
@@ -372,9 +372,9 @@ public class SQLSelectParser extends SQLParser {
|
||||
if (lexer.token() != Token.FROM) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
lexer.nextToken();
|
||||
|
||||
|
||||
queryBlock.setFrom(parseTableSource());
|
||||
}
|
||||
|
||||
|
||||
@@ -1766,7 +1766,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
return new SQLCreateTableParser(this.exprParser);
|
||||
}
|
||||
|
||||
public SQLSelectStatement parseSelect() {
|
||||
public SQLStatement parseSelect() {
|
||||
SQLSelectParser selectParser = createSQLSelectParser();
|
||||
SQLSelect select = selectParser.select();
|
||||
return new SQLSelectStatement(select);
|
||||
|
||||
Reference in New Issue
Block a user