should be it
This commit is contained in:
103
external/duckdb/extension/json/json_extension.cpp
vendored
Normal file
103
external/duckdb/extension/json/json_extension.cpp
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
#include "json_extension.hpp"
|
||||
|
||||
#include "json_common.hpp"
|
||||
#include "json_functions.hpp"
|
||||
|
||||
#include "duckdb/catalog/catalog_entry/macro_catalog_entry.hpp"
|
||||
#include "duckdb/catalog/default/default_functions.hpp"
|
||||
#include "duckdb/function/copy_function.hpp"
|
||||
#include "duckdb/main/extension/extension_loader.hpp"
|
||||
#include "duckdb/parser/expression/function_expression.hpp"
|
||||
|
||||
namespace duckdb {
|
||||
|
||||
static const DefaultMacro JSON_MACROS[] = {
|
||||
{DEFAULT_SCHEMA,
|
||||
"json_group_array",
|
||||
{"x", nullptr},
|
||||
{{nullptr, nullptr}},
|
||||
"CAST('[' || string_agg(CASE WHEN x IS NULL THEN 'null'::JSON ELSE to_json(x) END, ',') || ']' AS JSON)"},
|
||||
{DEFAULT_SCHEMA,
|
||||
"json_group_object",
|
||||
{"n", "v", nullptr},
|
||||
{{nullptr, nullptr}},
|
||||
"CAST('{' || string_agg(to_json(n::VARCHAR) || ':' || CASE WHEN v IS NULL THEN 'null'::JSON ELSE to_json(v) END, "
|
||||
"',') || '}' AS JSON)"},
|
||||
{DEFAULT_SCHEMA,
|
||||
"json_group_structure",
|
||||
{"x", nullptr},
|
||||
{{nullptr, nullptr}},
|
||||
"json_structure(json_group_array(x))->0"},
|
||||
{DEFAULT_SCHEMA, "json", {"x", nullptr}, {{nullptr, nullptr}}, "json_extract(x, '$')"},
|
||||
{nullptr, nullptr, {nullptr}, {{nullptr, nullptr}}, nullptr}};
|
||||
|
||||
static void LoadInternal(ExtensionLoader &loader) {
|
||||
// JSON type
|
||||
auto json_type = LogicalType::JSON();
|
||||
loader.RegisterType(LogicalType::JSON_TYPE_NAME, std::move(json_type));
|
||||
|
||||
// JSON casts
|
||||
JSONFunctions::RegisterSimpleCastFunctions(loader);
|
||||
JSONFunctions::RegisterJSONCreateCastFunctions(loader);
|
||||
JSONFunctions::RegisterJSONTransformCastFunctions(loader);
|
||||
|
||||
// JSON scalar functions
|
||||
for (auto &fun : JSONFunctions::GetScalarFunctions()) {
|
||||
loader.RegisterFunction(fun);
|
||||
}
|
||||
|
||||
// JSON table functions
|
||||
for (auto &fun : JSONFunctions::GetTableFunctions()) {
|
||||
loader.RegisterFunction(fun);
|
||||
}
|
||||
|
||||
// JSON pragma functions
|
||||
for (auto &fun : JSONFunctions::GetPragmaFunctions()) {
|
||||
loader.RegisterFunction(fun);
|
||||
}
|
||||
|
||||
// JSON replacement scan
|
||||
DBConfig::GetConfig(loader.GetDatabaseInstance())
|
||||
.replacement_scans.emplace_back(JSONFunctions::ReadJSONReplacement);
|
||||
|
||||
// JSON copy function
|
||||
auto copy_fun = JSONFunctions::GetJSONCopyFunction();
|
||||
loader.RegisterFunction(copy_fun);
|
||||
copy_fun.extension = "ndjson";
|
||||
copy_fun.name = "ndjson";
|
||||
loader.RegisterFunction(copy_fun);
|
||||
copy_fun.extension = "jsonl";
|
||||
copy_fun.name = "jsonl";
|
||||
loader.RegisterFunction(copy_fun);
|
||||
|
||||
// JSON macro's
|
||||
for (idx_t index = 0; JSON_MACROS[index].name != nullptr; index++) {
|
||||
auto info = DefaultFunctionGenerator::CreateInternalMacroInfo(JSON_MACROS[index]);
|
||||
loader.RegisterFunction(*info);
|
||||
}
|
||||
}
|
||||
|
||||
void JsonExtension::Load(ExtensionLoader &loader) {
|
||||
LoadInternal(loader);
|
||||
}
|
||||
|
||||
std::string JsonExtension::Name() {
|
||||
return "json";
|
||||
}
|
||||
|
||||
std::string JsonExtension::Version() const {
|
||||
#ifdef EXT_VERSION_JSON
|
||||
return EXT_VERSION_JSON;
|
||||
#else
|
||||
return "";
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace duckdb
|
||||
|
||||
extern "C" {
|
||||
|
||||
DUCKDB_CPP_EXTENSION_ENTRY(json, loader) {
|
||||
duckdb::LoadInternal(loader);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user