Bug #34003 Function call is ignored by using OR in WHERE statement
Submitted: 23 Jan 2008 9:04 Modified: 23 Jan 2008 10:37
Reporter: Richard Teubel Email Updates:
Status: Can't repeat Impact on me:
None 
Category:MySQL Server: Parser Severity:S2 (Serious)
Version:5.0.45-log 64Bit OS:Linux (10.3)
Assigned to: CPU Architecture:Any
Tags: FUNCTION, join, OR, where

[23 Jan 2008 9:04] Richard Teubel
Description:
Hello,

I use a JOIN-Query with a Function to check a String. If I put a String from table B in my function and bind it with OR, the function call is ignored.

mysql> SELECT * FROM A;
+----+-------+
| ID | Value |
+----+-------+
|  1 | AAA   |
|  2 | BBB   |
+----+-------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM B;
+----+-------+
| ID | Value |
+----+-------+
|  1 | AAA   |
|  2 | BBB   |
+----+-------+
2 rows in set (0.00 sec)

Function a_test returns simply the parameter back.

mysql> SELECT a_test('XYZ');
+---------------+
| a_test('XYZ') |
+---------------+
| XYZ           |
+---------------+
1 row in set (0.00 sec)

Now my Query. I think the Row ( 2, BBB) is lost or ignored.

mysql> SELECT A.ID, A.Value
    -> FROM A
    -> INNER JOIN B
    ->   ON A.ID = B.ID
    -> WHERE A.ID = 1
    -> OR a_test(B.Value) = 'BBB';
+----+-------+
| ID | Value |
+----+-------+
|  1 | AAA   |
+----+-------+
1 row in set (0.00 sec)

The same Query without the function a_test.

mysql> SELECT A.ID, A.Value
    -> FROM A
    -> INNER JOIN B
    ->   ON A.ID = B.ID
    -> WHERE A.ID = 1
    -> OR B.Value = 'BBB';
+----+-------+
| ID | Value |
+----+-------+
|  1 | AAA   |
|  2 | BBB   |
+----+-------+
2 rows in set (0.00 sec)

How to repeat:
CREATE TABLE `testdb`.`A` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Value` VARCHAR( 20 ) NOT NULL 
) ENGINE = MYISAM 

CREATE TABLE `testdb`.`B` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Value` VARCHAR( 20 ) NOT NULL 
) ENGINE = MYISAM 

INSERT INTO `testdb`.`A` (`ID` ,`Value` )
VALUES ('1', 'AAA'), ('2', 'BBB');

INSERT INTO `testdb`.`B` (`ID` ,`Value` )
VALUES ('1', 'AAA'), ('2', 'BBB');

DELIMITER //
CREATE FUNCTION a_test(param1 vARCHAR(50))
    RETURNS varchar(50) CHARSET latin1
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
begin
   RETURN param1;
end;
//

DELIMITER ;
[23 Jan 2008 10:37] Sveta Smirnova
Thank you for the report.

I can not repeat with version 5.0.51, although bug is repeatable with version 5.0.45. Please upgrade.