[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