// 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 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" #include #include #include #include #pragma GCC diagnostic pop namespace DB { namespace tests { class Regexp : public FunctionTest { protected: static bool isColumnConstNull(const ColumnWithTypeAndName & column_with_type) { return column_with_type.column->isColumnConst() && column_with_type.column->isNullAt(0); } static bool isColumnConst(const ColumnWithTypeAndName & column_with_type) { return column_with_type.column->isColumnConst(); } static bool isColumnConstNotNull(const ColumnWithTypeAndName & column_with_type) { return column_with_type.column->isColumnConst() && !column_with_type.column->isNullAt(0); } static bool isNullableColumnVector(const ColumnWithTypeAndName & column_with_type) { return !column_with_type.column->isColumnConst() && column_with_type.type->isNullable(); } template ColumnWithTypeAndName createNullableVectorColumn( const InferredDataVector & vec, const std::vector & null_map) { using NullableType = Nullable; InferredDataVector nullable_vec; for (size_t i = 0; i < null_map.size(); i++) { if (null_map[i]) nullable_vec.push_back({}); else nullable_vec.push_back(vec[i]); } return createColumn(nullable_vec); } }; template static std::vector getResultVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.result); return vecs; } template static std::vector getExprVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.expression); return vecs; } template static std::vector getPatVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.pattern); return vecs; } template static std::vector getReplVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.replacement); return vecs; } template static std::vector getPosVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.position); return vecs; } template static std::vector getOccurVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.occurrence); return vecs; } template static std::vector getRetOpVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.return_option); return vecs; } template static std::vector getMatchTypeVec(const std::vector & test_cases) { std::vector vecs; vecs.reserve(test_cases.size()); for (const auto & elem : test_cases) vecs.push_back(elem.match_type); return vecs; } } // namespace tests } // namespace DB