support taobao urgly update returning sql. for issue 1196. https://github.com/alibaba/druid/issues/1196

This commit is contained in:
高铁
2016-05-04 22:45:40 +08:00
parent 2b8cae6d7b
commit 0d322bf51e
8 changed files with 146 additions and 22 deletions
@@ -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);