Packages

An Elixir DuckDB library

Current section

Files

Jump to
exduckdb c_src duckdb src function scalar string strip_accents.cpp
Raw

c_src/duckdb/src/function/scalar/string/strip_accents.cpp

#include "duckdb/function/scalar/string_functions.hpp"
#include "utf8proc.hpp"
namespace duckdb {
bool StripAccentsFun::IsAscii(const char *input, idx_t n) {
for (idx_t i = 0; i < n; i++) {
if (input[i] & 0x80) {
// non-ascii character
return false;
}
}
return true;
}
struct StripAccentsOperator {
template <class INPUT_TYPE, class RESULT_TYPE>
static RESULT_TYPE Operation(INPUT_TYPE input, Vector &result) {
if (StripAccentsFun::IsAscii(input.GetDataUnsafe(), input.GetSize())) {
return input;
}
// non-ascii, perform collation
auto stripped = utf8proc_remove_accents((const utf8proc_uint8_t *)input.GetDataUnsafe(), input.GetSize());
auto result_str = StringVector::AddString(result, (const char *)stripped);
free(stripped);
return result_str;
}
};
static void StripAccentsFunction(DataChunk &args, ExpressionState &state, Vector &result) {
D_ASSERT(args.ColumnCount() == 1);
UnaryExecutor::ExecuteString<string_t, string_t, StripAccentsOperator>(args.data[0], result, args.size());
StringVector::AddHeapReference(result, args.data[0]);
}
ScalarFunction StripAccentsFun::GetFunction() {
return ScalarFunction("strip_accents", {LogicalType::VARCHAR}, LogicalType::VARCHAR, StripAccentsFunction);
}
void StripAccentsFun::RegisterFunction(BuiltinFunctions &set) {
set.AddFunction(StripAccentsFun::GetFunction());
}
} // namespace duckdb