Bug #91131 | Select Distinct Combined with UUID() Doesn't Filter Duplicate Values | ||
---|---|---|---|
Submitted: | 4 Jun 2018 13:28 | Modified: | 6 Jun 2018 10:40 |
Reporter: | Steve McKee | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
Version: | 8.0.11 | OS: | Windows |
Assigned to: | CPU Architecture: | Any | |
Tags: | distinct, UUID |
[4 Jun 2018 13:28]
Steve McKee
[5 Jun 2018 4:37]
MySQL Verification Team
Hello Steve McKee, Thank you for the report and test case. Thanks, Umesh
[5 Jun 2018 4:38]
MySQL Verification Team
-- [umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-5.7.22/mysql-test: ./mtr bug91131 Logging: ./mtr bug91131 MySQL Version 5.7.22 Checking supported features... - SSL connections supported Collecting tests... Checking leftover processes... Removing old var directory... Creating var directory '/export/umesh/server/binaries/GABuilds/mysql-5.7.22/mysql-test/var'... Installing system database... Using parallel: 1 ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009 CREATE TABLE `employee` (`employee_id` int(11) NOT NULL AUTO_INCREMENT,`first_name` varchar(255) NOT NULL,`last_name` varchar(255) NOT NULL,`type` varchar(255) NOT NULL,PRIMARY KEY (`employee_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `employee_type` (`employee_type_id` int(11) NOT NULL AUTO_INCREMENT,`type` varchar(255) NOT NULL,`uuid` char(38) NOT NULL,PRIMARY KEY (`employee_type_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; insert into employee (first_name, last_name, type) values ('Employee', 'One', 'customer service'); insert into employee (first_name, last_name, type) values ('Employee', 'Two', 'customer service'); insert into employee (first_name, last_name, type) values ('Employee', 'Three', 'manager'); select distinct type, UUID() from employee; type UUID() customer service ef6e062d-6879-11e8-a56e-0010e05f3e06 manager ef6e0645-6879-11e8-a56e-0010e05f3e06 insert into employee_type (type, uuid) select distinct type, UUID() from employee; select * from employee_type; employee_type_id type uuid 1 customer service ef6e210f-6879-11e8-a56e-0010e05f3e06 2 manager ef6e2283-6879-11e8-a56e-0010e05f3e06 drop tables employee; drop tables employee_type; main.bug91131 [ pass ] 13 -------------------------------------------------------------------------- The servers were restarted 0 times Spent 0.013 of 4 seconds executing testcases Completed: All 1 tests were successful. -- [umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-8.0.11/mysql-test: ./mtr bug91131 --nowarnings Logging: ./mtr bug91131 --nowarnings 2018-06-05T04:35:13.532557Z 0 [System] [MY-010116] [Server] /export/umesh/server/binaries/GABuilds/mysql-8.0.11/bin/mysqld (mysqld 8.0.11) starting as process 21825 MySQL Version 8.0.11 Checking supported features... - SSL connections supported Collecting tests... Checking leftover processes... Removing old var directory... Creating var directory '/export/umesh/server/binaries/GABuilds/mysql-8.0.11/mysql-test/var'... Installing system database... Using parallel: 1 ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009 main.bug91131 [ fail ] Test ended at 2018-06-05 06:35:18 Result file '/export/umesh/server/binaries/GABuilds/mysql-8.0.11/mysql-test/r/bug91131.result' doesn't exist. Either create a result file or disable check-testcases and run the test case. Use --nocheck-testcases option to disable check-testcases. Mysqltest client output from logfile ----------- MYSQLTEST OUTPUT START ----------- CREATE TABLE `employee` (`employee_id` int(11) NOT NULL AUTO_INCREMENT,`first_name` varchar(255) NOT NULL,`last_name` varchar(255) NOT NULL,`type` varchar(255) NOT NULL,PRIMARY KEY (`employee_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `employee_type` (`employee_type_id` int(11) NOT NULL AUTO_INCREMENT,`type` varchar(255) NOT NULL,`uuid` char(38) NOT NULL,PRIMARY KEY (`employee_type_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; insert into employee (first_name, last_name, type) values ('Employee', 'One', 'customer service'); insert into employee (first_name, last_name, type) values ('Employee', 'Two', 'customer service'); insert into employee (first_name, last_name, type) values ('Employee', 'Three', 'manager'); select distinct type, UUID() from employee; type UUID() customer service d99ea3c9-6879-11e8-90e0-0010e05f3e06 customer service d99ea416-6879-11e8-90e0-0010e05f3e06 manager d99ea427-6879-11e8-90e0-0010e05f3e06 insert into employee_type (type, uuid) select distinct type, UUID() from employee; select * from employee_type; employee_type_id type uuid 1 customer service d99ec6f4-6879-11e8-90e0-0010e05f3e06 2 customer service d99ec738-6879-11e8-90e0-0010e05f3e06 3 manager d99ec75b-6879-11e8-90e0-0010e05f3e06 drop tables employee; drop tables employee_type;
[6 Jun 2018 10:40]
Roy Lyseng
This looks like a bug in 5.7 that was inadvertently fixed in 8.0 When we perform a SELECT without DISTINCT, we get three distinct rows (due to UUID): select type, UUID() from employee; +------------------+--------------------------------------+ | type | UUID() | +------------------+--------------------------------------+ | customer service | a3d3f6f8-6893-11e8-a412-0010e0bd3744 | | customer service | a3d3f817-6893-11e8-a412-0010e0bd3744 | | manager | a3d3f867-6893-11e8-a412-0010e0bd3744 | +------------------+--------------------------------------+ from this follows that select distinct type, UUID() from employee; should give the same result, as there are no duplicates. So this seems like a bug that was fixed in 8.0. You can use the following corrected INSERT statement to insert the distinct rows, extended with unique UUID values per row: INSERT INTO employee_type (type, uuid) SELECT *, UUID() FROM (SELECT DISTINCT type FROM employee) AS dt;