Skip to content

Commit d2fec05

Browse files
author
sergefp@mysql.com
committed
Fix for BUG#8562: In Item_int_with_ref::new_item() create Item_int or Item_uint
depending on ref->unsigned_flag. Item_int_with_ref can refer to both signed and unsigned integers.
1 parent ad43387 commit d2fec05

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

mysql-test/r/bigint.result

+39
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,42 @@ drop table t1;
8787
SELECT '0x8000000000000001'+0;
8888
'0x8000000000000001'+0
8989
0
90+
create table t1 (
91+
value64 bigint unsigned not null,
92+
value32 integer not null,
93+
primary key(value64, value32)
94+
);
95+
create table t2 (
96+
value64 bigint unsigned not null,
97+
value32 integer not null,
98+
primary key(value64, value32)
99+
);
100+
insert into t1 values(17156792991891826145, 1);
101+
insert into t1 values( 9223372036854775807, 2);
102+
insert into t2 values(17156792991891826145, 3);
103+
insert into t2 values( 9223372036854775807, 4);
104+
select * from t1;
105+
value64 value32
106+
9223372036854775807 2
107+
17156792991891826145 1
108+
select * from t2;
109+
value64 value32
110+
9223372036854775807 4
111+
17156792991891826145 3
112+
select * from t1, t2 where t1.value64=17156792991891826145 and
113+
t2.value64=17156792991891826145;
114+
value64 value32 value64 value32
115+
17156792991891826145 1 17156792991891826145 3
116+
select * from t1, t2 where t1.value64=17156792991891826145 and
117+
t2.value64=t1.value64;
118+
value64 value32 value64 value32
119+
17156792991891826145 1 17156792991891826145 3
120+
select * from t1, t2 where t1.value64= 9223372036854775807 and
121+
t2.value64=9223372036854775807;
122+
value64 value32 value64 value32
123+
9223372036854775807 2 9223372036854775807 4
124+
select * from t1, t2 where t1.value64= 9223372036854775807 and
125+
t2.value64=t1.value64;
126+
value64 value32 value64 value32
127+
9223372036854775807 2 9223372036854775807 4
128+
drop table t1, t2;

mysql-test/t/bigint.test

+33
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,36 @@ drop table t1;
7171
# atof() behaviour is different of different systems. to be fixed in 4.1
7272
SELECT '0x8000000000000001'+0;
7373

74+
# Test for BUG#8562: joins over BIGINT UNSIGNED value + constant propagation
75+
create table t1 (
76+
value64 bigint unsigned not null,
77+
value32 integer not null,
78+
primary key(value64, value32)
79+
);
80+
81+
create table t2 (
82+
value64 bigint unsigned not null,
83+
value32 integer not null,
84+
primary key(value64, value32)
85+
);
86+
87+
insert into t1 values(17156792991891826145, 1);
88+
insert into t1 values( 9223372036854775807, 2);
89+
insert into t2 values(17156792991891826145, 3);
90+
insert into t2 values( 9223372036854775807, 4);
91+
92+
select * from t1;
93+
select * from t2;
94+
95+
select * from t1, t2 where t1.value64=17156792991891826145 and
96+
t2.value64=17156792991891826145;
97+
select * from t1, t2 where t1.value64=17156792991891826145 and
98+
t2.value64=t1.value64;
99+
100+
select * from t1, t2 where t1.value64= 9223372036854775807 and
101+
t2.value64=9223372036854775807;
102+
select * from t1, t2 where t1.value64= 9223372036854775807 and
103+
t2.value64=t1.value64;
104+
105+
drop table t1, t2;
106+

sql/item.h

+5
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,11 @@ class Item_int_with_ref :public Item_int
10111011
{
10121012
return ref->save_in_field(field, no_conversions);
10131013
}
1014+
Item *new_item()
1015+
{
1016+
return (ref->unsigned_flag)? new Item_uint(ref->name, ref->max_length) :
1017+
new Item_int(ref->name, ref->max_length);
1018+
}
10141019
};
10151020

10161021

0 commit comments

Comments
 (0)