code: func (j *leftOuterJoiner) tryToMatch(outer chunk.Row, inners chunk.Iterator, chk *chunk.Chunk) (bool, bool, error) {
  	if inners.Len() == 0 {
  		return false, false, nil
  	}
  	j.chk.Reset()
  	chkForJoin := j.chk
  	if len(j.conditions) == 0 {
  		chkForJoin = chk
  	}
  
  	numToAppend := chk.RequiredRows() - chk.NumRows()
  	for ; inners.Current() != inners.End() && numToAppend > 0; numToAppend-- {
  		j.makeJoinRowToChunk(chkForJoin, outer, inners.Current())
  		inners.Next()
  	}
  	if len(j.conditions) == 0 {
  		return true, false, nil
  	}
  
  	// reach here, chkForJoin is j.chk
  	matched, err := j.filter(chkForJoin, chk, outer.Len())
  	if err != nil {
  		return false, false, err
  	}
  	return matched, false, nil
  }
docs: // tryToMatch implements joiner interface.