Bug #18068 SELECT DISTINCT

Submitted: 8 Mar 2006 11:18 Modified: 10 May 2006 16:25
Reporter: Maciej Zagozda Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S2 (Serious)
Version:5.0 BK/5.1BK OS:Linux (Suse Linux)
Assigned to: Georgi Kodinov CPU Architecture:Any

[8 Mar 2006 11:18] Maciej Zagozda
Description:
I'm experiencing a problem with SELECT DISTINCT command. I believe something has changed in version 5.0.18 in comparison to version 5.0.16.

How to repeat:
I have created a very simple table of districts with one field, which is holding district name. 

CREATE TABLE `cwgctd_districts` (
  `DNME` varchar(64) NOT NULL default '',
  PRIMARY KEY  (`DNME`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

INSERT INTO `cwgctd_districts` (`DNME`) VALUES 
  (''),
  ('CENTRAL'),
  ('EASTERN'),
  ('GREATER LONDON'),
  ('NORTH CENTRAL'),
  ('NORTH EAST'),
  ('NORTH WEST'),
  ('SCOTLAND'),
  ('SOUTH EAST'),
  ('SOUTH WEST'),
  ('WESTERN');

COMMIT;

I should not have any duplicate entries in my data. To make sure I will get a list with a district name used once, I use SELECT DISTINCT syntax as follows:

SELECT DISTINCT cwgctd_districts.DNME,cwgctd_districts.DNME FROM cwgc.cwgctd_districts ORDER BY DNME

If I execute above query on mySQL 5.0.16 community edition it returns two columns with all district names. 

If I execute above query on mySQL 5.0.18 community edition it returns only last district name - "WESTERN"

Suggested fix:
I'm sure the query worked fine with the mySQL 4.0.18 and 5.0.16 returning valid records. I would expect version 5.0.18 work same way.
[8 Mar 2006 12:27] Surinder Singh
I can reproduce this too on MySQL version 5.0.18 running on Windows 2000 Server. Following is the example I tried:

CREATE TABLE districts (
  `DNME` varchar(64) NOT NULL default '',
  PRIMARY KEY  (`DNME`)
) ENGINE=MyISAM;

INSERT INTO districts (`DNME`) VALUES
  (''),
  ('CENTRAL'),
  ('EASTERN'),
  ('GREATER LONDON'),
  ('NORTH CENTRAL'),
  ('NORTH EAST'),
  ('NORTH WEST'),
  ('SCOTLAND'),
  ('SOUTH EAST'),
  ('SOUTH WEST'),
  ('WESTERN');
  
SELECT DISTINCT DNME, DNME FROM districts ORDER BY DNME;

This returns 11 records with two fields 'DNME' and 'DNME_1'. Both fields on all 11 records show 'WESTERN'. When I remove 'ORDER BY DNME' I get the correct results. 

Version 5.0.16 doesn't have this new feature. Possible fix is to add a new clause to SQL called 'INDISTINCT' that returns the above type of results. (sarcasm)
[8 Mar 2006 13:48] MySQL Verification Team
Thank you for the bug report I was able to repeat.

This bug just affects MyISAM storage engine on server version 5.0/5.1:

miguel@hegel:~/dbs/5.0> bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.20-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE TABLE districts (
    ->   `DNME` varchar(64) NOT NULL default '',
    ->   PRIMARY KEY  (`DNME`)
    -> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> INSERT INTO districts (`DNME`) VALUES
    ->   (''),
    ->   ('CENTRAL'),
    ->   ('EASTERN'),
    ->   ('GREATER LONDON'),
    ->   ('NORTH CENTRAL'),
    ->   ('NORTH EAST'),
    ->   ('NORTH WEST'),
    ->   ('SCOTLAND'),
    ->   ('SOUTH EAST'),
    ->   ('SOUTH WEST'),
    ->   ('WESTERN');
Query OK, 11 rows affected (0.02 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> SELECT DISTINCT DNME, DNME FROM districts ORDER BY DNME;
+---------+---------+
| DNME    | DNME    |
+---------+---------+
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
| WESTERN | WESTERN |
+---------+---------+
11 rows in set (0.00 sec)

mysql> alter table districts drop primary key;
Query OK, 11 rows affected (0.01 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> SELECT DISTINCT DNME, DNME FROM districts ORDER BY DNME;
+----------------+----------------+
| DNME           | DNME           |
+----------------+----------------+
|                |                |
| CENTRAL        | CENTRAL        |
| EASTERN        | EASTERN        |
| GREATER LONDON | GREATER LONDON |
| NORTH CENTRAL  | NORTH CENTRAL  |
| NORTH EAST     | NORTH EAST     |
| NORTH WEST     | NORTH WEST     |
| SCOTLAND       | SCOTLAND       |
| SOUTH EAST     | SOUTH EAST     |
| SOUTH WEST     | SOUTH WEST     |
| WESTERN        | WESTERN        |
+----------------+----------------+
11 rows in set (0.01 sec)

mysql> drop table districts;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE districts (
    ->   `DNME` varchar(64) NOT NULL default '',
    ->   PRIMARY KEY  (`DNME`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO districts (`DNME`) VALUES
    ->   (''),
    ->   ('CENTRAL'),
    ->   ('EASTERN'),
    ->   ('GREATER LONDON'),
    ->   ('NORTH CENTRAL'),
    ->   ('NORTH EAST'),
    ->   ('NORTH WEST'),
    ->   ('SCOTLAND'),
    ->   ('SOUTH EAST'),
    ->   ('SOUTH WEST'),
    ->   ('WESTERN');
Query OK, 11 rows affected (0.00 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> SELECT DISTINCT DNME, DNME FROM districts ORDER BY DNME;
+----------------+----------------+
| DNME           | DNME           |
+----------------+----------------+
|                |                |
| CENTRAL        | CENTRAL        |
| EASTERN        | EASTERN        |
| GREATER LONDON | GREATER LONDON |
| NORTH CENTRAL  | NORTH CENTRAL  |
| NORTH EAST     | NORTH EAST     |
| NORTH WEST     | NORTH WEST     |
| SCOTLAND       | SCOTLAND       |
| SOUTH EAST     | SOUTH EAST     |
| SOUTH WEST     | SOUTH WEST     |
| WESTERN        | WESTERN        |
+----------------+----------------+
11 rows in set (0.01 sec)

mysql>
[9 May 2006 13:18] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/6145
[9 May 2006 13:21] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/6146
[9 May 2006 15:44] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/6151
[10 May 2006 8:49] Georgi Kodinov
pushed in version 5.0.22/5.1.10-beta
[10 May 2006 16:25] Paul DuBois
Noted in 5.0.22, 5.1.10 changelogs.

<literal>SELECT DISTINCT</literal> queries sometimes returned
only the last row.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.056 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.