Bug #8793 | Boolean IS TRUE OR FALSE returns incorrect result | ||
---|---|---|---|
Submitted: | 24 Feb 2005 21:15 | Modified: | 25 Feb 2005 21:49 |
Reporter: | Trudy Pelzer | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server | Severity: | S3 (Non-critical) |
Version: | 5.0.3-alpha-debug | OS: | Linux (SuSE 9.1) |
Assigned to: | Sergey Vojtovich | CPU Architecture: | Any |
[24 Feb 2005 21:15]
Trudy Pelzer
[25 Feb 2005 13:30]
Sergey Vojtovich
Hello Trudy, are you sure it is a bug? I think you should use this query to obtain right result: - select * from t1 where col1 is true or false; + select * from t1 where col1 is true or col1 is false; I expect "col1 is true or false" equals to "(col1 is true) or false".
[25 Feb 2005 16:30]
Trudy Pelzer
Hi Sergey, Good point. It's true that the "correct" way to get the result is: select * from t1 where col1 is true or col1 is false; But I worry about the inconsistency shown when a different result is returned just because the operands in a WHERE clause are reversed. Even with parentheses, the result is inconsistent: mysql> select * from t1 where (col1 is true) or false; +------+ | col1 | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select * from t1 where (col1 is false) or true; +------+ | col1 | +------+ | 1 | | 0 | +------+ 2 rows in set (0.00 sec) I think a good solution would be to return a syntax error for the "incorrect" construction. For example, if I try to select the values directly from the table: mysql> select * from t1 where col1 is 1 or 0; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 or 0' at line 1 -- I get an error that says the query is badly formed. Returning the same error for "where col1 is true or false" would solve the problem.
[25 Feb 2005 21:49]
Sergei Golubchik
With parentheses results are completely consistent - it's easier to see by moving the test to the SELECT clause: mysql> select col1, col1 is true, (col1 is true) or false from t1; +------+--------------+-------------------------+ | col1 | col1 is true | (col1 is true) or false | +------+--------------+-------------------------+ | 1 | 1 | 1 | | 0 | 0 | 0 | +------+--------------+-------------------------+ 2 rows in set (0.00 sec) mysql> select col1, col1 is false, (col1 is false) or true from t1; +------+---------------+-------------------------+ | col1 | col1 is false | (col1 is false) or true | +------+---------------+-------------------------+ | 1 | 0 | 1 | | 0 | 1 | 1 | +------+---------------+-------------------------+ 2 rows in set (0.01 sec) As you see, result are correct, according to the definition of OR: x OR true == true x OR false == x An example with 'is 1 or 0' is not relevant here - it fails for a different reason: mysql> select col1 from t1 where col1 is 1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1 Because, according to the sql:2003 (6.34 <boolean value expression>) the syntax is <boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ] <truth value> ::= TRUE | FALSE | UNKNOWN so IS 1 is not allowed