code: func (s *propOuterJoinConstSolver) propagateConstantEQ() {
  	s.eqList = make([]*Constant, len(s.columns))
  	lenFilters := len(s.filterConds)
  	visited := make([]bool, lenFilters+len(s.joinConds))
  	for i := 0; i < MaxPropagateColsCnt; i++ {
  		mapper := s.pickNewEQConds(visited)
  		if len(mapper) == 0 {
  			return
  		}
  		cols := make([]*Column, 0, len(mapper))
  		cons := make([]Expression, 0, len(mapper))
  		for id, con := range mapper {
  			cols = append(cols, s.columns[id])
  			cons = append(cons, con)
  		}
  		for i, cond := range s.joinConds {
  			if !visited[i+lenFilters] {
  				s.joinConds[i] = ColumnSubstitute(cond, NewSchema(cols...), cons)
  			}
  		}
  	}
  }
docs: // propagateConstantEQ propagates expressions like `outerCol = const` by substituting `outerCol` in *JOIN* condition
  // with `const`, the procedure repeats multiple times.