[patches] [PATCH 1/1] index: make index:min/max return a tuple with correct key
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Fri Feb 16 20:44:04 MSK 2018
Now index:min/max returns a tuple be select(LE, limit=1), but this
request does not guarantee, that it returns a tuple which matches
a key, specified in min/max() args. Check the key.
Closes #3167
Signed-off-by: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
---
src/box/index.cc | 7 +++++++
test/engine/tree_min_max_count.result | 30 ------------------------------
2 files changed, 7 insertions(+), 30 deletions(-)
diff --git a/src/box/index.cc b/src/box/index.cc
index 69fc76116..5d1ad3571 100644
--- a/src/box/index.cc
+++ b/src/box/index.cc
@@ -38,6 +38,7 @@
#include "txn.h"
#include "rmean.h"
#include "info.h"
+#include "tuple_compare.h"
/* {{{ Utilities. **********************************************/
@@ -566,6 +567,9 @@ generic_index_min(struct index *index, const char *key,
if (it == NULL)
return -1;
int rc = iterator_next(it, result);
+ if (*result != NULL && tuple_compare_with_key(*result, key, part_count,
+ index->def->key_def) != 0)
+ *result = NULL;
iterator_delete(it);
return rc;
}
@@ -579,6 +583,9 @@ generic_index_max(struct index *index, const char *key,
if (it == NULL)
return -1;
int rc = iterator_next(it, result);
+ if (*result != NULL && tuple_compare_with_key(*result, key, part_count,
+ index->def->key_def) != 0)
+ *result = NULL;
iterator_delete(it);
return rc;
}
diff --git a/test/engine/tree_min_max_count.result b/test/engine/tree_min_max_count.result
index 1dabdf36e..f55732aa6 100644
--- a/test/engine/tree_min_max_count.result
+++ b/test/engine/tree_min_max_count.result
@@ -86,11 +86,9 @@ index0:select()
...
index0:max(15)
---
-- [4, 'AAAA']
...
index0:min(15)
---
-- [20, 'AAAA']
...
index0:count(15)
---
@@ -135,11 +133,9 @@ index0:select()
...
index0:max(0)
---
-- [-2, 'AAAA']
...
index0:min(0)
---
-- [1, 'AAAA']
...
index0:count(0)
---
@@ -238,11 +234,9 @@ index1:select()
...
index1:max(15)
---
-- [4, 'AAAA']
...
index1:min(15)
---
-- [20, 'AAAA']
...
index1:count(15)
---
@@ -287,11 +281,9 @@ index1:select()
...
index1:max(0)
---
-- [-2, 'AAAA']
...
index1:min(0)
---
-- [1, 'AAAA']
...
index1:count(0)
---
@@ -447,11 +439,9 @@ index2:select()
...
index2:max('15')
---
-- ['1', 'AAAA']
...
index2:min('15')
---
-- ['2', 'AAAA']
...
index2:count('15')
---
@@ -496,11 +486,9 @@ index2:select()
...
index2:max('0')
---
-- ['-4', 'AAAA']
...
index2:min('0')
---
-- ['1', 'AAAA']
...
index2:count('0')
---
@@ -599,11 +587,9 @@ index3:select()
...
index3:max(15)
---
-- [4, 'AAAA']
...
index3:min(15)
---
-- [20, 'AAAA']
...
index3:count(15)
---
@@ -702,11 +688,9 @@ index4:select()
...
index4:max(15)
---
-- [4, 'AAAA']
...
index4:min(15)
---
-- [20, 'AAAA']
...
index4:count(15)
---
@@ -809,11 +793,9 @@ index4:select()
...
index4:max('15')
---
-- ['1', 'AAAA']
...
index4:min('15')
---
-- ['2', 'AAAA']
...
index4:count('15')
---
@@ -865,11 +847,9 @@ index4:select()
...
index4:max('0')
---
-- ['-4', 'AAAA']
...
index4:min('0')
---
-- ['1', 'AAAA']
...
index4:count('0')
---
@@ -924,11 +904,9 @@ index4:select()
...
index4:max(0)
---
-- [-2, 'AAAA']
...
index4:min(0)
---
-- [1, 'AAAA']
...
index4:count(0)
---
@@ -994,7 +972,6 @@ index5:count({1})
...
index5:max({1, 0})
---
-- [1, -4]
...
index5:min({1, 1})
---
@@ -1057,7 +1034,6 @@ index5:count({2})
...
index5:max({2, 0})
---
-- [2, -4]
...
index5:min({2, 1})
---
@@ -1126,7 +1102,6 @@ index6:count({1})
...
index6:max({1, '0'})
---
-- [1, '-4']
...
index6:min({1, '1'})
---
@@ -1189,7 +1164,6 @@ index6:count({2})
...
index6:max({2, '0'})
---
-- [2, '-4']
...
index6:min({2, '1'})
---
@@ -1276,11 +1250,9 @@ for i = 1, 1000 do space8:insert({i % 10, i, long_string}) end
...
index8:max({1, 100})
---
-- [1, 91, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA']
...
index8:max({2, 700})
---
-- [2, 692, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA']
...
index8:max({3})
---
@@ -1288,11 +1260,9 @@ index8:max({3})
...
index8:min({1, 10})
---
-- [1, 11, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA']
...
index8:min({1, 700})
---
-- [1, 701, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA']
...
index8:min({3})
---
--
2.14.3 (Apple Git-98)
More information about the Tarantool-patches
mailing list