From ef84f8137b7c150635c23e1493f8620a4c8527ef Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 17 May 2023 16:14:24 +0200 Subject: [PATCH] MDEV-29959 UUID Sorting * UUIDs version >= 6 are now stored without byte-swapping * UUIDs with version >=8 and variant=0 are now considered invalid * old tables are supported * old (always byte swapped) and new (swapped for version < 6) UUIDs can be compared and converted transparently --- plugin/type_uuid/item_uuidfunc.cc | 2 +- .../mysql-test/type_uuid/order.result | 425 ++++++++++++ .../type_uuid/mysql-test/type_uuid/order.test | 26 + .../type_uuid/std_data/mdev-29959.MYD | Bin 0 -> 1344 bytes .../type_uuid/std_data/mdev-29959.MYI | Bin 0 -> 2048 bytes .../type_uuid/std_data/mdev-29959.frm | Bin 0 -> 967 bytes .../mysql-test/type_uuid/type_uuid.result | 606 +++++++++--------- .../type_uuid/type_uuid_memory.result | 8 +- .../type_uuid/type_uuid_myisam.result | 10 +- plugin/type_uuid/plugin.cc | 86 ++- plugin/type_uuid/sql_type_uuid.h | 66 +- sql/sql_type_fixedbin.h | 6 +- 12 files changed, 906 insertions(+), 329 deletions(-) create mode 100644 plugin/type_uuid/mysql-test/type_uuid/order.result create mode 100644 plugin/type_uuid/mysql-test/type_uuid/order.test create mode 100644 plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYD create mode 100644 plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYI create mode 100644 plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.frm diff --git a/plugin/type_uuid/item_uuidfunc.cc b/plugin/type_uuid/item_uuidfunc.cc index 6234e04ee2d..3f2b7434f73 100644 --- a/plugin/type_uuid/item_uuidfunc.cc +++ b/plugin/type_uuid/item_uuidfunc.cc @@ -33,7 +33,7 @@ String *Item_func_sys_guid::val_str(String *str) const Type_handler *Item_func_uuid::type_handler() const { - return UUIDBundle::singleton(); + return Type_handler_uuid_new::singleton(); } bool Item_func_uuid::val_native(THD *, Native *to) diff --git a/plugin/type_uuid/mysql-test/type_uuid/order.result b/plugin/type_uuid/mysql-test/type_uuid/order.result new file mode 100644 index 00000000000..7266bbbb9eb --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/order.result @@ -0,0 +1,425 @@ +create table t1 (a uuid, b int not null, index (a)); +insert t1 select sformat('11223344-5566-{:x}777-{}888-99aabbccddee', seq div 4, elt(1+(seq % 4),0,8,'c','e')),seq from seq_0_to_63; +Warnings: +Warning 1292 Incorrect uuid value: '11223344-5566-8777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 33 +Warning 1292 Incorrect uuid value: '11223344-5566-9777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 37 +Warning 1292 Incorrect uuid value: '11223344-5566-a777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 41 +Warning 1292 Incorrect uuid value: '11223344-5566-b777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 45 +Warning 1292 Incorrect uuid value: '11223344-5566-c777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 49 +Warning 1292 Incorrect uuid value: '11223344-5566-d777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 53 +Warning 1292 Incorrect uuid value: '11223344-5566-e777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 57 +Warning 1292 Incorrect uuid value: '11223344-5566-f777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 61 +select * from t1; +a b +11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-5777-e888-99aabbccddee 23 +11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-7777-e888-99aabbccddee 31 +NULL 32 +11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-8777-e888-99aabbccddee 35 +NULL 36 +11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-9777-e888-99aabbccddee 39 +NULL 40 +11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-a777-e888-99aabbccddee 43 +NULL 44 +11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-b777-e888-99aabbccddee 47 +NULL 48 +11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-c777-e888-99aabbccddee 51 +NULL 52 +11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-d777-e888-99aabbccddee 55 +NULL 56 +11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-e777-e888-99aabbccddee 59 +NULL 60 +11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-f777-e888-99aabbccddee 63 +select * from t1 order by a; +a b +NULL 40 +NULL 32 +NULL 36 +NULL 44 +NULL 48 +NULL 52 +NULL 56 +NULL 60 +11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-7777-e888-99aabbccddee 31 +11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-8777-e888-99aabbccddee 35 +11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-9777-e888-99aabbccddee 39 +11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-a777-e888-99aabbccddee 43 +11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-b777-e888-99aabbccddee 47 +11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-c777-e888-99aabbccddee 51 +11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-d777-e888-99aabbccddee 55 +11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-e777-e888-99aabbccddee 59 +11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-f777-e888-99aabbccddee 63 +11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-e888-99aabbccddee 23 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +# now let's use the table as above, but created in 10.11.4 +select * from t2; +a b +11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-5777-e888-99aabbccddee 23 +11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-7777-e888-99aabbccddee 31 +11223344-5566-8777-0888-99aabbccddee 32 +11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-8777-e888-99aabbccddee 35 +11223344-5566-9777-0888-99aabbccddee 36 +11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-9777-e888-99aabbccddee 39 +11223344-5566-a777-0888-99aabbccddee 40 +11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-a777-e888-99aabbccddee 43 +11223344-5566-b777-0888-99aabbccddee 44 +11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-b777-e888-99aabbccddee 47 +11223344-5566-c777-0888-99aabbccddee 48 +11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-c777-e888-99aabbccddee 51 +11223344-5566-d777-0888-99aabbccddee 52 +11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-d777-e888-99aabbccddee 55 +11223344-5566-e777-0888-99aabbccddee 56 +11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-e777-e888-99aabbccddee 59 +11223344-5566-f777-0888-99aabbccddee 60 +11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-f777-e888-99aabbccddee 63 +select * from t2 order by a; +a b +11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-8777-0888-99aabbccddee 32 +11223344-5566-9777-0888-99aabbccddee 36 +11223344-5566-a777-0888-99aabbccddee 40 +11223344-5566-b777-0888-99aabbccddee 44 +11223344-5566-c777-0888-99aabbccddee 48 +11223344-5566-d777-0888-99aabbccddee 52 +11223344-5566-e777-0888-99aabbccddee 56 +11223344-5566-f777-0888-99aabbccddee 60 +11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-e888-99aabbccddee 23 +11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-e888-99aabbccddee 31 +11223344-5566-8777-e888-99aabbccddee 35 +11223344-5566-9777-e888-99aabbccddee 39 +11223344-5566-a777-e888-99aabbccddee 43 +11223344-5566-b777-e888-99aabbccddee 47 +11223344-5566-c777-e888-99aabbccddee 51 +11223344-5566-d777-e888-99aabbccddee 55 +11223344-5566-e777-e888-99aabbccddee 59 +11223344-5566-f777-e888-99aabbccddee 63 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +select * from t1, t2 where t1.a=t2.a; +a b a b +11223344-5566-0777-0888-99aabbccddee 0 11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-0777-8888-99aabbccddee 1 11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-0777-c888-99aabbccddee 2 11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-0777-e888-99aabbccddee 3 11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-0888-99aabbccddee 4 11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-1777-8888-99aabbccddee 5 11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-1777-c888-99aabbccddee 6 11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-1777-e888-99aabbccddee 7 11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-0888-99aabbccddee 8 11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-2777-8888-99aabbccddee 9 11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-2777-c888-99aabbccddee 10 11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-2777-e888-99aabbccddee 11 11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-0888-99aabbccddee 12 11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-3777-8888-99aabbccddee 13 11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-3777-c888-99aabbccddee 14 11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-3777-e888-99aabbccddee 15 11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-0888-99aabbccddee 16 11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-4777-8888-99aabbccddee 17 11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-4777-c888-99aabbccddee 18 11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-4777-e888-99aabbccddee 19 11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-0888-99aabbccddee 20 11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-5777-8888-99aabbccddee 21 11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-5777-c888-99aabbccddee 22 11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-5777-e888-99aabbccddee 23 11223344-5566-5777-e888-99aabbccddee 23 +11223344-5566-6777-0888-99aabbccddee 24 11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-6777-8888-99aabbccddee 25 11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-6777-c888-99aabbccddee 26 11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-6777-e888-99aabbccddee 27 11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-0888-99aabbccddee 28 11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-7777-8888-99aabbccddee 29 11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-7777-c888-99aabbccddee 30 11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-7777-e888-99aabbccddee 31 11223344-5566-7777-e888-99aabbccddee 31 +11223344-5566-8777-8888-99aabbccddee 33 11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-8777-c888-99aabbccddee 34 11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-8777-e888-99aabbccddee 35 11223344-5566-8777-e888-99aabbccddee 35 +11223344-5566-9777-8888-99aabbccddee 37 11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-9777-c888-99aabbccddee 38 11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-9777-e888-99aabbccddee 39 11223344-5566-9777-e888-99aabbccddee 39 +11223344-5566-a777-8888-99aabbccddee 41 11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-a777-c888-99aabbccddee 42 11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-a777-e888-99aabbccddee 43 11223344-5566-a777-e888-99aabbccddee 43 +11223344-5566-b777-8888-99aabbccddee 45 11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-b777-c888-99aabbccddee 46 11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-b777-e888-99aabbccddee 47 11223344-5566-b777-e888-99aabbccddee 47 +11223344-5566-c777-8888-99aabbccddee 49 11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-c777-c888-99aabbccddee 50 11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-c777-e888-99aabbccddee 51 11223344-5566-c777-e888-99aabbccddee 51 +11223344-5566-d777-8888-99aabbccddee 53 11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-d777-c888-99aabbccddee 54 11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-d777-e888-99aabbccddee 55 11223344-5566-d777-e888-99aabbccddee 55 +11223344-5566-e777-8888-99aabbccddee 57 11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-e777-c888-99aabbccddee 58 11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-e777-e888-99aabbccddee 59 11223344-5566-e777-e888-99aabbccddee 59 +11223344-5566-f777-8888-99aabbccddee 61 11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-f777-c888-99aabbccddee 62 11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-f777-e888-99aabbccddee 63 11223344-5566-f777-e888-99aabbccddee 63 +select * from t1 union select * from t2; +a b +11223344-5566-0777-0888-99aabbccddee 0 +11223344-5566-0777-8888-99aabbccddee 1 +11223344-5566-0777-c888-99aabbccddee 2 +11223344-5566-0777-e888-99aabbccddee 3 +11223344-5566-1777-0888-99aabbccddee 4 +11223344-5566-1777-8888-99aabbccddee 5 +11223344-5566-1777-c888-99aabbccddee 6 +11223344-5566-1777-e888-99aabbccddee 7 +11223344-5566-2777-0888-99aabbccddee 8 +11223344-5566-2777-8888-99aabbccddee 9 +11223344-5566-2777-c888-99aabbccddee 10 +11223344-5566-2777-e888-99aabbccddee 11 +11223344-5566-3777-0888-99aabbccddee 12 +11223344-5566-3777-8888-99aabbccddee 13 +11223344-5566-3777-c888-99aabbccddee 14 +11223344-5566-3777-e888-99aabbccddee 15 +11223344-5566-4777-0888-99aabbccddee 16 +11223344-5566-4777-8888-99aabbccddee 17 +11223344-5566-4777-c888-99aabbccddee 18 +11223344-5566-4777-e888-99aabbccddee 19 +11223344-5566-5777-0888-99aabbccddee 20 +11223344-5566-5777-8888-99aabbccddee 21 +11223344-5566-5777-c888-99aabbccddee 22 +11223344-5566-5777-e888-99aabbccddee 23 +11223344-5566-6777-0888-99aabbccddee 24 +11223344-5566-6777-8888-99aabbccddee 25 +11223344-5566-6777-c888-99aabbccddee 26 +11223344-5566-6777-e888-99aabbccddee 27 +11223344-5566-7777-0888-99aabbccddee 28 +11223344-5566-7777-8888-99aabbccddee 29 +11223344-5566-7777-c888-99aabbccddee 30 +11223344-5566-7777-e888-99aabbccddee 31 +11223344-5566-8777-8888-99aabbccddee 33 +11223344-5566-8777-c888-99aabbccddee 34 +11223344-5566-8777-e888-99aabbccddee 35 +11223344-5566-9777-8888-99aabbccddee 37 +11223344-5566-9777-c888-99aabbccddee 38 +11223344-5566-9777-e888-99aabbccddee 39 +11223344-5566-a777-8888-99aabbccddee 41 +11223344-5566-a777-c888-99aabbccddee 42 +11223344-5566-a777-e888-99aabbccddee 43 +11223344-5566-b777-8888-99aabbccddee 45 +11223344-5566-b777-c888-99aabbccddee 46 +11223344-5566-b777-e888-99aabbccddee 47 +11223344-5566-c777-8888-99aabbccddee 49 +11223344-5566-c777-c888-99aabbccddee 50 +11223344-5566-c777-e888-99aabbccddee 51 +11223344-5566-d777-8888-99aabbccddee 53 +11223344-5566-d777-c888-99aabbccddee 54 +11223344-5566-d777-e888-99aabbccddee 55 +11223344-5566-e777-8888-99aabbccddee 57 +11223344-5566-e777-c888-99aabbccddee 58 +11223344-5566-e777-e888-99aabbccddee 59 +11223344-5566-f777-8888-99aabbccddee 61 +11223344-5566-f777-c888-99aabbccddee 62 +11223344-5566-f777-e888-99aabbccddee 63 +NULL 32 +NULL 36 +NULL 40 +NULL 44 +NULL 48 +NULL 52 +NULL 56 +NULL 60 +alter ignore table t2 force; +Warnings: +Warning 1292 Incorrect uuid value: '11223344-5566-8777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 33 +Warning 1292 Incorrect uuid value: '11223344-5566-9777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 37 +Warning 1292 Incorrect uuid value: '11223344-5566-a777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 41 +Warning 1292 Incorrect uuid value: '11223344-5566-b777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 45 +Warning 1292 Incorrect uuid value: '11223344-5566-c777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 49 +Warning 1292 Incorrect uuid value: '11223344-5566-d777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 53 +Warning 1292 Incorrect uuid value: '11223344-5566-e777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 57 +Warning 1292 Incorrect uuid value: '11223344-5566-f777-0888-99aabbccddee' for column `test`.`t2`.`a` at row 61 +drop table t1, t2; diff --git a/plugin/type_uuid/mysql-test/type_uuid/order.test b/plugin/type_uuid/mysql-test/type_uuid/order.test new file mode 100644 index 00000000000..154d2bde523 --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/order.test @@ -0,0 +1,26 @@ +# try all combinations of version and variant +source include/have_sequence.inc; + +create table t1 (a uuid, b int not null, index (a)); +insert t1 select sformat('11223344-5566-{:x}777-{}888-99aabbccddee', seq div 4, elt(1+(seq % 4),0,8,'c','e')),seq from seq_0_to_63; +select * from t1; +select * from t1 order by a; +show create table t1; + +--echo # now let's use the table as above, but created in 10.11.4 +let $datadir= `select @@datadir`; +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.frm $datadir/test/t2.frm +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYI $datadir/test/t2.MYI +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYD $datadir/test/t2.MYD +select * from t2; +select * from t2 order by a; +show create table t2; + +select * from t1, t2 where t1.a=t2.a; + +--sorted_result +select * from t1 union select * from t2; + +alter ignore table t2 force; + +drop table t1, t2; diff --git a/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYD b/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYD new file mode 100644 index 0000000000000000000000000000000000000000..138a08deeb789c0e9c5fc59c0292687f8bea95df GIT binary patch literal 1344 zcmYMsw@m{85QSl~kBmts2NO)rIW|a4fY<;=@CdvO5ECG=00jeZ1w9otSJ6^g!V;(V z{_-pS+SAM1$JdXcP`$Y;mUpij>ec=c#73bLn}k7Z78*+VY!QOkDs*C-Fo*@Ap^{G% zg4ix}Vuvt@okGK5KD&e6@p%bTsL7WyE9`ZRO1aVgA#Ii7mb3(&oKIerX zE(o2tC=6mnXn4-&k`TmYp%YhxL0lCYUh}yo1aV#H#0_B(H-(1xd~OLr+!i`-Y!D%Sk@~ literal 0 HcmV?d00001 diff --git a/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYI b/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.MYI new file mode 100644 index 0000000000000000000000000000000000000000..6dde55b27da5d211f3332e10d771faa6dcf78da1 GIT binary patch literal 2048 zcmeIyJ5Rz;6bJBgTcABYK|y?=B0lgfii&SKnD_~dgDX)7cRqq7egNa>U`(9c99&Iw zaB*^S*2&ckye$>Ze=x?;gxmJE|9ft4`|Hqh*-~VveY&9n-IF4{+qx&pRNP)S$Ls5z zQ}J7M$o4Bir#|JUtHi0U680AA5ySXT1f=^^j@|lbyd?n*J-^w`64>D%> zMaD&blW~PVW!$hzC{`#AqL@+KisA^0V<_%HaX*TOP&|s_2^7zucpk+|C|*VJruB$o z1H~Z}H=(!<#T_W_LUAvO2T+_s@feCHQ9O&{1r#r%cn!r{);o$#6k8~6MsYieJ5d}* eaUY5YQ9O*|G>WHCJcr^eigPGlM{)j-|C}$K_sPlt literal 0 HcmV?d00001 diff --git a/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.frm b/plugin/type_uuid/mysql-test/type_uuid/std_data/mdev-29959.frm new file mode 100644 index 0000000000000000000000000000000000000000..d03c730aff7d01664b41d0747200e8b67c72120e GIT binary patch literal 967 zcmeyz$i*qkkjTKuaGaTe;U}Xg0~|0(GjK34u!8tN8UlVYGBAATVq_422`~s;ULv?% z+Enn}ZlgPjF-H`Fn%EdvN=q|SSQ#1WnHU%tfjU?ioPj!k349jqc6nE9*iEKWHEvPFh4Np1F='00000000-0000-0000-0000-0000000000fe'; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 17 NULL 3 Using where; Using index +1 SIMPLE t1 range a a 17 NULL 28 Using where; Using index SELECT * FROM t1 WHERE a>='garbage'; a EXPLAIN SELECT * FROM t1 WHERE a>='garbage'; @@ -64,7 +64,7 @@ EXPLAIN SELECT * FROM t1 WHERE a IN '00000000-0000-0000-0000-0000000000f0' ); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 17 NULL 4 Using where; Using index +1 SIMPLE t1 range a a 17 NULL 3 Using where; Using index SELECT * FROM t1 WHERE a IN ( '00000000-0000-0000-0000-000000000080', @@ -96,7 +96,7 @@ EXPLAIN SELECT * FROM t1 WHERE a BETWEEN '00000000-0000-0000-0000-000000000080' AND '00000000-0000-0000-0000-000000000081'; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index +1 SIMPLE t1 range a a 17 NULL 1 Using where; Using index SELECT * FROM t1 WHERE a BETWEEN '00000000-0000-0000-0000-000000000080' AND 'garbage'; @@ -111,7 +111,7 @@ a 00000000-0000-0000-0000-0000000000ff EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID); id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t1 ref a a 17 const 1 100.00 Using where; Using index +1 SIMPLE t1 ref a a 17 const 7 100.00 Using where; Using index Warnings: Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-0000000000ff' DROP TABLE t1; diff --git a/plugin/type_uuid/plugin.cc b/plugin/type_uuid/plugin.cc index e5b0cd9be70..499019e948c 100644 --- a/plugin/type_uuid/plugin.cc +++ b/plugin/type_uuid/plugin.cc @@ -21,12 +21,83 @@ #include #include +/* + The whole purpose of this Type_handler_uuid_dispatcher is to choose + whether the field should use Type_handler_uuid_new or Type_handler_uuid_old + based on the version of MariaDB that created the table. + When created every field will use either Type_handler_uuid_new or _old. + Literals and functions always use _new. +*/ +class Type_handler_uuid_dispatcher: public Type_handler_uuid_new +{ +public: + Field *make_table_field_from_def(TABLE_SHARE *share, MEM_ROOT *root, + const LEX_CSTRING *name, const Record_addr &addr, + const Bit_addr &bit, + const Column_definition_attributes *attr, + uint32 flags) const override + { + bool new_uuid= share->mysql_version == 0 || + (share->mysql_version >= 100908 && share->mysql_version < 100999) || + (share->mysql_version >= 101006 && share->mysql_version < 101099) || + (share->mysql_version >= 101105 && share->mysql_version < 101199) || + (share->mysql_version >= 110003 && share->mysql_version < 110099) || + (share->mysql_version >= 110102 && share->mysql_version < 110199) || + share->mysql_version >= 110201; + static Type_handler *th[]= { + Type_handler_uuid_old::singleton(), Type_handler_uuid_new::singleton() + }; + return th[new_uuid]-> + make_table_field_from_def(share, root, name, addr, bit, attr, flags); + } +}; + +static Type_handler_uuid_dispatcher type_handler_uuid_dispatcher; + static struct st_mariadb_data_type plugin_descriptor_type_uuid= { MariaDB_DATA_TYPE_INTERFACE_VERSION, - UUIDBundle::singleton() + &type_handler_uuid_dispatcher }; + +const Type_handler *Type_collection_uuid::find_in_array(const Type_handler *a, + const Type_handler *b, + bool for_cmp) const +{ + if (a == b) return a; + + /* + in the search below we'll find if we can convert `b` to `a`. + So, if one of the arguments is uuid and the other is not, + we should put uuid type in `a` and not-uuid in `b`. And if one type is + new uuid and the other is old uuid, new uuid should be in `a` + */ + if (a != Type_handler_uuid_new::singleton() && b->type_collection() == this) + std::swap(a, b); + + DBUG_ASSERT(a != &type_handler_uuid_dispatcher); + DBUG_ASSERT(b != &type_handler_uuid_dispatcher); + + /* + Search in the array for an element, equal to `b`. + If found - return `a`, if not found - return NULL. + Array is terminated by `a`. + */ + static const Type_handler *arr[]={ &type_handler_varchar, + &type_handler_string, &type_handler_tiny_blob, &type_handler_blob, + &type_handler_medium_blob, &type_handler_hex_hybrid, + // in aggregate_for_comparison() all types above cannot happen, + // so we'll start the search from here: + &type_handler_null, &type_handler_long_blob, + Type_handler_uuid_old::singleton(), Type_handler_uuid_new::singleton() }; + + for (int i= for_cmp ? 6 : 0; arr[i] != a; i++) + if (arr[i] == b) + return a; + return NULL; +} + /*************************************************************************/ class Create_func_uuid : public Create_func_arg0 @@ -71,17 +142,26 @@ static Plugin_function plugin_descriptor_function_uuid(&Create_func_uuid::s_singleton), plugin_descriptor_function_sys_guid(&Create_func_sys_guid::s_singleton); +static constexpr Name type_name={STRING_WITH_LEN("uuid")}; + +int uuid_init(void*) +{ + Type_handler_uuid_new::singleton()->set_name(type_name); + Type_handler_uuid_old::singleton()->set_name(type_name); + return 0; +} + /*************************************************************************/ maria_declare_plugin(type_uuid) { MariaDB_DATA_TYPE_PLUGIN, // the plugin type (see include/mysql/plugin.h) &plugin_descriptor_type_uuid, // pointer to type-specific plugin descriptor - "uuid", // plugin name + type_name.ptr(), // plugin name "MariaDB Corporation", // plugin author "Data type UUID", // the plugin description PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h) - 0, // Pointer to plugin initialization function + uuid_init, // Pointer to plugin initialization function 0, // Pointer to plugin deinitialization function 0x0100, // Numeric version 0xAABB means AA.BB version NULL, // Status variables diff --git a/plugin/type_uuid/sql_type_uuid.h b/plugin/type_uuid/sql_type_uuid.h index 091954b3b86..5a2f7c75422 100644 --- a/plugin/type_uuid/sql_type_uuid.h +++ b/plugin/type_uuid/sql_type_uuid.h @@ -17,6 +17,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ #include "sql_type_fixedbin_storage.h" + +template class UUID: public FixedBinTypeStorage { bool get_digit(char ch, uint *val) @@ -93,6 +95,8 @@ public: } if (str < end) goto err; // Some input left + if (m_buffer[6] < 0 && m_buffer[8] > 0) + goto err; // impossible combination: version >= 8, variant = 0 return false; err: bzero(m_buffer, sizeof(m_buffer)); @@ -172,21 +176,31 @@ public: // Convert the in-memory representation to the in-record representation static void memory_to_record(char *to, const char *from) { - segment(0).memory_to_record(to, from); - segment(1).memory_to_record(to, from); - segment(2).memory_to_record(to, from); - segment(3).memory_to_record(to, from); - segment(4).memory_to_record(to, from); + if (force_swap || (from[6] > 0 && from[6] < 0x60 && from[8] < 0)) + { + segment(0).memory_to_record(to, from); + segment(1).memory_to_record(to, from); + segment(2).memory_to_record(to, from); + segment(3).memory_to_record(to, from); + segment(4).memory_to_record(to, from); + } + else + memcpy(to, from, binary_length()); } // Convert the in-record representation to the in-memory representation static void record_to_memory(char *to, const char *from) { - segment(0).record_to_memory(to, from); - segment(1).record_to_memory(to, from); - segment(2).record_to_memory(to, from); - segment(3).record_to_memory(to, from); - segment(4).record_to_memory(to, from); + if (force_swap || (from[6] < 0 && from[8] > 0)) + { + segment(0).record_to_memory(to, from); + segment(1).record_to_memory(to, from); + segment(2).record_to_memory(to, from); + segment(3).record_to_memory(to, from); + segment(4).record_to_memory(to, from); + } + else + memcpy(to, from, binary_length()); } /* @@ -265,8 +279,38 @@ public: }; +class Type_collection_uuid: public Type_collection +{ + const Type_handler *find_in_array(const Type_handler *what, + const Type_handler *stop, + bool for_comparison) const; +public: + const Type_handler *aggregate_for_result(const Type_handler *a, + const Type_handler *b) + const override + { return find_in_array(a, b, false); } + const Type_handler *aggregate_for_min_max(const Type_handler *a, + const Type_handler *b) + const override + { return find_in_array(a, b, false); } + const Type_handler *aggregate_for_comparison(const Type_handler *a, + const Type_handler *b) + const override + { return find_in_array(a, b, true); } + const Type_handler *aggregate_for_num_op(const Type_handler *a, + const Type_handler *b) + const override + { return NULL; } + + static Type_collection_uuid *singleton() + { + static Type_collection_uuid tc; + return &tc; + } +}; #include "sql_type_fixedbin.h" -typedef Type_handler_fbt UUIDBundle; +typedef Type_handler_fbt, Type_collection_uuid> Type_handler_uuid_old; +typedef Type_handler_fbt, Type_collection_uuid> Type_handler_uuid_new; #endif // SQL_TYPE_UUID_INCLUDED diff --git a/sql/sql_type_fixedbin.h b/sql/sql_type_fixedbin.h index 15722935eb8..2a2cc1e1ff6 100644 --- a/sql/sql_type_fixedbin.h +++ b/sql/sql_type_fixedbin.h @@ -631,7 +631,8 @@ public: */ DBUG_ASSERT(item->type_handler()->type_handler_base_or_self()-> is_traditional_scalar_type() || - item->type_handler() == type_handler()); + item->type_handler()->type_collection() == + type_handler()->type_collection()); return true; } /** @@ -646,7 +647,8 @@ public: // See the DBUG_ASSERT comment in can_optimize_keypart_ref() DBUG_ASSERT(item->type_handler()->type_handler_base_or_self()-> is_traditional_scalar_type() || - item->type_handler() == type_handler()); + item->type_handler()->type_collection() == + type_handler()->type_collection()); return true; } void hash_not_null(Hasher *hasher) override