prestodb/presto

bug in bitwise_arithmetic_shift_right

Open

#20,941 创建于 2023年9月22日

在 GitHub 查看
 (10 评论) (0 反应) (0 负责人)Java (5,240 fork)batch import
buggood first issue

仓库指标

Star
 (15,558 star)
PR 合并指标
 (平均合并 34天 14小时) (30 天内合并 120 个 PR)

描述

I found a bug in presto bitwise_arithmetic_shift_right function when shifting negative big int to the right beyond 63 digits. -- -- Result -2, -1, -9223372036854775808 -- select bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (62 as bigint)) , -- bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (63 as bigint)),
-- bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (64 as bigint)) -- this should give -1 it give -9223372036854775808 should be -2, -1, -1 i tested it on int, tiny int it works fine the problem is just with bigint input https://fburl.com/daiquery/dn4id08d

similarly bitwise_arithmetic_shift_right(cast ('9223372036854775807' as bigint), cast (64 as bigint)) -- this should give 0 not 9223372036854775807

-- Result -2, -1, -9223372036854775808
select bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (62 as bigint)) ,
       bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (63 as bigint)),  
       bitwise_arithmetic_shift_right(cast ('-9223372036854775808' as bigint), cast (64 as bigint))  -- this should give -1 it give -9223372036854775808


Result -2, -1, -1 
select
   bitwise_arithmetic_shift_right(cast ('-128' as tinyint), cast (6 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('-128' as tinyint), cast (7 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('-128' as tinyint), cast (8 as bigint))

Result -2, -1, -1 
 select
   bitwise_arithmetic_shift_right(cast ('-2147483648' as int), cast (30 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('-2147483648' as int), cast (31 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('-2147483648' as int), cast (32 as bigint))

select   bitwise_arithmetic_shift_right(cast ('-1' as bigint), cast (1 as bigint)) 


Result 1, 0, -9223372036854775808
select bitwise_arithmetic_shift_right(cast ('9223372036854775807' as bigint), cast (62 as bigint)) ,
       bitwise_arithmetic_shift_right(cast ('9223372036854775807' as bigint), cast (63 as bigint)),  
       bitwise_arithmetic_shift_right(cast ('9223372036854775807' as bigint), cast (64 as bigint))  -- this should give 0 it give 9223372036854775807

-- Result 1, 0, 0
select
   bitwise_arithmetic_shift_right(cast ('127' as tinyint), cast (6 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('127' as tinyint), cast (7 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('127' as tinyint), cast (8 as bigint))

-- Result 1, 0, 0
 select
   bitwise_arithmetic_shift_right(cast ('2147483647' as int), cast (30 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('2147483647' as int), cast (31 as bigint)) ,
   bitwise_arithmetic_shift_right(cast ('2147483647' as int), cast (32 as bigint))

贡献者指南