RE: select...where...in...union bug?

"Chuck Han" <[email protected]> Sat, 8 Jan 2005 00:09:22 -0800
Newsgroups gmane.comp.db.mysql.bugs
Message-ID <F11838FDB768974EAAF9874C22A6BD272F5A61@msgusawmb01.ads.autodesk.com>
Here is the sql script:

---cut here---

-- MySQL dump 10.4
--
-- Host: localhost    Database: foo
-- ------------------------------------------------------
-- Server version 5.0.0-alpha-max-debug

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
-- MySQL dump 10.4
--
-- Host: localhost    Database: foo
-- ------------------------------------------------------
-- Server version 5.0.0-alpha-max-debug

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;

--
-- Table structure for table `geom_class`
--

DROP TABLE IF EXISTS geom_class;
CREATE TABLE geom_class (
  GID decimal(20,0) NOT NULL default '0',
  DESCRIPTION varchar(16),
  PRIMARY KEY  (GID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `geom_class`
--


/*!40000 ALTER TABLE geom_class DISABLE KEYS */;
LOCK TABLES geom_class WRITE;
INSERT INTO geom_class VALUES ("1", "apples"),("2", "oranges");
UNLOCK TABLES;
/*!40000 ALTER TABLE geom_class ENABLE KEYS */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE <mailto:SQL_MODE=@OLD_SQL_MODE>  */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS <mailto:FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS>  */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS <mailto:UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS>  */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT <mailto:CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT>  */;

SELECT GEOM_CLASS.* FROM GEOM_CLASS;
SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 2)
UNION
SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 1);
SELECT GEOM_CLASS.* FROM GEOM_CLASS WHERE (GEOM_CLASS.GID IN (
SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 2)
UNION
SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 1)
));
SELECT GEOM_CLASS.* FROM GEOM_CLASS WHERE (GEOM_CLASS.GID IN (
SELECT 2 UNION SELECT 1
));

---cut here---

Note that I added a "DESCRIPTION" field to the table so that the result I think I should get is:

+-----+-------------+
| GID | DESCRIPTION |
+-----+-------------+
|   1 | apples      |
|   2 | oranges     |
+-----+-------------+

-----Original Message----- 
From: Chuck Han 
Sent: Fri 1/7/2005 11:34 PM 
To: [email protected] 
Cc: 
Subject: select...where...in...union bug?



Hi,

(1) If I issue the following query:

 SELECT GEOM_CLASS.* FROM GEOM_CLASS

I get the following result:

 +-----+
 | GID |
 +-----+
 |   1 |
 |   2 |
 +-----+

(2) If I issue the following query:

 SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 2)
 UNION
 SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 1)

I get the following result:

 +-----+
 | GID |
 +-----+
 |   2 |
 |   1 |
 +-----+

(3) Now, if I combine (1) and (2) in the following way:

 SELECT GEOM_CLASS.* FROM GEOM_CLASS WHERE (GEOM_CLASS.GID IN (
  SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 2)
  UNION
  SELECT GEOM_CLASS.GID FROM GEOM_CLASS WHERE (GEOM_CLASS.GID = 1)
 ))

I get the following result:

 +-----+
 | GID |
 +-----+
 |   1 |
 +-----+

Shouldn't I get:

 +-----+
 | GID |
 +-----+
 |   1 |
 |   2 |
 +-----+

(4) I do get the above result if I run the following query:

 SELECT GEOM_CLASS.* FROM GEOM_CLASS WHERE (GEOM_CLASS.GID IN (
  SELECT 2 UNION SELECT 1
 ))

thanks in advance, Chuck