code: func (p *LogicalJoin) pushDownConstExpr(expr expression.Expression, leftCond []expression.Expression,
  	rightCond []expression.Expression, filterCond bool) ([]expression.Expression, []expression.Expression) {
  	switch p.JoinType {
  	case LeftOuterJoin, LeftOuterSemiJoin, AntiLeftOuterSemiJoin:
  		if filterCond {
  			leftCond = append(leftCond, expr)
  			// Append the expr to right join condition instead of `rightCond`, to make it able to be
  			// pushed down to children of join.
  			p.RightConditions = append(p.RightConditions, expr)
  		} else {
  			rightCond = append(rightCond, expr)
  		}
  	case RightOuterJoin:
  		if filterCond {
  			rightCond = append(rightCond, expr)
  			p.LeftConditions = append(p.LeftConditions, expr)
  		} else {
  			leftCond = append(leftCond, expr)
  		}
  	case SemiJoin, AntiSemiJoin, InnerJoin:
  		leftCond = append(leftCond, expr)
  		rightCond = append(rightCond, expr)
  	}
  	return leftCond, rightCond
  }
docs: // pushDownConstExpr checks if the condition is from filter condition, if true, push it down to both
  // children of join, whatever the join type is; if false, push it down to inner child of outer join,
  // and both children of non-outer-join.