fix sql where condition is miss inner 1829

fix sql where condition is miss inner 1829
This commit is contained in:
ylinzhu
2022-08-24 13:12:35 +08:00
committed by lin
parent 453bf27573
commit e1688b4349
3 changed files with 51 additions and 58 deletions
@@ -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);
@@ -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 + "$_";
@@ -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()) {