// Encodes datum at the end of key, using direction `dir` for the encoding. // It takes in an inclusive key and returns an inclusive key if // isLastEndConstraint is not set, and an exclusive key otherwise (the idea is // that, for inclusive constraints, the value for the last column in the // constraint needs to be adapted to an exclusive span.EndKey). 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() || !datum.HasNext() { needExclusiveKey = true } else { datum = datum.Next() } } else { if datum.IsMin() || !datum.HasPrev() { needExclusiveKey = true } else { datum = datum.Prev() } } } key, err := sqlbase.EncodeTableKey(key, datum, dir) if err != nil { panic(err) } if needExclusiveKey { key = key.PrefixEnd() } return key }