/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX SQL_ENG #include #include "../../../../src/sql/engine/expr/ob_expr_right.h" #include "ob_expr_test_utils.h" #include "lib/oblog/ob_log.h" #include using namespace oceanbase::common; using namespace oceanbase::sql; class ObExprFuncRightTest : public ::testing::Test { public: ObExprFuncRightTest(); virtual ~ObExprFuncRightTest(); virtual void SetUp(); virtual void TearDown(); private: // disallow copy ObExprFuncRightTest(const ObExprFuncRightTest& other); ObExprFuncRightTest& operator=(const ObExprFuncRightTest& other); protected: // data members }; ObExprFuncRightTest::ObExprFuncRightTest() {} ObExprFuncRightTest::~ObExprFuncRightTest() {} void ObExprFuncRightTest::SetUp() {} void ObExprFuncRightTest::TearDown() {} #define BINARY_RIGHT(str, count, res_str) \ EXPECT_RESULT2_CT(right, \ &buf, \ calc_result2, \ binary, \ str, \ CS_TYPE_BINARY, \ int, \ count, \ CS_TYPE_BINARY, \ binary, \ res_str, \ CS_TYPE_BINARY) TEST_OPERATOR(ObExprRight); TEST_F(ObExprFuncRightTest, ascii) { ObMalloc buf; TestObExprRight rev; EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 2, varchar, "de"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 5, varchar, "abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 8, varchar, "345abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 10, varchar, "12345abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "12345abcde", int, 15, varchar, "12345abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, -4, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 0, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 2, char, "de"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 5, char, "abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 8, char, "345abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 10, char, "12345abcde"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "12345abcde", int, 15, char, "12345abcde"); } TEST_F(ObExprFuncRightTest, utf8) { ObMalloc buf; TestObExprRight rev; EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, 2, varchar, "老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, 4, varchar, "山打老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, 5, varchar, "上山打老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "上山打老虎", int, 10, varchar, "上山打老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, -4, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, 0, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, 2, char, "老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, 4, char, "山打老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, 5, char, "上山打老虎"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山打老虎", int, 10, char, "上山打老虎"); } TEST_F(ObExprFuncRightTest, utf8_mixed) { ObMalloc buf; TestObExprRight rev; EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 1, varchar, "e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 2, varchar, "虎e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 3, varchar, "5虎e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 7, varchar, "c4老d5虎e"); EXPECT_RESULT2_UTF8MB4CI( rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 15, varchar, "1上a2山b3打c4老d5虎e"); EXPECT_RESULT2_UTF8MB4CI( rev, &buf, calc_result2, varchar, "1上a2山b3打c4老d5虎e", int, 42, varchar, "1上a2山b3打c4老d5虎e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, -4, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 0, char, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 1, char, "e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 2, char, "虎e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 3, char, "5虎e"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 7, char, "c4老d5虎e"); EXPECT_RESULT2_UTF8MB4CI( rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 15, char, "1上a2山b3打c4老d5虎e"); EXPECT_RESULT2_UTF8MB4CI( rev, &buf, calc_result2, char, "1上a2山b3打c4老d5虎e", int, 42, char, "1上a2山b3打c4老d5虎e"); } TEST_F(ObExprFuncRightTest, binary) { ObMalloc buf; TestObExprRight right; BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", -4, ""); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 0, ""); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 1, "\xFF"); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 2, "\xEE\xFF"); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 4, "\xBB\xEE\xEE\xFF"); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 7, "\xEE\xAA\xDD\xBB\xEE\xEE\xFF"); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 8, "\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF"); BINARY_RIGHT("\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF", 42, "\xDD\xEE\xAA\xDD\xBB\xEE\xEE\xFF"); } TEST_F(ObExprFuncRightTest, casted) { ObMalloc buf; TestObExprRight rev; number::ObNumber num; num.from("-42.466778", buf); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, 1, varchar, "5"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, 3, varchar, "345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, 5, varchar, "12345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, int, 12345, int, 10, varchar, "12345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, 1, varchar, "5"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, 3, varchar, "345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, 5, varchar, "12345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, smallint, 12345, int, 10, varchar, "12345"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, -4, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, 1, varchar, "3"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, 3, varchar, "123"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, 4, varchar, "-123"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, tinyint, -123, int, 10, varchar, "-123"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, -3, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 0, varchar, ""); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 3, varchar, ".45"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 7, varchar, "-123.45"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 10, varchar, "-123.45"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 11, varchar, "-123.45"); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, double, -123.45, int, 16, varchar, "-123.45"); } TEST_F(ObExprFuncRightTest, invalid_encoding) { ObMalloc buf; TestObExprRight rev; EXPECT_FAIL_RESULT2_CT(rev, &buf, calc_result2, char, "上山打老\xE4\xBD\x00", CS_TYPE_UTF8MB4_GENERAL_CI, int, 3, CS_TYPE_UTF8MB4_GENERAL_CI); EXPECT_FAIL_RESULT2_CT(rev, &buf, calc_result2, char, "上山打老\xE4\xBD", CS_TYPE_UTF8MB4_GENERAL_CI, int, 3, CS_TYPE_UTF8MB4_GENERAL_CI); EXPECT_FAIL_RESULT2_CT( rev, &buf, calc_result2, char, "上山\xE4打老", CS_TYPE_UTF8MB4_GENERAL_CI, int, 3, CS_TYPE_UTF8MB4_GENERAL_CI); EXPECT_RESULT2_UTF8MB4CI(rev, &buf, calc_result2, char, "上山\xE4打老", int, 2, char, "打老"); } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }