Skip to content

Commit 2fe269f

Browse files
StefanoPetrillivuvova
authored andcommitted
MDEV-32637 Implement native UUID7 function
1 parent ae69ac2 commit 2fe269f

19 files changed

+549
-4
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
include/master-slave.inc
2+
[connection master]
3+
#
4+
# MDEV-32637 Implement native UUID7 function
5+
#
6+
connection master;
7+
CREATE TABLE test.t1 (a INT, blob_column LONGBLOB, vchar_column VARCHAR(100), PRIMARY KEY(a)) engine=myisam;
8+
INSERT INTO test.t1 VALUES(1,UUIDv7(),UUIDv7());
9+
create procedure test.p1()
10+
begin
11+
INSERT INTO test.t1 VALUES(2,UUIDv7(),UUIDv7());
12+
INSERT INTO test.t1 VALUES(3,UUIDv7(),UUIDv7());
13+
end|
14+
CALL test.p1();
15+
create function test.fn1(x int)
16+
returns int
17+
begin
18+
insert into t1 values (4+x,UUIDv7(),UUIDv7());
19+
insert into t1 values (5+x,UUIDv7(),UUIDv7());
20+
return 0;
21+
end|
22+
select fn1(0);
23+
fn1(0)
24+
0
25+
create table t2 (a int) engine=myisam;
26+
insert into t2 values(fn1(2));
27+
connection slave;
28+
SHOW CREATE TABLE test.t1;
29+
Table Create Table
30+
t1 CREATE TABLE `t1` (
31+
`a` int(11) NOT NULL,
32+
`blob_column` longblob DEFAULT NULL,
33+
`vchar_column` varchar(100) DEFAULT NULL,
34+
PRIMARY KEY (`a`)
35+
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
36+
connection master;
37+
DROP PROCEDURE test.p1;
38+
DROP FUNCTION test.fn1;
39+
DROP TABLE test.t1;
40+
DROP TABLE test.t2;
41+
# End of 11.7 tests
42+
include/rpl_end.inc
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
--source include/have_binlog_format_row.inc
2+
--source include/master-slave.inc
3+
4+
--echo #
5+
--echo # MDEV-32637 Implement native UUID7 function
6+
--echo #
7+
8+
connection master;
9+
10+
# Start the actual test
11+
12+
CREATE TABLE test.t1 (a INT, blob_column LONGBLOB, vchar_column VARCHAR(100), PRIMARY KEY(a)) engine=myisam;
13+
INSERT INTO test.t1 VALUES(1,UUIDv7(),UUIDv7());
14+
delimiter |;
15+
create procedure test.p1()
16+
begin
17+
INSERT INTO test.t1 VALUES(2,UUIDv7(),UUIDv7());
18+
INSERT INTO test.t1 VALUES(3,UUIDv7(),UUIDv7());
19+
end|
20+
delimiter ;|
21+
22+
CALL test.p1();
23+
24+
delimiter |;
25+
create function test.fn1(x int)
26+
returns int
27+
begin
28+
insert into t1 values (4+x,UUIDv7(),UUIDv7());
29+
insert into t1 values (5+x,UUIDv7(),UUIDv7());
30+
return 0;
31+
end|
32+
33+
delimiter ;|
34+
# test both in SELECT and in INSERT
35+
--disable_ps2_protocol
36+
select fn1(0);
37+
--enable_ps2_protocol
38+
create table t2 (a int) engine=myisam;
39+
insert into t2 values(fn1(2));
40+
41+
sync_slave_with_master;
42+
SHOW CREATE TABLE test.t1;
43+
44+
# Dump the databases and so we can see if they match
45+
# Another method would be to use SELECT INTO OUTFILE on master,
46+
# then LOAD DATA INFILE in slave, and use a query to compare.
47+
# This would have the advantage that it would not assume
48+
# the system has a 'diff'
49+
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_master.sql
50+
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_slave.sql
51+
52+
connection master;
53+
54+
DROP PROCEDURE test.p1;
55+
DROP FUNCTION test.fn1;
56+
DROP TABLE test.t1;
57+
DROP TABLE test.t2;
58+
59+
# Let's compare. Note: If they match test will pass, if they do not match
60+
# the test will show that the diff statement failed and not reject file
61+
# will be created. You will need to go to the mysql-test dir and diff
62+
# the files your self to see what is not matching :-)
63+
64+
diff_files $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_master.sql $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_slave.sql;
65+
66+
remove_file $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_master.sql;
67+
remove_file $MYSQLTEST_VARDIR/tmp/rpl_row_UUIDv7_slave.sql;
68+
69+
--echo # End of 11.7 tests
70+
71+
--source include/rpl_end.inc

mysys/my_init.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,8 @@ PSI_mutex_key key_BITMAP_mutex, key_IO_CACHE_append_buffer_lock,
469469
key_THR_LOCK_lock, key_THR_LOCK_malloc,
470470
key_THR_LOCK_mutex, key_THR_LOCK_myisam, key_THR_LOCK_net,
471471
key_THR_LOCK_open, key_THR_LOCK_threads,
472-
key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap, key_LOCK_uuid_generator;
472+
key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap, key_LOCK_uuid_generator,
473+
key_LOCK_uuid_v7_generator;
473474

474475
static PSI_mutex_info all_mysys_mutexes[]=
475476
{
@@ -496,7 +497,8 @@ static PSI_mutex_info all_mysys_mutexes[]=
496497
{ &key_THR_LOCK_threads, "THR_LOCK_threads", PSI_FLAG_GLOBAL},
497498
{ &key_TMPDIR_mutex, "TMPDIR_mutex", PSI_FLAG_GLOBAL},
498499
{ &key_THR_LOCK_myisam_mmap, "THR_LOCK_myisam_mmap", PSI_FLAG_GLOBAL},
499-
{ &key_LOCK_uuid_generator, "LOCK_uuid_generator", PSI_FLAG_GLOBAL }
500+
{ &key_LOCK_uuid_generator, "LOCK_uuid_generator", PSI_FLAG_GLOBAL },
501+
{ &key_LOCK_uuid_v7_generator, "LOCK_uuid_v7_generator", PSI_FLAG_GLOBAL }
500502
};
501503

502504
PSI_cond_key key_COND_timer, key_IO_CACHE_SHARE_cond,

mysys/mysys_priv.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ extern PSI_mutex_key key_BITMAP_mutex, key_IO_CACHE_append_buffer_lock,
4848
key_THR_LOCK_lock, key_THR_LOCK_malloc,
4949
key_THR_LOCK_mutex, key_THR_LOCK_myisam, key_THR_LOCK_net,
5050
key_THR_LOCK_open, key_THR_LOCK_threads, key_LOCK_uuid_generator,
51-
key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap, key_LOCK_timer;
51+
key_LOCK_uuid_v7_generator, key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap,
52+
key_LOCK_timer;
5253

5354
extern PSI_cond_key key_COND_timer, key_IO_CACHE_SHARE_cond,
5455
key_IO_CACHE_SHARE_cond_writer, key_my_thread_var_suspend,

plugin/type_uuid/item_uuidfunc.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "item.h"
2121
#include "sql_type_uuid_v1.h"
2222
#include "sql_type_uuid_v4.h"
23+
#include "sql_type_uuid_v7.h"
2324

2425
class Item_func_sys_guid: public Item_str_func
2526
{
@@ -102,4 +103,16 @@ class Item_func_uuid_v4: public Item_func_uuid_vx<UUIDv4>
102103
{ return get_item_copy<Item_func_uuid_v4>(thd, this); }
103104
};
104105

106+
class Item_func_uuid_v7: public Item_func_uuid_vx<UUIDv7>
107+
{
108+
public:
109+
using Item_func_uuid_vx::Item_func_uuid_vx;
110+
LEX_CSTRING func_name_cstring() const override
111+
{
112+
static LEX_CSTRING name= {STRING_WITH_LEN("uuidv7") };
113+
return name;
114+
}
115+
Item *do_get_copy(THD *thd) const override
116+
{ return get_item_copy<Item_func_uuid_v7>(thd, this); }
117+
};
105118
#endif // ITEM_UUIDFUNC_INCLUDED
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#
2+
# MDEV-33827 UUID() returns a NULL-able result
3+
#
4+
CREATE TABLE t1 AS SELECT UUIDv7();
5+
SHOW CREATE TABLE t1;
6+
Table Create Table
7+
t1 CREATE TABLE `t1` (
8+
`UUIDv7()` uuid NOT NULL
9+
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
10+
DROP TABLE t1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
--echo #
2+
--echo # MDEV-33827 UUID() returns a NULL-able result
3+
--echo #
4+
5+
CREATE TABLE t1 AS SELECT UUIDv7();
6+
SHOW CREATE TABLE t1;
7+
DROP TABLE t1;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
SET debug_dbug="+d,simulate_uuidv7_my_random_bytes_failure";
2+
#
3+
# Start of 11.7 tests
4+
#
5+
#
6+
# MDEV-32637 Implement native UUID7 function
7+
#
8+
CREATE TABLE t1 (
9+
a int primary key not null,
10+
u UUID DEFAULT UUIDv7(),
11+
unique key(u)
12+
);
13+
INSERT INTO t1(a) SELECT seq FROM seq_1_to_16;
14+
Warnings:
15+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
16+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
17+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
18+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
19+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
20+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
21+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
22+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
23+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
24+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
25+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
26+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
27+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
28+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
29+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
30+
Note 1105 UUIDv7 generation failed; using a my_rnd fallback
31+
SELECT COUNT(DISTINCT u) AS distinct_uuid_count FROM t1;
32+
distinct_uuid_count
33+
16
34+
SELECT
35+
u REGEXP '[a-f0-9]{8}-[a-f0-9]{4}-7[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}' AS is_correct_version_and_revision,
36+
COUNT(*)
37+
FROM t1 GROUP BY is_correct_version_and_revision;
38+
is_correct_version_and_revision COUNT(*)
39+
1 16
40+
DROP TABLE t1;
41+
#
42+
# End of 11.7 tests
43+
#
44+
SET debug_dbug="";
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--source include/have_debug.inc
2+
3+
SET debug_dbug="+d,simulate_uuidv7_my_random_bytes_failure";
4+
5+
source include/have_sequence.inc;
6+
7+
--echo #
8+
--echo # Start of 11.7 tests
9+
--echo #
10+
11+
--echo #
12+
--echo # MDEV-32637 Implement native UUID7 function
13+
--echo #
14+
15+
CREATE TABLE t1 (
16+
a int primary key not null,
17+
u UUID DEFAULT UUIDv7(),
18+
unique key(u)
19+
);
20+
INSERT INTO t1(a) SELECT seq FROM seq_1_to_16;
21+
SELECT COUNT(DISTINCT u) AS distinct_uuid_count FROM t1;
22+
SELECT
23+
u REGEXP '[a-f0-9]{8}-[a-f0-9]{4}-7[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}' AS is_correct_version_and_revision,
24+
COUNT(*)
25+
FROM t1 GROUP BY is_correct_version_and_revision;
26+
DROP TABLE t1;
27+
28+
--echo #
29+
--echo # End of 11.7 tests
30+
--echo #
31+
32+
SET debug_dbug="";
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#
2+
# Start of 11.7 tests
3+
#
4+
#
5+
# MDEV-32637 Implement native UUID7 function
6+
#
7+
SELECT
8+
'----' AS `----`,
9+
PLUGIN_NAME,
10+
PLUGIN_VERSION,
11+
PLUGIN_STATUS,
12+
PLUGIN_TYPE,
13+
PLUGIN_AUTHOR,
14+
PLUGIN_DESCRIPTION,
15+
PLUGIN_LICENSE,
16+
PLUGIN_MATURITY,
17+
PLUGIN_AUTH_VERSION
18+
FROM INFORMATION_SCHEMA.PLUGINS
19+
WHERE PLUGIN_TYPE='FUNCTION'
20+
AND PLUGIN_NAME IN
21+
('uuidv7')
22+
ORDER BY PLUGIN_NAME;
23+
---- ----
24+
PLUGIN_NAME uuidv7
25+
PLUGIN_VERSION 1.0
26+
PLUGIN_STATUS ACTIVE
27+
PLUGIN_TYPE FUNCTION
28+
PLUGIN_AUTHOR Stefano Petrilli
29+
PLUGIN_DESCRIPTION Function UUIDv7()
30+
PLUGIN_LICENSE GPL
31+
PLUGIN_MATURITY Experimental
32+
PLUGIN_AUTH_VERSION 1.0
33+
#
34+
# End of 11.7 tests
35+
#

0 commit comments

Comments
 (0)