[Optimization](functions)Optimize function call for const columns. (#18310)

This commit is contained in:
zclllyybb
2023-04-12 11:11:01 +08:00
committed by GitHub
parent 49a9956986
commit 43392918cd
25 changed files with 1718 additions and 849 deletions

View File

@ -25,7 +25,9 @@
#include "runtime/string_search.hpp"
#include "util/url_coding.h"
#include "vec/columns/column_string.h"
#include "vec/common/pod_array_fwd.h"
#include "vec/common/string_ref.h"
#include "vec/functions/function_reverse.h"
#include "vec/functions/function_string_to_string.h"
#include "vec/functions/function_totype.h"
@ -212,10 +214,10 @@ struct StringFunctionImpl {
using ResultDataType = typename OP::ResultDataType;
using ResultPaddedPODArray = typename OP::ResultPaddedPODArray;
static Status vector_vector(const ColumnString::Chars& ldata,
const ColumnString::Offsets& loffsets,
const ColumnString::Chars& rdata,
const ColumnString::Offsets& roffsets, ResultPaddedPODArray& res) {
static void vector_vector(const ColumnString::Chars& ldata,
const ColumnString::Offsets& loffsets,
const ColumnString::Chars& rdata,
const ColumnString::Offsets& roffsets, ResultPaddedPODArray& res) {
DCHECK_EQ(loffsets.size(), roffsets.size());
auto size = loffsets.size();
@ -232,8 +234,33 @@ struct StringFunctionImpl {
OP::execute(lview, rview, res[i]);
}
}
static void vector_scalar(const ColumnString::Chars& ldata,
const ColumnString::Offsets& loffsets, const StringRef& rdata,
ResultPaddedPODArray& res) {
auto size = loffsets.size();
res.resize(size);
std::string_view rview(rdata.data, rdata.size);
for (int i = 0; i < size; ++i) {
const char* l_raw_str = reinterpret_cast<const char*>(&ldata[loffsets[i - 1]]);
int l_str_size = loffsets[i] - loffsets[i - 1];
std::string_view lview(l_raw_str, l_str_size);
return Status::OK();
OP::execute(lview, rview, res[i]);
}
}
static void scalar_vector(const StringRef& ldata, const ColumnString::Chars& rdata,
const ColumnString::Offsets& roffsets, ResultPaddedPODArray& res) {
auto size = roffsets.size();
res.resize(size);
std::string_view lview(ldata.data, ldata.size);
for (int i = 0; i < size; ++i) {
const char* r_raw_str = reinterpret_cast<const char*>(&rdata[roffsets[i - 1]]);
int r_str_size = roffsets[i] - roffsets[i - 1];
std::string_view rview(r_raw_str, r_str_size);
OP::execute(lview, rview, res[i]);
}
}
};
@ -582,6 +609,66 @@ struct StringAppendTrailingCharIfAbsent {
res_offsets);
}
}
static void vector_scalar(FunctionContext* context, const Chars& ldata, const Offsets& loffsets,
const StringRef& rdata, Chars& res_data, Offsets& res_offsets,
NullMap& null_map_data) {
size_t input_rows_count = loffsets.size();
res_offsets.resize(input_rows_count);
fmt::memory_buffer buffer;
if (rdata.size != 1) {
for (size_t i = 0; i < input_rows_count; ++i) {
StringOP::push_null_string(i, res_data, res_offsets, null_map_data);
}
return;
}
for (size_t i = 0; i < input_rows_count; ++i) {
buffer.clear();
int l_size = loffsets[i] - loffsets[i - 1];
const auto l_raw = reinterpret_cast<const char*>(&ldata[loffsets[i - 1]]);
if (l_raw[l_size - 1] == rdata.data[0]) {
StringOP::push_value_string(std::string_view(l_raw, l_size), i, res_data,
res_offsets);
continue;
}
buffer.append(l_raw, l_raw + l_size);
buffer.append(rdata.begin(), rdata.end());
StringOP::push_value_string(std::string_view(buffer.data(), buffer.size()), i, res_data,
res_offsets);
}
}
static void scalar_vector(FunctionContext* context, const StringRef& ldata, const Chars& rdata,
const Offsets& roffsets, Chars& res_data, Offsets& res_offsets,
NullMap& null_map_data) {
size_t input_rows_count = roffsets.size();
res_offsets.resize(input_rows_count);
fmt::memory_buffer buffer;
for (size_t i = 0; i < input_rows_count; ++i) {
buffer.clear();
int r_size = roffsets[i] - roffsets[i - 1];
const auto r_raw = reinterpret_cast<const char*>(&rdata[roffsets[i - 1]]);
if (r_size != 1) {
StringOP::push_null_string(i, res_data, res_offsets, null_map_data);
continue;
}
if (ldata.size == 0 || ldata.back() == r_raw[0]) {
StringOP::push_value_string(ldata.to_string_view(), i, res_data, res_offsets);
continue;
}
buffer.append(ldata.begin(), ldata.end());
buffer.append(r_raw, r_raw + 1);
StringOP::push_value_string(std::string_view(buffer.data(), buffer.size()), i, res_data,
res_offsets);
}
}
};
struct StringLPad {
@ -625,8 +712,6 @@ using FunctionStringLocate =
using FunctionStringFindInSet =
FunctionBinaryToType<DataTypeString, DataTypeString, StringFindInSetImpl, NameFindInSet>;
using FunctionUnHex = FunctionStringOperateToNullType<UnHexImpl>;
using FunctionToLower = FunctionStringToString<TransferImpl<NameToLower>, NameToLower>;
using FunctionToUpper = FunctionStringToString<TransferImpl<NameToUpper>, NameToUpper>;
@ -639,8 +724,8 @@ using FunctionRTrim = FunctionStringToString<TrimImpl<false, true>, NameRTrim>;
using FunctionTrim = FunctionStringToString<TrimImpl<true, true>, NameTrim>;
using FunctionUnHex = FunctionStringOperateToNullType<UnHexImpl>;
using FunctionToBase64 = FunctionStringOperateToNullType<ToBase64Impl>;
using FunctionFromBase64 = FunctionStringOperateToNullType<FromBase64Impl>;
using FunctionStringAppendTrailingCharIfAbsent =