db: adjust lexicographical_tri_compare to take a bounded type list

When comparing tuples, we don't want to overrun the type list.
This commit is contained in:
Avi Kivity
2015-04-09 15:20:24 +03:00
parent 40a0dd1f6f
commit e9774fe1e1
3 changed files with 16 additions and 10 deletions

12
keys.hh
View File

@@ -141,14 +141,16 @@ public:
{ }
bool operator()(const prefix_view_on_full_tuple& k1, const PrefixTopLevel& k2) const {
return lexicographical_tri_compare(prefix_type->types().begin(),
return lexicographical_tri_compare(
prefix_type->types().begin(), prefix_type->types().end(),
k1.begin(), k1.end(),
prefix_type->begin(k2), prefix_type->end(k2),
tri_compare) < 0;
}
bool operator()(const PrefixTopLevel& k1, const prefix_view_on_full_tuple& k2) const {
return lexicographical_tri_compare(prefix_type->types().begin(),
return lexicographical_tri_compare(
prefix_type->types().begin(), prefix_type->types().end(),
prefix_type->begin(k1), prefix_type->end(k1),
k2.begin(), k2.end(),
tri_compare) < 0;
@@ -183,14 +185,16 @@ public:
{ }
bool operator()(const TopLevel& k1, const PrefixTopLevel& k2) const {
return lexicographical_tri_compare(prefix_type->types().begin(),
return lexicographical_tri_compare(
prefix_type->types().begin(), prefix_type->types().end(),
full_type->begin(k1), full_type->end(k1),
prefix_type->begin(k2), prefix_type->end(k2),
tri_compare) < 0;
}
bool operator()(const PrefixTopLevel& k1, const TopLevel& k2) const {
return lexicographical_tri_compare(prefix_type->types().begin(),
return lexicographical_tri_compare(
prefix_type->types().begin(), prefix_type->types().end(),
prefix_type->begin(k1), prefix_type->end(k1),
full_type->begin(k2), full_type->end(k2),
tri_compare) < 0;

View File

@@ -233,7 +233,7 @@ public:
if (_byte_order_comparable) {
return compare_unsigned(b1, b2);
}
return lexicographical_tri_compare(_types.begin(),
return lexicographical_tri_compare(_types.begin(), _types.end(),
begin(b1), end(b1), begin(b2), end(b2), [] (auto&& type, auto&& v1, auto&& v2) {
return type->compare(v1, v2);
});

View File

@@ -55,16 +55,18 @@ bool lexicographical_compare(TypesIterator types, InputIt1 first1, InputIt1 last
// than zero when the first value is respectively smaller, equal or greater
// than the second value.
template <typename TypesIterator, typename InputIt1, typename InputIt2, typename Compare>
int lexicographical_tri_compare(TypesIterator types, InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2, Compare comp) {
while (first1 != last1 && first2 != last2) {
auto c = comp(*types, *first1, *first2);
int lexicographical_tri_compare(TypesIterator types_first, TypesIterator types_last,
InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
Compare comp) {
while (types_first != types_last && first1 != last1 && first2 != last2) {
auto c = comp(*types_first, *first1, *first2);
if (c) {
return c;
}
++first1;
++first2;
++types;
++types_first;
}
bool e1 = first1 == last1;
bool e2 = first2 == last2;