// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. #include #include "vec/core/types.h" #include "vec/io/io_helper.h" #include "vec/io/reader_buffer.h" namespace doris::vectorized { struct CheckOverFlowTest : public testing::Test { void SetUp() override { // This function is called before each test. } void TearDown() override { // This function is called after each test. } Int128 to_i128(std::string str) { ReadBuffer rb = ReadBuffer(str.data(), str.size()); Int128 val; EXPECT_TRUE(read_int_text_impl(val, rb)); return val; }; wide::Int256 to_i256(std::string str) { return wide::Int256::_impl::from_str(str.c_str()); }; }; TEST_F(CheckOverFlowTest, test_overflow_int128) { { Int128 a = to_i128("-15687000000000000000000"); Int128 b = to_i128("11000000000000000"); Int128 c; EXPECT_TRUE(common::mul_overflow(a, b, c)); } { Int128 a = to_i128("-15687000000000000000000"); Int128 b = to_i128("-11000000000000000"); Int128 c; EXPECT_TRUE(common::mul_overflow(a, b, c)); } { Int128 a = to_i128("1000"); Int128 b = to_i128("12000"); Int128 c; EXPECT_FALSE(common::mul_overflow(a, b, c)); } } TEST_F(CheckOverFlowTest, test_overflow_int256) { { wide::Int256 a = to_i256("-11579208923731619542357098500868790785326998466564056403945758400791"); wide::Int256 b = to_i256("1157920892373161954235709850086879078532699846656405640394575"); wide::Int256 c; EXPECT_TRUE(common::mul_overflow(a, b, c)); } { wide::Int256 a = to_i256("-1157920892373161954235709850086879078532699846656405640394"); wide::Int256 b = to_i256("-1157920892373161954235709850086879078532699846656405640394"); wide::Int256 c; EXPECT_TRUE(common::mul_overflow(a, b, c)); } { wide::Int256 a = to_i256("1000"); wide::Int256 b = to_i256("12000"); wide::Int256 c; EXPECT_FALSE(common::mul_overflow(a, b, c)); } } } // namespace doris::vectorized