diff --git a/src/box/tuple_compare.cc b/src/box/tuple_compare.cc index 8fd4a001cb425c8ee1e1e22832399c61666ff677..8e11ac5a8edc878732c19efe21f231c8e639c7a1 100644 --- a/src/box/tuple_compare.cc +++ b/src/box/tuple_compare.cc @@ -345,6 +345,17 @@ mp_compare_scalar(const char *field_a, const char *field_b) field_b, mp_typeof(*field_b)); } +static inline int +mp_compare_scalar_coll(const char *field_a, const char *field_b, + struct coll *coll) +{ + enum mp_type type_a = mp_typeof(*field_a); + enum mp_type type_b = mp_typeof(*field_b); + if (type_a == MP_STR && type_b == MP_STR) + return mp_compare_str_coll(field_a, field_b, coll); + return mp_compare_scalar_with_hint(field_a, type_a, field_b, type_b); +} + /** * @brief Compare two fields parts using a type definition * @param field_a field @@ -375,7 +386,9 @@ tuple_compare_field(const char *field_a, const char *field_b, case FIELD_TYPE_BOOLEAN: return mp_compare_bool(field_a, field_b); case FIELD_TYPE_SCALAR: - return mp_compare_scalar(field_a, field_b); + return coll != NULL ? + mp_compare_scalar_coll(field_a, field_b, coll) : + mp_compare_scalar(field_a, field_b); default: unreachable(); return 0; @@ -401,7 +414,9 @@ tuple_compare_field_with_hint(const char *field_a, enum mp_type a_type, return mp_compare_number_with_hint(field_a, a_type, field_b, b_type); case FIELD_TYPE_SCALAR: - return mp_compare_scalar_with_hint(field_a, a_type, + return coll != NULL ? + mp_compare_scalar_coll(field_a, field_b, coll) : + mp_compare_scalar_with_hint(field_a, a_type, field_b, b_type); default: unreachable(); diff --git a/test/box/misc.result b/test/box/misc.result index 29034ca79a0922b1cd961ead12cee1678f9a7b74..000f4aa31bdc5ab246895ac5450e35cd3f1afeec 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -1033,3 +1033,40 @@ s:create_index('test5', {parts = {{5, 'string', collation = 'Unicode'}}}).parts s:drop() --- ... +s = box.schema.space.create('test') +--- +... +not not s:create_index('test1', {parts = {{1, 'scalar', collation = 'unicode_s1'}}}) +--- +- true +... +s:replace{1} s:replace{1.1} s:replace{false} +--- +... +s:replace{'Блин'} s:replace{'Ðж'} s:replace{'ешь'} s:replace{'Же'} s:replace{'Уже'} +--- +... +s:replace{'drop'} s:replace{'table'} s:replace{'users'} +--- +... +s:select{} +--- +- - [false] + - [1] + - [1.1] + - ['drop'] + - ['table'] + - ['users'] + - ['Блин'] + - ['Ðж'] + - ['ешь'] + - ['Же'] + - ['Уже'] +... +s:select{'еж'} +--- +- - ['Ðж'] +... +s:drop() +--- +... diff --git a/test/box/misc.test.lua b/test/box/misc.test.lua index 2235c99cd972f0da1594ece2a0777ab5cee25266..cac688d499e0a9bd9566cdfb874e21f563a1c8e9 100644 --- a/test/box/misc.test.lua +++ b/test/box/misc.test.lua @@ -281,3 +281,12 @@ not not s:create_index('test3', {parts = {{3, 'string', collation = 'UnIcOdE'}}} s:create_index('test4', {parts = {{4, 'string'}}}).parts s:create_index('test5', {parts = {{5, 'string', collation = 'Unicode'}}}).parts s:drop() + +s = box.schema.space.create('test') +not not s:create_index('test1', {parts = {{1, 'scalar', collation = 'unicode_s1'}}}) +s:replace{1} s:replace{1.1} s:replace{false} +s:replace{'Блин'} s:replace{'Ðж'} s:replace{'ешь'} s:replace{'Же'} s:replace{'Уже'} +s:replace{'drop'} s:replace{'table'} s:replace{'users'} +s:select{} +s:select{'еж'} +s:drop()