#include #include #include #include namespace DB { namespace ErrorCodes { extern const int ILLEGAL_TYPE_OF_ARGUMENT; } /** Calculates the crc32 of a string */ struct CRC32Impl { static constexpr auto is_fixed_to_constant = true; static void vector(const ColumnString::Chars & data, const ColumnString::Offsets & offsets, PaddedPODArray & res) { size_t size = offsets.size(); ColumnString::Offset prev_offset = 0; for (size_t i = 0; i < size; ++i) { res[i] = do_crc32(data, prev_offset, offsets[i] - prev_offset - 1); prev_offset = offsets[i]; } } static void vector_fixed_to_constant(const ColumnString::Chars & data, size_t n, UInt32 & res) { res = do_crc32(data, 0, n); } static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray & res) { size_t size = data.size() / n; for (size_t i = 0; i < size; ++i) { res[i] = do_crc32(data, i * n, n); } } static void array(const ColumnString::Offsets & /*offsets*/, PaddedPODArray & /*res*/) { throw Exception("Cannot apply function crc32 to Array argument", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } private: static uint32_t do_crc32(const ColumnString::Chars & buf, size_t offset, size_t size) { const unsigned char * p = reinterpret_cast(&buf[0]) + offset; return crc32(0L, p, size); } }; struct NameCRC32 { static constexpr auto name = "crc32"; }; using FunctionCRC32 = FunctionStringOrArrayToT; void registerFunctionCRC32(FunctionFactory & factory) { factory.registerFunction(); } }