code: func (p *PhysicalMergeJoin) tryToGetChildReqProp(prop *property.PhysicalProperty) ([]*property.PhysicalProperty, bool) {
  	lProp := property.NewPhysicalProperty(property.RootTaskType, p.LeftKeys, false, math.MaxFloat64, false)
  	rProp := property.NewPhysicalProperty(property.RootTaskType, p.RightKeys, false, math.MaxFloat64, false)
  	if !prop.IsEmpty() {
  		// sort merge join fits the cases of massive ordered data, so desc scan is always expensive.
  		all, desc := prop.AllSameOrder()
  		if !all || desc {
  			return nil, false
  		}
  		if !prop.IsPrefix(lProp) && !prop.IsPrefix(rProp) {
  			return nil, false
  		}
  		if prop.IsPrefix(rProp) && p.JoinType == LeftOuterJoin {
  			return nil, false
  		}
  		if prop.IsPrefix(lProp) && p.JoinType == RightOuterJoin {
  			return nil, false
  		}
  	}
  
  	return []*property.PhysicalProperty{lProp, rProp}, true
  }
docs: // Only if the input required prop is the prefix fo join keys, we can pass through this property.