// 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 #include #include #include "common/exception.h" #include "common/status.h" #include "core/data_type/define_primitive_type.h" #include "core/types.h" #include "exprs/function/function_unary_arithmetic.h" #include "exprs/function/simple_function_factory.h" namespace doris { struct NameBitCount { static constexpr auto name = "bit_count"; }; template struct BitCountImpl { // No unsigned type in Java. So we need signed number as return type // Int8_MAX = 127 static constexpr PrimitiveType ResultType = sizeof(T) * 8 >= 128 ? TYPE_SMALLINT : TYPE_TINYINT; using DataType = typename PrimitiveTypeTraits::DataType; static inline typename PrimitiveTypeTraits::CppType apply(T a) { if constexpr (std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v) { // ResultType already check the length return cast_set::CppType, int, false>( std::popcount(static_cast>(a))); } else { throw Exception(ErrorCode::INVALID_ARGUMENT, "bit_count only support using INTEGER as operator"); } } }; using FunctionBitCountTinyInt = FunctionUnaryArithmetic, NameBitCount, TYPE_TINYINT>; using FunctionBitCountSmallInt = FunctionUnaryArithmetic, NameBitCount, TYPE_SMALLINT>; using FunctionBitCountInt = FunctionUnaryArithmetic, NameBitCount, TYPE_INT>; using FunctionBitCountBigInt = FunctionUnaryArithmetic, NameBitCount, TYPE_BIGINT>; using FunctionBitCountLargeInt = FunctionUnaryArithmetic, NameBitCount, TYPE_LARGEINT>; void register_function_bit_count(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); factory.register_function(); factory.register_function(); } } // namespace doris