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