mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-19 16:20:50 +00:00
init
This commit is contained in:
parent
eea07e9a7e
commit
c37fc005d3
@ -123,7 +123,7 @@ public:
|
||||
class Executor
|
||||
{
|
||||
public:
|
||||
static ColumnPtr run(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, uint32_t parse_depth, uint32_t parse_backtracks, const ContextPtr & context)
|
||||
static ColumnPtr run(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, uint32_t parse_depth, uint32_t parse_backtracks, const bool & function_json_value_return_type_allow_complex)
|
||||
{
|
||||
MutableColumnPtr to{result_type->createColumn()};
|
||||
to->reserve(input_rows_count);
|
||||
@ -191,7 +191,7 @@ public:
|
||||
{
|
||||
/// Instead of creating a new generator for each row, we can reuse the same one.
|
||||
generator_json_path.reinitialize();
|
||||
added_to_column = impl.insertResultToColumn(*to, document, generator_json_path, context);
|
||||
added_to_column = impl.insertResultToColumn(*to, document, generator_json_path, function_json_value_return_type_allow_complex);
|
||||
}
|
||||
if (!added_to_column)
|
||||
{
|
||||
@ -204,13 +204,25 @@ public:
|
||||
};
|
||||
|
||||
template <typename Name, template <typename, typename> typename Impl>
|
||||
class FunctionSQLJSON : public IFunction, WithConstContext
|
||||
class FunctionSQLJSON : public IFunction
|
||||
{
|
||||
public:
|
||||
static FunctionPtr create(ContextPtr context_) { return std::make_shared<FunctionSQLJSON>(context_); }
|
||||
explicit FunctionSQLJSON(ContextPtr context_) : WithConstContext(context_) { }
|
||||
explicit FunctionSQLJSON(ContextPtr context_)
|
||||
{
|
||||
max_parser_depth = context_->getSettingsRef().max_parser_depth;
|
||||
max_parser_backtracks = context_->getSettingsRef().max_parser_backtracks;
|
||||
allow_simdjson = context_->getSettingsRef().allow_simdjson;
|
||||
function_json_value_return_type_allow_complex = context_->getSettingsRef().function_json_value_return_type_allow_complex;
|
||||
function_json_value_return_type_allow_nullable = context_->getSettingsRef().function_json_value_return_type_allow_nullable;
|
||||
}
|
||||
|
||||
static constexpr auto name = Name::name;
|
||||
bool max_parser_depth;
|
||||
bool max_parser_backtracks;
|
||||
bool allow_simdjson;
|
||||
bool function_json_value_return_type_allow_complex;
|
||||
bool function_json_value_return_type_allow_nullable;
|
||||
String getName() const override { return Name::name; }
|
||||
bool isVariadic() const override { return true; }
|
||||
size_t getNumberOfArguments() const override { return 0; }
|
||||
@ -221,7 +233,7 @@ public:
|
||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||
{
|
||||
return Impl<DummyJSONParser, DefaultJSONStringSerializer<DummyJSONParser::Element>>::getReturnType(
|
||||
Name::name, arguments, getContext());
|
||||
Name::name, arguments, function_json_value_return_type_allow_nullable);
|
||||
}
|
||||
|
||||
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override
|
||||
@ -231,18 +243,18 @@ public:
|
||||
/// 2. Create ASTPtr
|
||||
/// 3. Parser(Tokens, ASTPtr) -> complete AST
|
||||
/// 4. Execute functions: call getNextItem on generator and handle each item
|
||||
unsigned parse_depth = static_cast<unsigned>(getContext()->getSettingsRef().max_parser_depth);
|
||||
unsigned parse_backtracks = static_cast<unsigned>(getContext()->getSettingsRef().max_parser_backtracks);
|
||||
unsigned parse_depth = static_cast<unsigned>(max_parser_depth);
|
||||
unsigned parse_backtracks = static_cast<unsigned>(max_parser_backtracks);
|
||||
#if USE_SIMDJSON
|
||||
if (getContext()->getSettingsRef().allow_simdjson)
|
||||
if (allow_simdjson)
|
||||
return FunctionSQLJSONHelpers::Executor<
|
||||
Name,
|
||||
Impl<SimdJSONParser, JSONStringSerializer<SimdJSONParser::Element, SimdJSONElementFormatter>>,
|
||||
SimdJSONParser>::run(arguments, result_type, input_rows_count, parse_depth, parse_backtracks, getContext());
|
||||
SimdJSONParser>::run(arguments, result_type, input_rows_count, parse_depth, parse_backtracks, function_json_value_return_type_allow_complex);
|
||||
#endif
|
||||
return FunctionSQLJSONHelpers::
|
||||
Executor<Name, Impl<DummyJSONParser, DefaultJSONStringSerializer<DummyJSONParser::Element>>, DummyJSONParser>::run(
|
||||
arguments, result_type, input_rows_count, parse_depth, parse_backtracks, getContext());
|
||||
arguments, result_type, input_rows_count, parse_depth, parse_backtracks, function_json_value_return_type_allow_complex);
|
||||
}
|
||||
};
|
||||
|
||||
@ -267,11 +279,11 @@ class JSONExistsImpl
|
||||
public:
|
||||
using Element = typename JSONParser::Element;
|
||||
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const ContextPtr &) { return std::make_shared<DataTypeUInt8>(); }
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const bool &) { return std::make_shared<DataTypeUInt8>(); }
|
||||
|
||||
static size_t getNumberOfIndexArguments(const ColumnsWithTypeAndName & arguments) { return arguments.size() - 1; }
|
||||
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const ContextPtr &)
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const bool &)
|
||||
{
|
||||
Element current_element = root;
|
||||
VisitorStatus status;
|
||||
@ -305,9 +317,9 @@ class JSONValueImpl
|
||||
public:
|
||||
using Element = typename JSONParser::Element;
|
||||
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const ContextPtr & context)
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const bool & function_json_value_return_type_allow_nullable)
|
||||
{
|
||||
if (context->getSettingsRef().function_json_value_return_type_allow_nullable)
|
||||
if (function_json_value_return_type_allow_nullable)
|
||||
{
|
||||
DataTypePtr string_type = std::make_shared<DataTypeString>();
|
||||
return std::make_shared<DataTypeNullable>(string_type);
|
||||
@ -320,7 +332,7 @@ public:
|
||||
|
||||
static size_t getNumberOfIndexArguments(const ColumnsWithTypeAndName & arguments) { return arguments.size() - 1; }
|
||||
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const ContextPtr & context)
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const bool & function_json_value_return_type_allow_complex)
|
||||
{
|
||||
Element current_element = root;
|
||||
VisitorStatus status;
|
||||
@ -329,7 +341,7 @@ public:
|
||||
{
|
||||
if (status == VisitorStatus::Ok)
|
||||
{
|
||||
if (context->getSettingsRef().function_json_value_return_type_allow_complex)
|
||||
if (function_json_value_return_type_allow_complex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@ -383,11 +395,11 @@ class JSONQueryImpl
|
||||
public:
|
||||
using Element = typename JSONParser::Element;
|
||||
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const ContextPtr &) { return std::make_shared<DataTypeString>(); }
|
||||
static DataTypePtr getReturnType(const char *, const ColumnsWithTypeAndName &, const bool &) { return std::make_shared<DataTypeString>(); }
|
||||
|
||||
static size_t getNumberOfIndexArguments(const ColumnsWithTypeAndName & arguments) { return arguments.size() - 1; }
|
||||
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const ContextPtr &)
|
||||
static bool insertResultToColumn(IColumn & dest, const Element & root, GeneratorJSONPath<JSONParser> & generator_json_path, const bool &)
|
||||
{
|
||||
ColumnString & col_str = assert_cast<ColumnString &>(dest);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user