prestodb/presto

bug in bitwise_arithmetic_shift_right

Open

#20.941 aperta il 22 set 2023

Vedi su GitHub
 (10 commenti) (0 reazioni) (0 assegnatari)Java (5240 fork)batch import
buggood first issue

Metriche repository

Star
 (15.558 star)
Metriche merge PR
 (Merge medio 34g 14h) (120 PR mergiate in 30 g)

Descrizione

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

Guida contributor