mirror of
https://github.com/actiontech/dble.git
synced 2026-05-14 19:08:31 -05:00
fix sql where condition is miss inner 1829
fix sql where condition is miss inner 1829
This commit is contained in:
+6
-14
@@ -31,6 +31,7 @@ import com.actiontech.dble.util.StringUtil;
|
||||
public class GlobalVisitor extends MysqlVisitor {
|
||||
|
||||
private final boolean rebuildSubQuery;
|
||||
|
||||
public GlobalVisitor(PlanNode globalQuery, boolean isTopQuery, boolean rebuildSubQuery) {
|
||||
super(globalQuery, isTopQuery);
|
||||
this.rebuildSubQuery = rebuildSubQuery;
|
||||
@@ -67,20 +68,11 @@ public class GlobalVisitor extends MysqlVisitor {
|
||||
}
|
||||
|
||||
protected void visit(TableNode query) {
|
||||
/**
|
||||
* The role of 'parentIsJoinAndHaveWhere':
|
||||
* In scenario 'right join',want to keep the TableNode's where condition and send it to the node
|
||||
*
|
||||
* For example: select * from tabler a right join tabler2 b on a.name = b.name and a.id = 2 where b.id = 2
|
||||
* expect visit: select * from (select * from tabler2 b where b.id = 2) b left join (select * from tabler a where a.id = 2) a on b.name = a.name
|
||||
*/
|
||||
boolean parentIsJoinAndHaveWhere = query.getParent() != null && query.getParent().type() == PlanNodeType.JOIN && !isTopQuery && query.getWhereFilter() != null;
|
||||
|
||||
boolean parentIsQuery = query.getParent() != null && query.getParent().type() == PlanNodeType.QUERY;
|
||||
if ((query.isWithSubQuery() && !parentIsQuery && !isTopQuery) || parentIsJoinAndHaveWhere) {
|
||||
if ((query.isWithSubQuery() && !parentIsQuery && !isTopQuery)) {
|
||||
sqlBuilder.append(" ( ");
|
||||
}
|
||||
if (query.isWithSubQuery() || isTopQuery || parentIsJoinAndHaveWhere) {
|
||||
if (query.isWithSubQuery() || isTopQuery) {
|
||||
buildSelect(query);
|
||||
|
||||
if (query.getTableName() == null)
|
||||
@@ -88,7 +80,7 @@ public class GlobalVisitor extends MysqlVisitor {
|
||||
sqlBuilder.append(" from ");
|
||||
}
|
||||
buildTableName(query, sqlBuilder);
|
||||
if (query.isWithSubQuery() || isTopQuery || parentIsJoinAndHaveWhere) {
|
||||
if (query.isWithSubQuery() || isTopQuery) {
|
||||
buildWhere(query);
|
||||
buildGroupBy(query);
|
||||
buildHaving(query);
|
||||
@@ -98,7 +90,7 @@ public class GlobalVisitor extends MysqlVisitor {
|
||||
whereFilter = query.getWhereFilter();
|
||||
}
|
||||
|
||||
if ((query.isWithSubQuery() && !parentIsQuery && !isTopQuery) || parentIsJoinAndHaveWhere) {
|
||||
if ((query.isWithSubQuery() && !parentIsQuery && !isTopQuery)) {
|
||||
sqlBuilder.append(" ) ");
|
||||
if (query.getAlias() != null) {
|
||||
sqlBuilder.append(" ").append(query.getAlias()).append(" ");
|
||||
@@ -242,7 +234,7 @@ public class GlobalVisitor extends MysqlVisitor {
|
||||
}
|
||||
sqlBuilder.append(joinOnFilterStr.toString());
|
||||
if (join.isWithSubQuery() || isTopQuery) {
|
||||
buildWhere(join);
|
||||
buildWhere(join, leftVisitor, rightVisitor);
|
||||
buildGroupBy(join);
|
||||
buildHaving(join);
|
||||
buildOrderBy(join);
|
||||
|
||||
+45
@@ -13,6 +13,7 @@ import com.actiontech.dble.plan.common.item.function.operator.logic.ItemCondAnd;
|
||||
import com.actiontech.dble.plan.common.item.function.operator.logic.ItemCondOr;
|
||||
import com.actiontech.dble.plan.common.item.function.operator.logic.ItemFuncNot;
|
||||
import com.actiontech.dble.plan.common.ptr.StringPtr;
|
||||
import com.actiontech.dble.plan.node.JoinNode;
|
||||
import com.actiontech.dble.plan.node.PlanNode;
|
||||
import com.actiontech.dble.plan.node.PlanNode.PlanNodeType;
|
||||
import com.actiontech.dble.plan.node.TableNode;
|
||||
@@ -109,6 +110,50 @@ public abstract class MysqlVisitor {
|
||||
sqlBuilder = replaceableSqlBuilder.getCurrentElement().getSb();
|
||||
}
|
||||
|
||||
void buildWhere(JoinNode planNode, MysqlVisitor leftVisitor, MysqlVisitor rightVisitor) {
|
||||
if (!visited)
|
||||
replaceableSqlBuilder.getCurrentElement().setRepString(replaceableWhere);
|
||||
StringBuilder whereBuilder = new StringBuilder();
|
||||
Item filter = planNode.getWhereFilter();
|
||||
if (filter != null) {
|
||||
String pdName = visitUnSelPushDownName(filter, false);
|
||||
whereBuilder.append(" where ").append(pdName);
|
||||
} else {
|
||||
whereBuilder.append(" where 1=1 ");
|
||||
}
|
||||
// is not left join
|
||||
if (leftVisitor.getWhereFilter() != null && !planNode.getLeftOuter()) {
|
||||
String pdName = visitUnSelPushDownName(leftVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
// is not right join
|
||||
if (rightVisitor.getWhereFilter() != null && !planNode.getRightOuter()) {
|
||||
String pdName = visitUnSelPushDownName(rightVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
// left join
|
||||
if (leftVisitor.getWhereFilter() != null && !planNode.getRightOuter() && planNode.getLeftOuter()) {
|
||||
String pdName = visitUnSelPushDownName(leftVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
//right join
|
||||
if (rightVisitor.getWhereFilter() != null && !planNode.getLeftOuter() && planNode.getRightOuter()) {
|
||||
String pdName = visitUnSelPushDownName(rightVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
replaceableWhere.set(whereBuilder.toString());
|
||||
// refresh sqlbuilder
|
||||
sqlBuilder = replaceableSqlBuilder.getCurrentElement().getSb();
|
||||
}
|
||||
|
||||
// generate an alias for aggregate function
|
||||
public static String getMadeAggAlias(String aggFuncName) {
|
||||
return "_$" + aggFuncName + "$_";
|
||||
|
||||
-44
@@ -218,50 +218,6 @@ public class PushDownVisitor extends MysqlVisitor {
|
||||
return joinOnFilterStr;
|
||||
}
|
||||
|
||||
private void buildWhere(JoinNode planNode, MysqlVisitor leftVisitor, MysqlVisitor rightVisitor) {
|
||||
if (!visited)
|
||||
replaceableSqlBuilder.getCurrentElement().setRepString(replaceableWhere);
|
||||
StringBuilder whereBuilder = new StringBuilder();
|
||||
Item filter = planNode.getWhereFilter();
|
||||
if (filter != null) {
|
||||
String pdName = visitUnSelPushDownName(filter, false);
|
||||
whereBuilder.append(" where ").append(pdName);
|
||||
} else {
|
||||
whereBuilder.append(" where 1=1 ");
|
||||
}
|
||||
// is not left join
|
||||
if (leftVisitor.getWhereFilter() != null && !planNode.getLeftOuter()) {
|
||||
String pdName = visitUnSelPushDownName(leftVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
// is not right join
|
||||
if (rightVisitor.getWhereFilter() != null && !planNode.getRightOuter()) {
|
||||
String pdName = visitUnSelPushDownName(rightVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
// left join
|
||||
if (leftVisitor.getWhereFilter() != null && !planNode.getRightOuter() && planNode.getLeftOuter()) {
|
||||
String pdName = visitUnSelPushDownName(leftVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
//right join
|
||||
if (rightVisitor.getWhereFilter() != null && !planNode.getLeftOuter() && planNode.getRightOuter()) {
|
||||
String pdName = visitUnSelPushDownName(rightVisitor.getWhereFilter(), false);
|
||||
whereBuilder.append(" and (");
|
||||
whereBuilder.append(pdName);
|
||||
whereBuilder.append(")");
|
||||
}
|
||||
replaceableWhere.set(whereBuilder.toString());
|
||||
// refresh sqlbuilder
|
||||
sqlBuilder = replaceableSqlBuilder.getCurrentElement().getSb();
|
||||
}
|
||||
|
||||
private void buildSelect(PlanNode query) {
|
||||
sqlBuilder.append("select ");
|
||||
if (query.isDistinct()) {
|
||||
|
||||
Reference in New Issue
Block a user