Skip to content

Commit

Permalink
expression: fix wrong result when convert float to unsigned (#53590) (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-chi-bot authored May 28, 2024
1 parent 30c2ca0 commit 38b810e
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 1 deletion.
5 changes: 4 additions & 1 deletion pkg/expression/builtin_compare.go
Original file line number Diff line number Diff line change
Expand Up @@ -1428,7 +1428,10 @@ func RefineComparedConstant(ctx BuildContext, targetFieldType types.FieldType, c
targetFieldType = *types.NewFieldType(mysql.TypeLonglong)
}
var intDatum types.Datum
intDatum, err = dt.ConvertTo(evalCtx.TypeCtx(), &targetFieldType)
// Disable AllowNegativeToUnsigned to make sure return 0 when underflow happens.
oriTypeCtx := evalCtx.TypeCtx()
newTypeCtx := oriTypeCtx.WithFlags(oriTypeCtx.Flags().WithAllowNegativeToUnsigned(false))
intDatum, err = dt.ConvertTo(newTypeCtx, &targetFieldType)
if err != nil {
if terror.ErrorEqual(err, types.ErrOverflow) {
return &Constant{
Expand Down
30 changes: 30 additions & 0 deletions tests/integrationtest/r/expression/cast.result
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,33 @@ select null as a union all select 'a' as a;
a
NULL
a
drop table if exists t0;
create table t0(c0 tinyint(1) unsigned not null );
insert into t0 values (1);
select * from t0 where case 0 when t0.c0 > -1.194192591e9 then null else 1 end;
c0
1
select t0.c0 > -1.194192591e9 from t0;
t0.c0 > -1.194192591e9
1
select t0.c0 < -1.194192591e9 from t0;
t0.c0 < -1.194192591e9
0
select -1.194192591e9 > t0.c0 from t0;
-1.194192591e9 > t0.c0
0
select -1.194192591e9 < t0.c0 from t0;
-1.194192591e9 < t0.c0
1
select t0.c0 > 1.194192591e9 from t0;
t0.c0 > 1.194192591e9
0
select t0.c0 < 1.194192591e9 from t0;
t0.c0 < 1.194192591e9
1
select 1.194192591e9 > t0.c0 from t0;
1.194192591e9 > t0.c0
1
select 1.194192591e9 < t0.c0 from t0;
1.194192591e9 < t0.c0
0
14 changes: 14 additions & 0 deletions tests/integrationtest/t/expression/cast.test
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,17 @@ select cast(cast('14:15' as time) as year) = YEAR(CURDATE());
explain select null as a union all select 'a' as a;
--sorted_result
select null as a union all select 'a' as a;

# TestNegFloatConvertToUnsigned
drop table if exists t0;
create table t0(c0 tinyint(1) unsigned not null );
insert into t0 values (1);
select * from t0 where case 0 when t0.c0 > -1.194192591e9 then null else 1 end;
select t0.c0 > -1.194192591e9 from t0;
select t0.c0 < -1.194192591e9 from t0;
select -1.194192591e9 > t0.c0 from t0;
select -1.194192591e9 < t0.c0 from t0;
select t0.c0 > 1.194192591e9 from t0;
select t0.c0 < 1.194192591e9 from t0;
select 1.194192591e9 > t0.c0 from t0;
select 1.194192591e9 < t0.c0 from t0;

0 comments on commit 38b810e

Please sign in to comment.