mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
+8
@@ -16,6 +16,7 @@
|
||||
package com.alibaba.druid.sql.dialect.mysql.ast.clause;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
|
||||
@@ -36,9 +37,16 @@ public class MySqlCursorDeclareStatement extends MySqlStatementImpl{
|
||||
}
|
||||
|
||||
public void setCursorName(SQLName cursorName) {
|
||||
if (cursorName != null) {
|
||||
cursorName.setParent(this);
|
||||
}
|
||||
this.cursorName = cursorName;
|
||||
}
|
||||
|
||||
public void setCursorName(String cursorName) {
|
||||
this.setCursorName(new SQLIdentifierExpr(cursorName));
|
||||
}
|
||||
|
||||
public SQLSelect getSelect() {
|
||||
return select;
|
||||
}
|
||||
|
||||
+33
-13
@@ -16,12 +16,15 @@
|
||||
package com.alibaba.druid.sql.dialect.mysql.visitor.transform;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter;
|
||||
import com.alibaba.druid.util.FnvHash;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -30,6 +33,8 @@ import java.util.List;
|
||||
* Created by wenshao on 27/07/2017.
|
||||
*/
|
||||
public class OrderByResolve extends OracleASTVisitorAdapter {
|
||||
final static long DBMS_RANDOM_VALUE = FnvHash.hashCode64("DBMS_RANDOM.value");
|
||||
|
||||
public boolean visit(SQLSelect x) {
|
||||
SQLSelectQueryBlock queryBlock = x.getQueryBlock();
|
||||
if (queryBlock == null) {
|
||||
@@ -46,23 +51,38 @@ public class OrderByResolve extends OracleASTVisitorAdapter {
|
||||
return super.visit(x);
|
||||
}
|
||||
|
||||
List<SQLSelectOrderByItem> notContainsOrderBy = new ArrayList<SQLSelectOrderByItem>();
|
||||
for (SQLSelectOrderByItem orderByItem : orderBy.getItems()) {
|
||||
SQLExpr orderByExpr = orderByItem.getExpr();
|
||||
if (queryBlock.selectIndexOf(orderByExpr) == -1) {
|
||||
notContainsOrderBy.add(orderByItem);
|
||||
|
||||
if (!queryBlock.selectItemHasAllColumn(false)) {
|
||||
List<SQLSelectOrderByItem> notContainsOrderBy = new ArrayList<SQLSelectOrderByItem>();
|
||||
|
||||
for (SQLSelectOrderByItem orderByItem : orderBy.getItems()) {
|
||||
SQLExpr orderByExpr = orderByItem.getExpr();
|
||||
|
||||
if (orderByExpr instanceof SQLName) {
|
||||
if (((SQLName) orderByExpr).hashCode64() == DBMS_RANDOM_VALUE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
long hashCode64 = ((SQLName) orderByExpr).nameHashCode64();
|
||||
SQLSelectItem selectItem = queryBlock.findSelectItem(hashCode64);
|
||||
if (selectItem == null) {
|
||||
queryBlock.addSelectItem(orderByExpr.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (notContainsOrderBy.size() > 0) {
|
||||
for (SQLSelectOrderByItem orderByItem : notContainsOrderBy) {
|
||||
queryBlock.addSelectItem(orderByItem.getExpr());
|
||||
}
|
||||
|
||||
OracleSelectQueryBlock queryBlock1 = new OracleSelectQueryBlock();
|
||||
queryBlock1.setFrom(queryBlock, "x");
|
||||
x.setQuery(queryBlock1);
|
||||
}
|
||||
}
|
||||
|
||||
if (notContainsOrderBy.size() > 0) {
|
||||
for (SQLSelectOrderByItem orderByItem : notContainsOrderBy) {
|
||||
queryBlock.addSelectItem(orderByItem.getExpr());
|
||||
}
|
||||
|
||||
OracleSelectQueryBlock queryBlock1 = new OracleSelectQueryBlock();
|
||||
queryBlock1.setFrom(queryBlock, "x");
|
||||
x.setQuery(queryBlock1);
|
||||
}
|
||||
|
||||
return super.visit(x);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user