mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Merge
This commit is contained in:
commit
de8f05956d
3 changed files with 8 additions and 61 deletions
|
@ -202,35 +202,6 @@ select count(*) from t1 where id not in (1,2);
|
|||
count(*)
|
||||
1
|
||||
drop table t1;
|
||||
create table t1 (f1 char(1), f2 int);
|
||||
insert into t1 values (1,0),('a',1),('z',2);
|
||||
select f1 from t1 where f1 in (1,'z');
|
||||
f1
|
||||
1
|
||||
z
|
||||
select f2 from t1 where f2 in (1,'z');
|
||||
f2
|
||||
0
|
||||
1
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect INTEGER value: 'z'
|
||||
select f1 from t1 where 'z' in (1,f1);
|
||||
f1
|
||||
z
|
||||
select * from t1 where 'z' in (f2,f1);
|
||||
f1 f2
|
||||
1 0
|
||||
a 1
|
||||
z 2
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'z'
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'z'
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'z'
|
||||
select * from t1 where 1 in (f2,f1);
|
||||
f1 f2
|
||||
1 0
|
||||
a 1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a int PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (44), (45), (46);
|
||||
SELECT * FROM t1 WHERE a IN (45);
|
||||
|
|
|
@ -109,18 +109,6 @@ select count(*) from t1 where id not in (1);
|
|||
select count(*) from t1 where id not in (1,2);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#18360 Incorrect type coercion in IN() results in false comparison
|
||||
#
|
||||
create table t1 (f1 char(1), f2 int);
|
||||
insert into t1 values (1,0),('a',1),('z',2);
|
||||
select f1 from t1 where f1 in (1,'z');
|
||||
select f2 from t1 where f2 in (1,'z');
|
||||
select f1 from t1 where 'z' in (1,f1);
|
||||
select * from t1 where 'z' in (f2,f1);
|
||||
select * from t1 where 1 in (f2,f1);
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
|
|
|
@ -80,9 +80,6 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems)
|
|||
|
||||
NOTES
|
||||
Aggregation rules:
|
||||
If all items are constants the type will be aggregated from all items.
|
||||
If there are some non-constant items then only types of non-constant
|
||||
items will be used for aggregation.
|
||||
If there are DATE/TIME fields/functions in the list and no string
|
||||
fields/functions in the list then:
|
||||
The INT_RESULT type will be used for aggregation instead of original
|
||||
|
@ -169,34 +166,25 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
|
|||
}
|
||||
}
|
||||
}
|
||||
/* Reset to 0 on first occurence of non-const item. 1 otherwise */
|
||||
bool is_const= items[0]->const_item();
|
||||
/*
|
||||
If the first item is a date/time function then its result should be
|
||||
compared as int
|
||||
*/
|
||||
if (field)
|
||||
{
|
||||
/* Suppose we are comparing dates and some non-constant items are present. */
|
||||
/* Suppose we are comparing dates */
|
||||
type[0]= INT_RESULT;
|
||||
is_const= 0;
|
||||
}
|
||||
else
|
||||
type[0]= items[0]->result_type();
|
||||
|
||||
for (i= 0; i < nitems ; i++)
|
||||
{
|
||||
if (!items[i]->const_item())
|
||||
{
|
||||
Item_result result= field && items[i]->result_as_longlong() ?
|
||||
INT_RESULT : items[i]->result_type();
|
||||
type[0]= is_const ? result : item_cmp_type(type[0], result);
|
||||
is_const= 0;
|
||||
}
|
||||
else if (is_const)
|
||||
type[0]= item_cmp_type(type[0], items[i]->result_type());
|
||||
else if (field)
|
||||
convert_constant_item(thd, field, &items[i]);
|
||||
Item_result result= items[i]->result_type();
|
||||
if (field &&
|
||||
((!items[i]->const_item() && items[i]->result_as_longlong()) ||
|
||||
(items[i]->const_item() && convert_constant_item(thd, field,
|
||||
&items[i]))))
|
||||
result= INT_RESULT;
|
||||
type[0]= item_cmp_type(type[0], result);
|
||||
}
|
||||
|
||||
if (res == Item::FUNC_ITEM && field)
|
||||
|
|
Loading…
Reference in a new issue