Details
-
Type:
Bug
-
Status: Open
-
Priority:
Major
-
Resolution: Unresolved
-
Affects Version/s: 10.1, 10.0, 5.5
-
Fix Version/s: 10.1
-
Component/s: None
-
Labels:None
Description
This script
DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a YEAR(2)); INSERT INTO t1 VALUES (70); SELECT a<=>'1970' FROM t1; SELECT a <=>(SELECT '1970') FROM t1;
returns 1 for both SELECT queries. Looks good.
Now if I rewrite the two queries slightly:
SELECT (SELECT a FROM t1)<=>'1970'; SELECT (SELECT a FROM t1) <=>(SELECT '1970');
it start to return 0.
The difference originates in this piece of the code:
void Item_func::convert_const_compared_to_int_field(THD *thd)
{
DBUG_ASSERT(arg_count >= 2); // Item_func_nullif has arg_count == 3
if (!thd->lex->is_ps_or_view_context_analysis())
{
int field;
if (args[field= 0]->real_item()->type() == FIELD_ITEM ||
args[field= 1]->real_item()->type() == FIELD_ITEM)
{
Item_field *field_item= (Item_field*) (args[field]->real_item());
if ((field_item->field_type() == MYSQL_TYPE_LONGLONG ||
field_item->field_type() == MYSQL_TYPE_YEAR))
convert_const_to_int(thd, field_item, &args[!field]);
}
}
}
Notice, it catches FIELD_ITEM, but it does not handle SUBSELECT_ITEM.
Gliffy Diagrams
Attachments
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions