MDEV-35468 UUID primary key filtering return incorrect results

UUID::cmp() correctly compared:
- two swapped v1 UUIDs
- two non-swapped v6 UIDs

but v1 vs v6 were not compared correctly.

Adding a new method cmp_swap_noswap() and using
it in UUID::cmp() to compare two value of different swapness.
This commit is contained in:
Alexander Barkov
2024-11-29 19:04:06 +04:00
parent 3158af03bd
commit e551070ba4
3 changed files with 203 additions and 0 deletions

View File

@ -0,0 +1,101 @@
CREATE TABLE t1 (id UUID NOT NULL);
INSERT INTO t1 (`id`) VALUES ('e8748eee-fabe-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('036d4fc5-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('2acf42cc-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('594a8970-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('4238a6e5-fac1-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('6d001a4d-fac1-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('e4e67615-fad5-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('1ec69927-30f3-62ca-a0a0-4b98bb6957f8');
INSERT INTO t1 (`id`) VALUES ('1ec6992e-5c9e-6b2a-a21b-fbc054a2075e');
INSERT INTO t1 (`id`) VALUES ('1ec6992e-e5be-6342-8293-e107448b2cd5');
SELECT * FROM t1 WHERE id IN (
'036d4fc5-fabf-11eb-af18-005056bc575d',
'e8748eee-fabe-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e',
'1ec6992e-e5be-6342-8293-e107448b2cd5'
) ORDER BY id;
id
e8748eee-fabe-11eb-af18-005056bc575d
036d4fc5-fabf-11eb-af18-005056bc575d
2acf42cc-fabf-11eb-af18-005056bc575d
594a8970-fabf-11eb-af18-005056bc575d
4238a6e5-fac1-11eb-af18-005056bc575d
6d001a4d-fac1-11eb-af18-005056bc575d
e4e67615-fad5-11eb-af18-005056bc575d
1ec69927-30f3-62ca-a0a0-4b98bb6957f8
1ec6992e-5c9e-6b2a-a21b-fbc054a2075e
1ec6992e-e5be-6342-8293-e107448b2cd5
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e',
'1ec6992e-e5be-6342-8293-e107448b2cd5'
) ORDER BY id;
id
e8748eee-fabe-11eb-af18-005056bc575d
036d4fc5-fabf-11eb-af18-005056bc575d
2acf42cc-fabf-11eb-af18-005056bc575d
594a8970-fabf-11eb-af18-005056bc575d
4238a6e5-fac1-11eb-af18-005056bc575d
6d001a4d-fac1-11eb-af18-005056bc575d
e4e67615-fad5-11eb-af18-005056bc575d
1ec69927-30f3-62ca-a0a0-4b98bb6957f8
1ec6992e-5c9e-6b2a-a21b-fbc054a2075e
1ec6992e-e5be-6342-8293-e107448b2cd5
DROP TABLE t1;
CREATE TABLE t1 (id uuid);
INSERT INTO t1 (id) VALUES
('e8748eee-fabe-11eb-af18-005056bc575d'),
('036d4fc5-fabf-11eb-af18-005056bc575d');
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8'
) ORDER BY id;
id
e8748eee-fabe-11eb-af18-005056bc575d
036d4fc5-fabf-11eb-af18-005056bc575d
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d'
) ORDER BY id;
id
e8748eee-fabe-11eb-af18-005056bc575d
036d4fc5-fabf-11eb-af18-005056bc575d
SELECT * FROM t1 WHERE id IN (
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'e8748eee-fabe-11eb-af18-005056bc575d'
) ORDER BY id;
id
e8748eee-fabe-11eb-af18-005056bc575d
036d4fc5-fabf-11eb-af18-005056bc575d
DROP TABLE t1;

View File

@ -0,0 +1,82 @@
# Start of 10.11 tests
#
# MDEV-35468 UUID primary key filtering return incorrect results
#
CREATE TABLE t1 (id UUID NOT NULL);
INSERT INTO t1 (`id`) VALUES ('e8748eee-fabe-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('036d4fc5-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('2acf42cc-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('594a8970-fabf-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('4238a6e5-fac1-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('6d001a4d-fac1-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('e4e67615-fad5-11eb-af18-005056bc575d');
INSERT INTO t1 (`id`) VALUES ('1ec69927-30f3-62ca-a0a0-4b98bb6957f8');
INSERT INTO t1 (`id`) VALUES ('1ec6992e-5c9e-6b2a-a21b-fbc054a2075e');
INSERT INTO t1 (`id`) VALUES ('1ec6992e-e5be-6342-8293-e107448b2cd5');
SELECT * FROM t1 WHERE id IN (
'036d4fc5-fabf-11eb-af18-005056bc575d',
'e8748eee-fabe-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e',
'1ec6992e-e5be-6342-8293-e107448b2cd5'
) ORDER BY id;
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e',
'1ec6992e-e5be-6342-8293-e107448b2cd5'
) ORDER BY id;
DROP TABLE t1;
CREATE TABLE t1 (id uuid);
INSERT INTO t1 (id) VALUES
('e8748eee-fabe-11eb-af18-005056bc575d'),
('036d4fc5-fabf-11eb-af18-005056bc575d');
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8'
) ORDER BY id;
SELECT * FROM t1 WHERE id IN (
'e8748eee-fabe-11eb-af18-005056bc575d',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d'
) ORDER BY id;
SELECT * FROM t1 WHERE id IN (
'1ec69927-30f3-62ca-a0a0-4b98bb6957f8',
'036d4fc5-fabf-11eb-af18-005056bc575d',
'2acf42cc-fabf-11eb-af18-005056bc575d',
'594a8970-fabf-11eb-af18-005056bc575d',
'4238a6e5-fac1-11eb-af18-005056bc575d',
'6d001a4d-fac1-11eb-af18-005056bc575d',
'e4e67615-fad5-11eb-af18-005056bc575d',
'e8748eee-fabe-11eb-af18-005056bc575d'
) ORDER BY id;
DROP TABLE t1;
# End of 10.11 tests

View File

@ -154,6 +154,10 @@ public:
{
return memcmp(a + m_memory_pos, b + m_memory_pos, m_length);
}
int cmp_swap_noswap(const char *a, const char *b) const
{
return memcmp(a + m_memory_pos, b + m_record_pos, m_length);
}
void hash_record(const uchar *ptr, Hasher *hasher) const
{
hasher->add(&my_charset_bin, ptr + m_record_pos, m_length);
@ -236,6 +240,18 @@ public:
segment(4).hash_record(ptr, hasher);
}
static int cmp_swap_noswap(const LEX_CSTRING &a, const LEX_CSTRING &b)
{
int res;
if ((res= segment(4).cmp_swap_noswap(a.str, b.str)) ||
(res= segment(3).cmp_swap_noswap(a.str, b.str)) ||
(res= segment(2).cmp_swap_noswap(a.str, b.str)) ||
(res= segment(1).cmp_swap_noswap(a.str, b.str)) ||
(res= segment(0).cmp_swap_noswap(a.str, b.str)))
return res;
return 0;
}
// Compare two in-memory values
static int cmp(const LEX_CSTRING &a, const LEX_CSTRING &b)
{
@ -254,6 +270,10 @@ public:
return res;
return 0;
}
else if (swap_a && !swap_b)
return cmp_swap_noswap(a, b);
else if (!swap_a && swap_b)
return -cmp_swap_noswap(b, a);
return memcmp(a.str, b.str, binary_length());
}