code: func (s *propOuterJoinConstSolver) validColEqualCond(cond Expression) (*Column, *Column) {
  	if fun, ok := cond.(*ScalarFunction); ok && fun.FuncName.L == ast.EQ {
  		lCol, lOk := fun.GetArgs()[0].(*Column)
  		rCol, rOk := fun.GetArgs()[1].(*Column)
  		if lOk && rOk {
  			return s.colsFromOuterAndInner(lCol, rCol)
  		}
  	}
  	return nil, nil
  
  }
docs: // validColEqualCond checks if expression is column equal condition that we can use for constant
  // propagation over outer join. We only use expression like `outerCol = innerCol`, for expressions like
  // `outerCol1 = outerCol2` or `innerCol1 = innerCol2`, they do not help deriving new inner table conditions
  // which can be pushed down to children plan nodes, so we do not pick them.