diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/GlobalVisitor.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/GlobalVisitor.java index f49077da6..d1268eded 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/GlobalVisitor.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/GlobalVisitor.java @@ -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); diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/MysqlVisitor.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/MysqlVisitor.java index f9b0e971b..992503410 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/MysqlVisitor.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/MysqlVisitor.java @@ -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 + "$_"; diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/PushDownVisitor.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/PushDownVisitor.java index 7f8a863d1..c30cf8735 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/PushDownVisitor.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/sqlvisitor/PushDownVisitor.java @@ -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()) {