// Encodes datum at the end of key, using direction `dir` for the encoding. // The key is a span end key, which is exclusive, but `val` needs to // be inclusive. So if datum is the last end constraint, we transform it accordingly. func encodeInclusiveEndValue( key roachpb.Key, datum parser.Datum, dir encoding.Direction, isLastEndConstraint bool) roachpb.Key { // Since the end of a span is exclusive, if the last constraint is an // inclusive one, we might need to make the key exclusive by applying a // PrefixEnd(). We normally avoid doing this by transforming "a = x" to // "a = x±1" for the last end constraint, depending on the encoding direction // (since this keeps the key nice and pretty-printable). // However, we might not be able to do the ±1. needExclusiveKey := false if isLastEndConstraint { if dir == encoding.Ascending { if datum.IsMax() { needExclusiveKey = true } else { datum = datum.Next() } } else { if datum.IsMin() || !datum.HasPrev() { needExclusiveKey = true } else { datum = datum.Prev() } } } key, pErr := encodeTableKey(key, datum, dir) if pErr != nil { panic(pErr) } if needExclusiveKey { key = key.PrefixEnd() } return key }