ClickHouse/src/Formats/FormatSettings.h

223 lines
6.2 KiB
C++
Raw Normal View History

#pragma once
2021-10-02 07:13:14 +00:00
#include <base/types.h>
namespace DB
{
/**
* Various tweaks for input/output formats. Text serialization/deserialization
* of data types also depend on some of these settings. It is different from
* FormatFactorySettings in that it has all necessary user-provided settings
* combined with information from context etc, that we can use directly during
* serialization. In contrast, FormatFactorySettings' job is to reflect the
* changes made to user-visible format settings, such as when tweaking the
* the format for File engine.
* NOTE Parameters for unrelated formats and unrelated data types are collected
* in this struct - it prevents modularity, but they are difficult to separate.
*/
struct FormatSettings
{
2020-04-27 15:21:53 +00:00
/// Format will be used for streaming. Not every formats support it
/// Option means that each chunk of data need to be formatted independently. Also each chunk will be flushed at the end of processing.
bool enable_streaming = false;
bool skip_unknown_fields = false;
bool with_names_use_header = false;
bool with_types_use_header = false;
bool write_statistics = true;
bool import_nested_json = false;
bool null_as_default = true;
2021-08-16 08:03:23 +00:00
bool decimal_trailing_zeros = false;
bool defaults_for_omitted_fields = true;
2021-10-31 19:53:24 +00:00
bool seekable_read = true;
enum class DateTimeInputFormat
{
Basic, /// Default format for fast parsing: YYYY-MM-DD hh:mm:ss (ISO-8601 without fractional part and timezone) or NNNNNNNNNN unix timestamp.
BestEffort /// Use sophisticated rules to parse whatever possible.
};
DateTimeInputFormat date_time_input_format = DateTimeInputFormat::Basic;
enum class DateTimeOutputFormat
{
Simple,
ISO,
UnixTimestamp
};
2021-11-09 13:14:07 +00:00
enum class EscapingRule
{
None,
Escaped,
Quoted,
CSV,
JSON,
XML,
Raw
};
DateTimeOutputFormat date_time_output_format = DateTimeOutputFormat::Simple;
UInt64 input_allow_errors_num = 0;
2019-01-07 19:56:53 +00:00
Float32 input_allow_errors_ratio = 0;
2019-02-19 20:51:44 +00:00
struct
2020-05-03 12:26:39 +00:00
{
UInt64 row_group_size = 1000000;
bool low_cardinality_as_dictionary = false;
bool import_nested = false;
2020-05-03 12:26:39 +00:00
} arrow;
struct
2019-02-19 20:51:44 +00:00
{
String schema_registry_url;
String output_codec;
UInt64 output_sync_interval = 16 * 1024;
bool allow_missing_fields = false;
2021-07-09 16:18:22 +00:00
String string_column_pattern;
UInt64 output_rows_in_file = 1;
} avro;
2019-02-19 20:51:44 +00:00
2021-11-19 05:22:44 +00:00
String bool_true_representation = "true";
String bool_false_representation = "false";
2021-11-10 08:08:24 +00:00
struct CSV
{
char delimiter = ',';
bool allow_single_quotes = true;
bool allow_double_quotes = true;
bool empty_as_default = false;
bool crlf_end_of_line = false;
bool input_format_enum_as_number = false;
bool input_format_arrays_as_nested_csv = false;
String null_representation = "\\N";
2021-12-20 16:25:54 +00:00
char tuple_delimiter = ',';
} csv;
struct Custom
{
std::string result_before_delimiter;
std::string result_after_delimiter;
std::string row_before_delimiter;
std::string row_after_delimiter;
std::string row_between_delimiter;
std::string field_delimiter;
2021-11-09 13:14:07 +00:00
EscapingRule escaping_rule = EscapingRule::Escaped;
} custom;
struct
{
bool array_of_rows = false;
bool quote_64bit_integers = true;
bool quote_denormals = true;
bool escape_forward_slashes = true;
bool named_tuples_as_objects = false;
bool serialize_as_strings = false;
} json;
struct
{
UInt64 row_group_size = 1000000;
bool import_nested = false;
} parquet;
struct Pretty
{
UInt64 max_rows = 10000;
UInt64 max_column_pad_width = 250;
UInt64 max_value_width = 10000;
bool color = true;
bool output_format_pretty_row_numbers = false;
enum class Charset
{
UTF8,
ASCII,
};
2020-01-11 07:01:20 +00:00
Charset charset = Charset::UTF8;
} pretty;
struct
{
/**
* Some buffers (kafka / rabbit) split the rows internally using callback,
* and always send one row per message, so we can push there formats
* without framing / delimiters (like ProtobufSingle). In other cases,
* we have to enforce exporting at most one row in the format output,
* because Protobuf without delimiters is not generally useful.
*/
bool allow_multiple_rows_without_delimiter = false;
} protobuf;
2021-07-16 10:10:56 +00:00
struct
{
uint32_t client_capabilities = 0;
size_t max_packet_size = 0;
uint8_t * sequence_id = nullptr; /// Not null if it's MySQLWire output format used to handle MySQL protocol connections.
} mysql_wire;
struct
{
std::string regexp;
2021-11-09 13:14:07 +00:00
EscapingRule escaping_rule = EscapingRule::Raw;
bool skip_unmatched = false;
} regexp;
struct
{
std::string format_schema;
std::string format_schema_path;
bool is_server = false;
} schema;
struct
{
String resultset_format;
String row_format;
String row_between_delimiter;
} template_settings;
struct
{
bool empty_as_default = false;
bool crlf_end_of_line = false;
String null_representation = "\\N";
bool input_format_enum_as_number = false;
} tsv;
struct
{
bool interpret_expressions = true;
bool deduce_templates_of_expressions = true;
bool accurate_types_of_literals = true;
} values;
struct
{
bool import_nested = false;
int64_t row_batch_size = 100'000;
} orc;
2021-09-28 13:07:00 +00:00
/// For capnProto format we should determine how to
/// compare ClickHouse Enum and Enum from schema.
enum class EnumComparingMode
{
BY_NAMES, // Names in enums should be the same, values can be different.
BY_NAMES_CASE_INSENSITIVE, // Case-insensitive name comparison.
BY_VALUES, // Values should be the same, names can be different.
};
struct
{
EnumComparingMode enum_comparing_mode = EnumComparingMode::BY_VALUES;
} capn_proto;
};
}