prestodb/presto

bug in bitwise_arithmetic_shift_right

Open

#20,941 opened on 2023年9月22日

GitHub で見る
 (10 comments) (0 reactions) (0 assignees)Java (5,240 forks)batch import
buggood first issue

Repository metrics

Stars
 (15,558 stars)
PR merge metrics
 (平均マージ 34d 14h) (30d で 120 merged PRs)

説明

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))

コントリビューターガイド