| Bug #46482 | JOIN broken when using views with enum data types | ||
|---|---|---|---|
| Submitted: | 30 Jul 2009 17:34 | Modified: | 30 Jul 2009 18:31 |
| Reporter: | Rahul Nabar | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server | Severity: | S1 (Critical) |
| Version: | 14.12 Distrib 5.0.45 | OS: | Linux (Red Hat Enterprise) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | enum, FUNCTION, join, Views, wrong result | ||
[30 Jul 2009 17:34]
Rahul Nabar
[30 Jul 2009 17:40]
Valeriy Kravchuk
Thank you for the problem report. With 5.1.38 I've got the results you expected:
valeriy-kravchuks-macbook-pro:5.1 openxs$ 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 10
Server version: 5.1.38-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> DELIMITER //
mysql> CREATE FUNCTION prediction(x FLOAT ) RETURNS
-> ENUM('Overlayer','Sandwich') BEGIN
->
-> IF (x < 0) THEN
-> RETURN 'Overlayer';
-> ELSEIF (x > 0 ) THEN
-> RETURN 'Sandwich';
-> ELSE
-> RETURN NULL;
-> END IF;
->
-> END;
-> //
DELIMITER ;
##############################
CREATE TABLE table1
(
m1 varchar(6),
x float,
y float
);
################################
CREATE VIEW view1 AS
(
SELECT
m1,
prediction( x) AS Prediction
FROM
table1
);
##################################
CREATE VIEW view2 AS
(
SELECT
m1,
prediction( y) AS Prediction
FROM
table1
);
####################################
INSERT INTO table1 values
('A',1,1),
('B',1,-1),
('C',1,0),
('D',-1,1),
('E',0,1)
;
###################################
SELECT *
FROM
view1
LEFT JOIN
view2
ON
(
view1.m1 =view2.m1 AND
view1.Prediction = view2.Prediction
)
;
Query OK, 0 rows affected (0.03 sec)
mysql> DELIMITER ;
mysql> ##############################
mysql> CREATE TABLE table1
-> (
-> m1 varchar(6),
-> x float,
-> y float
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> ################################
mysql> CREATE VIEW view1 AS
-> (
-> SELECT
-> m1,
-> prediction( x) AS Prediction
-> FROM
-> table1
-> );
Query OK, 0 rows affected (0.19 sec)
mysql> ##################################
mysql> CREATE VIEW view2 AS
-> (
-> SELECT
-> m1,
-> prediction( y) AS Prediction
-> FROM
-> table1
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> ####################################
mysql> INSERT INTO table1 values
-> ('A',1,1),
-> ('B',1,-1),
-> ('C',1,0),
-> ('D',-1,1),
-> ('E',0,1)
-> ;
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> ###################################
mysql> SELECT *
-> FROM
-> view1
-> LEFT JOIN
-> view2
->
-> ON
-> (
-> view1.m1 =view2.m1 AND
-> view1.Prediction = view2.Prediction
-> )
-> ;
+------+------------+------+------------+
| m1 | Prediction | m1 | Prediction |
+------+------------+------+------------+
| A | Sandwich | A | Sandwich |
| B | Sandwich | NULL | NULL |
| C | Sandwich | NULL | NULL |
| D | Overlayer | NULL | NULL |
| E | NULL | NULL | NULL |
+------+------------+------+------------+
5 rows in set (0.02 sec)
[30 Jul 2009 17:42]
Rahul Nabar
Thanks! Any chance you have access to version 5.045? Was this a bug in that version. This is the default version shipped out by RedHat (as far as I know) Might have a larger impact.
[30 Jul 2009 17:44]
Valeriy Kravchuk
You 5.0.45 is really old, and many bugs are fixed since that time. Looks like this bug is also fixed in current versions. Also not repeatable with 5.0.85:
valeriy-kravchuks-macbook-pro:5.0 openxs$ 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
Server version: 5.0.85 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> DELIMITER //
CREATE FUNCTION prediction(x FLOAT ) RETURNS
ENUM('Overlayer','Sandwich') BEGIN
IF (x < 0) THEN
RETURN 'Overlayer';
ELSEIF (x > 0 ) THEN
RETURN 'Sandwich';
ELSE
RETURN NULL;
END IF;
END;
//
DELIMITER ;
##############################
CREATE TABLE table1
(
m1 varchar(6),
x float,
y float
);
################################
CREATE VIEW view1 AS
(
SELECT
m1,
prediction( x) AS Prediction
FROM
table1
);
##################################
CREATE VIEW view2 AS
(
SELECT
m1,
prediction( y) AS Prediction
FROM
table1
);
####################################
INSERT INTO table1 values
('A',1,1),
('B',1,-1),
('C',1,0),
('D',-1,1),
('E',0,1)
;
###################################
SELECT *
FROM
view1
LEFT JOIN
view2
ON
(
mysql> CREATE FUNCTION prediction(x FLOAT ) RETURNS
-> ENUM('Overlayer','Sandwich') BEGIN
->
-> IF (x < 0) THEN
-> RETURN 'Overlayer';
-> ELSEIF (x > 0 ) THEN
-> RETURN 'Sandwich';
-> ELSE
-> RETURN NULL;
-> END IF;
->
-> END;
-> //
DELIMITER ;
##############################
CREATE TABLE table1
(
m1 varchar(6),
x float,
y float
);
################################
CREATE VIEW view1 AS
(
SELECT
m1,
prediction( x) AS Prediction
FROM
table1
);
##################################
CREATE VIEW view2 AS
(
SELECT
m1,
prediction( y) AS Prediction
FROM
table1
);
####################################
INSERT INTO table1 values
('A',1,1),
('B',1,-1),
('C',1,0),
('D',-1,1),
('E',0,1)
;
###################################
SELECT *
FROM
view1
LEFT JOIN
view2
ON
(
view1.m1 =view2.m1 AND
ew1.Prediction = view2.Prediction
)
;
Query OK, 0 rows affected (0.03 sec)
mysql> DELIMITER ;
mysql> ##############################
mysql> CREATE TABLE table1
-> (
-> m1 varchar(6),
-> x float,
-> y float
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> ################################
mysql> CREATE VIEW view1 AS
-> (
-> SELECT
-> m1,
-> prediction( x) AS Prediction
-> FROM
-> table1
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> ##################################
mysql> CREATE VIEW view2 AS
-> (
-> SELECT
-> m1,
-> prediction( y) AS Prediction
-> FROM
-> table1
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> ####################################
mysql> INSERT INTO table1 values
-> ('A',1,1),
-> ('B',1,-1),
-> ('C',1,0),
-> ('D',-1,1),
-> ('E',0,1)
-> ;
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT *
-> FROM
-> view1
-> LEFT JOIN
-> view2
->
-> ON
-> (
-> view1.m1 =view2.m1 AND
-> view1.Prediction = view2.Prediction
-> )
-> ;
+------+------------+------+------------+
| m1 | Prediction | m1 | Prediction |
+------+------------+------+------------+
| A | Sandwich | A | Sandwich |
| B | Sandwich | NULL | NULL |
| C | Sandwich | NULL | NULL |
| D | Overlayer | NULL | NULL |
| E | NULL | NULL | NULL |
+------+------------+------+------------+
5 rows in set (0.01 sec)
So, please, upgrade to 5.0.84 and check if the problem is still there.
[30 Jul 2009 18:03]
Rahul Nabar
It isn't easy to upgrade right away. I am stuck with Red Hat and its old yum repo. Can you point me to a specific bug fix? Or a bug report on this? That way I could look if there is a patch for this issue.
[30 Jul 2009 18:31]
Rahul Nabar
I sniffed up the old bug reports. Do you think this is the bug I am facing: http://bugs.mysql.com/bug.php?id=29604
[25 Aug 2009 6:14]
Roel Van de Paar
FYI: Though it is fixed in a later release as pointed out above, 5.0.45 indeed has this bug: +------+------------+------+------------+ | m1 | Prediction | m1 | Prediction | +------+------------+------+------------+ | A | Sandwich | A | Sandwich | | B | Sandwich | B | Overlayer | | C | Sandwich | C | NULL | | D | Overlayer | D | Sandwich | | E | NULL | E | Sandwich | +------+------------+------+------------+
