// Copyright 2023 PingCAP, Inc. // // Licensed 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 #include #include #include #include #include #include #include #include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" #include #pragma GCC diagnostic pop namespace DB { namespace tests { class StringPosition : public DB::tests::FunctionTest { }; TEST_F(StringPosition, position) { const auto * collator = TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::BINARY); { // const const ASSERT_COLUMN_EQ( createConstColumn(0, 0), executeFunction( "position", {createConstColumn(0, ""), createConstColumn(0, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(3, 1), executeFunction( "position", {createConstColumn(3, ""), createConstColumn(3, "123")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(1, 7), executeFunction( "position", {createConstColumn(1, ".*"), createConstColumn(1, "123啊.*f啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(1, 7), executeFunction( "position", {createConstColumn(1, "aBc"), createConstColumn(1, "1啊23aBc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 0), executeFunction( "position", {createConstColumn(2, "aBc"), createConstColumn(2, "1啊23abc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(10, 0), executeFunction( "position", {createConstColumn(10, "人"), createConstColumn(10, "3啊*f啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(6, 0), executeFunction( "position", {createConstColumn(6, "123"), createConstColumn(6, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(6, 1), executeFunction( "position", {createConstColumn(6, ""), createConstColumn(6, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 3), executeFunction( "position", {createConstColumn(2, "123 "), createConstColumn(2, "ce123 fe")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 0), executeFunction( "position", {createConstColumn(2, "123 "), createConstColumn(2, "ce123fe ")}, collator)); } { // const vector ASSERT_COLUMN_EQ( createColumn({}), executeFunction("position", {createConstColumn(0, ""), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1}), executeFunction( "position", {createConstColumn(2, ""), createColumn({"", "12A哇"})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 7, 0}), executeFunction( "position", {createConstColumn(3, "a啊B.*"), createColumn({"", "2aF啊a啊B.*fe# ", "2aF啊A啊b.*fe "})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 0, 7}), executeFunction( "position", {createConstColumn(3, "123 "), createColumn({"", "2aF啊123.*fe# ", "2aF啊123 .*fe "})}, collator)); } { // vector const ASSERT_COLUMN_EQ( createColumn({}), executeFunction("position", {createColumn({}), createConstColumn(0, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 5, 0, 0, 19}), executeFunction( "position", {createColumn({"", "A啊q", "g4GFE4g", "a啊q", ".*"}), createConstColumn(5, "f$*eA啊q飞F#f。.*&")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 0, 0, 0}), executeFunction( "position", {createColumn({"", "A啊q", "a啊q", ".*"}), createConstColumn(4, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 7, 0, 0}), executeFunction( "position", {createColumn({"", "A啊q ", "a啊q ", ".*"}), createConstColumn(4, "cew爬A啊q 3 ")}, collator)); } { // vector vector ASSERT_COLUMN_EQ( createColumn({}), executeFunction("position", {createColumn({}), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1, 0, 8, 0, 1, 0, 7}), executeFunction( "position", {createColumn({"", "", "123", "G$啊3", "G$啊w3", "啊3法4fd", "aBc ", "aBc "}), createColumn( {"", "123", "", "da嗯w$G$啊3gf4", "w好g$啊w33", "啊3法4fd", "啊3aBc法4fd ", "few人aBc "})}, collator)); } } TEST_F(StringPosition, positionUTF8) { std::vector cs_and_no_collators{ TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_BIN), nullptr}; std::vector ci_collators{ TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_GENERAL_CI), TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_0900_AI_CI)}; // const const { // case sensitive and no collator { for (const auto * collator : cs_and_no_collators) { ASSERT_COLUMN_EQ( createConstColumn(0, 0), executeFunction( "positionUTF8", {createConstColumn(0, ""), createConstColumn(0, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(3, 1), executeFunction( "positionUTF8", {createConstColumn(3, ""), createConstColumn(3, "123")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(1, 5), executeFunction( "positionUTF8", {createConstColumn(1, ".*"), createConstColumn(1, "123啊.*f啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(1, 5), executeFunction( "positionUTF8", {createConstColumn(1, "aBc"), createConstColumn(1, "1啊23aBc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 0), executeFunction( "positionUTF8", {createConstColumn(2, "aBc"), createConstColumn(2, "1啊23abc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(10, 0), executeFunction( "positionUTF8", {createConstColumn(10, "人"), createConstColumn(10, "3啊*f啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(6, 0), executeFunction( "positionUTF8", {createConstColumn(6, "123"), createConstColumn(6, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(6, 1), executeFunction( "positionUTF8", {createConstColumn(6, ""), createConstColumn(6, "")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 3), executeFunction( "positionUTF8", {createConstColumn(2, "123 "), createConstColumn(2, "ce123 fe")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 0), executeFunction( "positionUTF8", {createConstColumn(2, "123 "), createConstColumn(2, "ce123fe ")}, collator)); } } // case insensitive { for (const auto * collator : ci_collators) { ASSERT_COLUMN_EQ( createConstColumn(1, 5), executeFunction( "positionUTF8", {createConstColumn(1, "aBc"), createConstColumn(1, "1啊23aBc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 5), executeFunction( "positionUTF8", {createConstColumn(2, "aBc"), createConstColumn(2, "1啊23abc啊")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 3), executeFunction( "positionUTF8", {createConstColumn(2, "abc "), createConstColumn(2, "ceaBc fe")}, collator)); ASSERT_COLUMN_EQ( createConstColumn(2, 0), executeFunction( "positionUTF8", {createConstColumn(2, "abc "), createConstColumn(2, "ceaBcfe ")}, collator)); } } } // const vector { // case sensitive and no collator { for (const auto * collator : cs_and_no_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction( "positionUTF8", {createConstColumn(0, ""), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1}), executeFunction( "positionUTF8", {createConstColumn(2, ""), createColumn({"", "12A哇"})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 5, 0}), executeFunction( "positionUTF8", {createConstColumn(3, "a啊B.*"), createColumn({"", "2aF啊a啊B.*fe# ", "2aF啊A啊b.*fe "})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 0, 5}), executeFunction( "positionUTF8", {createConstColumn(3, "123 "), createColumn({"", "2aF啊123.*fe# ", "2aF啊123 .*fe "})}, collator)); } } // case insensitive { for (const auto * collator : ci_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction( "positionUTF8", {createConstColumn(0, ""), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1}), executeFunction( "positionUTF8", {createConstColumn(2, ""), createColumn({"", "12A哇"})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 5, 5}), executeFunction( "positionUTF8", {createConstColumn(3, "a啊B.*"), createColumn({"", "2.F啊a啊B.*fe#", "2a.啊A啊b.*fe"})}, collator)); ASSERT_COLUMN_EQ( createColumn({0, 0, 5}), executeFunction( "positionUTF8", {createConstColumn(3, "abc "), createColumn({"", "2aF啊aBc.*fe# ", "2aF啊abC .*fe "})}, collator)); } } } // vector const { // case sensitive { for (const auto * collator : cs_and_no_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction( "positionUTF8", {createColumn({}), createConstColumn(0, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 5, 0, 0, 13}), executeFunction( "positionUTF8", {createColumn({"", "A啊q", "g4GFE4g", "a啊q", ".*"}), createConstColumn(5, "f$*eA啊q飞F#f。.*&")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 0, 0, 0}), executeFunction( "positionUTF8", {createColumn({"", "A啊q", "a啊q", ".*"}), createConstColumn(4, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 5, 0, 0}), executeFunction( "positionUTF8", {createColumn({"", "A啊q ", "a啊q ", ".*"}), createConstColumn(4, "cew爬A啊q 3 ")}, collator)); } } // case insensitive { for (const auto * collator : ci_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction( "positionUTF8", {createColumn({}), createConstColumn(0, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 5, 0, 5, 13}), executeFunction( "positionUTF8", {createColumn({"", "A啊q", "g4GFE4g", "a啊Q", ".*"}), createConstColumn(5, "f$*eA啊q飞F#f。.*&")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 0, 0, 0}), executeFunction( "positionUTF8", {createColumn({"", "A啊q", "a啊q", ".*"}), createConstColumn(4, "")}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 5, 5, 0}), executeFunction( "positionUTF8", {createColumn({"", "A啊q ", "a啊q ", ".*"}), createConstColumn(4, "cew爬A啊q 3 ")}, collator)); } } } // vector vector { // case sensitive { for (const auto * collator : cs_and_no_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction("positionUTF8", {createColumn({}), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1, 0, 6, 0, 1, 0, 5}), executeFunction( "positionUTF8", {createColumn({"", "", "123", "G$啊3", "G$啊w3", "啊3法4fd", "aBc ", "aBc "}), createColumn( {"", "123", "", "da嗯w$G$啊3gf4", "w好g$啊w33", "啊3法4fd", "啊3aBc法4fd ", "few人aBc "})}, collator)); } } // case insensitive { for (const auto * collator : ci_collators) { ASSERT_COLUMN_EQ( createColumn({}), executeFunction("positionUTF8", {createColumn({}), createColumn({})}, collator)); ASSERT_COLUMN_EQ( createColumn({1, 1, 0, 6, 3, 1, 0, 5}), executeFunction( "positionUTF8", {createColumn({"", "", "123", "G$啊3", "G$啊w3", "啊3法4fD", "aBc ", "aBc "}), createColumn( {"", "123", "", "da嗯w$G$啊3gf4", "w好g$啊w33", "啊3法4fd", "啊3aBC法4fd ", "few人ABc "})}, collator)); } } } // nullable const { const auto * collator = TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_BIN); ASSERT_COLUMN_EQ( createNullableColumn({}, std::vector{}), executeFunction( "positionUTF8", {createNullableColumn({}, std::vector{}), createConstColumn(0, "")}, collator)); std::vector null_map{0, 1, 0, 0, 0, 1}; ASSERT_COLUMN_EQ( createNullableColumn({1, 0, 0, 0, 0, 0}, null_map), executeFunction( "positionUTF8", {createNullableColumn({"", "", "ad", "aB啊c", ".*", ""}, null_map), createConstColumn(6, "")}, collator)); ASSERT_COLUMN_EQ( createNullableColumn({1, 0, 5, 0, 0, 0}, null_map), executeFunction( "positionUTF8", {createNullableColumn({"", "", "A啊q", "g4GFE4g", "a啊q", ""}, null_map), createConstColumn(6, "f$*eA啊q飞F#f。.*&")}, collator)); } // nullable vector { const auto * collator = TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_BIN); ASSERT_COLUMN_EQ( createNullableColumn({}, std::vector{}), executeFunction( "positionUTF8", {createNullableColumn({}, std::vector{}), createColumn({})}, collator)); std::vector null_map{0, 1, 0, 0, 0, 1, 0}; ASSERT_COLUMN_EQ( createNullableColumn({1, 0, 1, 0, 0, 0, 3}, null_map), executeFunction( "positionUTF8", {createNullableColumn({"", "", "ad", "aB啊c", ".*", "", "c"}, null_map), createColumn({"", "", "ad", "ab啊c", "123", "", "ACc"})}, collator)); } // nullable nullable { const auto * collator = TiDB::ITiDBCollator::getCollator(TiDB::ITiDBCollator::UTF8MB4_BIN); ASSERT_COLUMN_EQ( createNullableColumn({}, std::vector{}), executeFunction( "positionUTF8", {createNullableColumn({}, std::vector{}), createNullableColumn({}, std::vector{})}, collator)); std::vector col0_null_map{0, 0, 0, 1, 0, 0, 1, 0}; std::vector col1_null_map{1, 0, 0, 0, 1, 0, 1, 0}; std::vector res_null_map{1, 0, 0, 1, 1, 0, 1, 0}; ASSERT_COLUMN_EQ( createNullableColumn({0, 0, 1, 0, 0, 1, 0, 3}, res_null_map), executeFunction( "positionUTF8", {createNullableColumn({"", "aB啊c", "ad", "", "", "", "", "c"}, col0_null_map), createNullableColumn({"", "ab啊c", "ad", "", "", "", "", "ACc"}, col1_null_map)}, collator)); } } } // namespace tests } // namespace DB