code: func (s *propagateConstantSolver) propagateInEQ() {
  	s.unionSet = &multiEqualSet{}
  	s.unionSet.init(len(s.columns))
  	for i := range s.conditions {
  		if fun, ok := s.conditions[i].(*ScalarFunction); ok && fun.FuncName.L == ast.EQ {
  			lCol, lOk := fun.GetArgs()[0].(*Column)
  			rCol, rOk := fun.GetArgs()[1].(*Column)
  			if lOk && rOk {
  				lID := s.getColID(lCol)
  				rID := s.getColID(rCol)
  				s.unionSet.addRelation(lID, rID)
  			}
  		}
  	}
  	condsLen := len(s.conditions)
  	for i := 0; i < condsLen; i++ {
  		cond := s.conditions[i]
  		col, con := s.validPropagateCond(cond, inEqFuncNameMap)
  		if col == nil {
  			continue
  		}
  		id := s.getColID(col)
  		for j := range s.columns {
  			if id != j && s.unionSet.findRoot(id) == s.unionSet.findRoot(j) {
  				funName := cond.(*ScalarFunction).FuncName.L
  				var newExpr Expression
  				if _, ok := cond.(*ScalarFunction).GetArgs()[0].(*Column); ok {
  					newExpr, _ = NewFunction(s.ctx, funName, cond.GetType(), s.columns[j], con)
  				} else {
  					newExpr, _ = NewFunction(s.ctx, funName, cond.GetType(), con, s.columns[j])
  				}
  				s.conditions = append(s.conditions, newExpr)
  			}
  		}
  	}
  }
docs: // propagateInEQ propagates all in-equal conditions.
  // e.g. For expression a = b and b = c and c = d and c < 1 , we can get extra a < 1 and b < 1 and d < 1.
  // We maintain a unionSet representing the equivalent for every two columns.