[fix](json function) Fix the slow performance of get_json_path when processing JSONB (#24631)

When processing JSONB, automatically convert to jsonb_extract_string
This commit is contained in:
Chenyang Sun
2023-09-27 21:17:39 +08:00
committed by GitHub
parent 732f821c15
commit 68087f6c82
7 changed files with 628 additions and 2 deletions

View File

@ -25,6 +25,7 @@
#include <string>
#include <string_view>
#include <tuple>
#include <type_traits>
#include <utility>
// IWYU pragma: no_include <opentelemetry/common/threadlocal.h>
@ -352,6 +353,13 @@ public:
DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
return make_nullable(std::make_shared<typename Impl::ReturnType>());
}
DataTypes get_variadic_argument_types_impl() const override {
if constexpr (vectorized::HasGetVariadicArgumentTypesImpl<Impl>) {
return Impl::get_variadic_argument_types_impl();
} else {
return {};
}
}
Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
size_t result, size_t input_rows_count) const override {
@ -958,11 +966,19 @@ struct JsonbExtractBool : public JsonbExtractImpl<JsonbTypeBool> {
struct JsonbExtractInt : public JsonbExtractImpl<JsonbTypeInt> {
static constexpr auto name = "json_extract_int";
static constexpr auto alias = "jsonb_extract_int";
static constexpr auto name2 = "get_json_int";
static DataTypes get_variadic_argument_types_impl() {
return {std::make_shared<DataTypeJsonb>(), std::make_shared<DataTypeString>()};
}
};
struct JsonbExtractBigInt : public JsonbExtractImpl<JsonbTypeInt64> {
static constexpr auto name = "json_extract_bigint";
static constexpr auto alias = "jsonb_extract_bigint";
static constexpr auto name2 = "get_json_bigint";
static DataTypes get_variadic_argument_types_impl() {
return {std::make_shared<DataTypeJsonb>(), std::make_shared<DataTypeString>()};
}
};
struct JsonbExtractLargeInt : public JsonbExtractImpl<JsonbTypeInt128> {
@ -973,11 +989,19 @@ struct JsonbExtractLargeInt : public JsonbExtractImpl<JsonbTypeInt128> {
struct JsonbExtractDouble : public JsonbExtractImpl<JsonbTypeDouble> {
static constexpr auto name = "json_extract_double";
static constexpr auto alias = "jsonb_extract_double";
static constexpr auto name2 = "get_json_double";
static DataTypes get_variadic_argument_types_impl() {
return {std::make_shared<DataTypeJsonb>(), std::make_shared<DataTypeString>()};
}
};
struct JsonbExtractString : public JsonbExtractStringImpl<JsonbTypeString> {
static constexpr auto name = "json_extract_string";
static constexpr auto alias = "jsonb_extract_string";
static constexpr auto name2 = "get_json_string";
static DataTypes get_variadic_argument_types_impl() {
return {std::make_shared<DataTypeJsonb>(), std::make_shared<DataTypeString>()};
}
};
struct JsonbExtractJsonb : public JsonbExtractStringImpl<JsonbTypeJson> {
@ -1310,14 +1334,18 @@ void register_function_jsonb(SimpleFunctionFactory& factory) {
factory.register_alias(FunctionJsonbExtractBool::name, FunctionJsonbExtractBool::alias);
factory.register_function<FunctionJsonbExtractInt>();
factory.register_alias(FunctionJsonbExtractInt::name, FunctionJsonbExtractInt::alias);
factory.register_function<FunctionJsonbExtractInt>(JsonbExtractInt::name2);
factory.register_function<FunctionJsonbExtractBigInt>();
factory.register_alias(FunctionJsonbExtractBigInt::name, FunctionJsonbExtractBigInt::alias);
factory.register_function<FunctionJsonbExtractBigInt>(JsonbExtractBigInt::name2);
factory.register_function<FunctionJsonbExtractLargeInt>();
factory.register_alias(FunctionJsonbExtractLargeInt::name, FunctionJsonbExtractLargeInt::alias);
factory.register_function<FunctionJsonbExtractDouble>();
factory.register_alias(FunctionJsonbExtractDouble::name, FunctionJsonbExtractDouble::alias);
factory.register_function<FunctionJsonbExtractDouble>(JsonbExtractDouble::name2);
factory.register_function<FunctionJsonbExtractString>();
factory.register_alias(FunctionJsonbExtractString::name, FunctionJsonbExtractString::alias);
factory.register_function<FunctionJsonbExtractString>(JsonbExtractString::name2);
factory.register_function<FunctionJsonbExtractJsonb>();
// factory.register_alias(FunctionJsonbExtractJsonb::name, FunctionJsonbExtractJsonb::alias);