Files
email-tracker/external/duckdb/extension/json/include/json_transform.hpp
2025-10-24 19:21:19 -05:00

80 lines
2.9 KiB
C++

//===----------------------------------------------------------------------===//
// DuckDB
//
// json_functions.hpp
//
//
//===----------------------------------------------------------------------===//
#pragma once
#include "duckdb/common/column_index.hpp"
#include "duckdb/common/optional_ptr.hpp"
#include "duckdb/function/scalar/strftime_format.hpp"
#include "json_common.hpp"
namespace duckdb {
struct DateFormatMap;
class JSONReader;
//! Options for error handling while transforming JSON
struct JSONTransformOptions {
public:
JSONTransformOptions();
JSONTransformOptions(bool strict_cast, bool error_duplicate_key, bool error_missing_key, bool error_unkown_key);
public:
//! Throws an error if the cast doesn't work (instead of NULL-ing it)
bool strict_cast = false;
//! Throws an error if there is a duplicate key (instead of ignoring it)
bool error_duplicate_key = false;
//! Throws an error if a key is missing (instead of NULL-ing it)
bool error_missing_key = false;
//! Throws an error if an object has a key we didn't know about
bool error_unknown_key = false;
//! Whether to delay the error when transforming (e.g., when non-strict casting or reading from file)
bool delay_error = false;
//! Date format used for parsing (can be NULL)
optional_ptr<const DateFormatMap> date_format_map = nullptr;
//! String to store errors in
string error_message;
//! Index of the object where the error occurred
idx_t object_index = DConstants::INVALID_INDEX;
//! Cast parameters
CastParameters parameters;
public:
void Serialize(Serializer &serializer) const;
static JSONTransformOptions Deserialize(Deserializer &deserializer);
};
struct TryParseDate {
template <class T>
static inline bool Operation(const StrpTimeFormat &format, const string_t &input, T &result,
string &error_message) {
return format.TryParseDate(input, result, error_message);
}
};
struct TryParseTimeStamp {
template <class T>
static inline bool Operation(const StrpTimeFormat &format, const string_t &input, T &result,
string &error_message) {
return format.TryParseTimestamp(input, result, error_message);
}
};
struct JSONTransform {
static bool Transform(yyjson_val *vals[], yyjson_alc *alc, Vector &result, const idx_t count,
JSONTransformOptions &options, optional_ptr<const ColumnIndex> column_index);
static bool TransformObject(yyjson_val *objects[], yyjson_alc *alc, const idx_t count, const vector<string> &names,
const vector<Vector *> &result_vectors, JSONTransformOptions &options,
optional_ptr<const vector<ColumnIndex>> column_indices, bool error_unknown_key);
static bool GetStringVector(yyjson_val *vals[], const idx_t count, const LogicalType &target, Vector &string_vector,
JSONTransformOptions &options);
};
} // namespace duckdb