aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Formats/ParsedTemplateFormatString.h
blob: 5d7ee820f2ffffd6202247a4a17e0b65fd037ee6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#pragma once

#include <base/types.h>
#include <functional>
#include <optional>
#include <vector>
#include <Formats/FormatSchemaInfo.h>
#include <Formats/FormatSettings.h>

namespace DB
{

class Block;
using Strings = std::vector<String>;

struct ParsedTemplateFormatString
{
    using EscapingRule = FormatSettings::EscapingRule;

    /// Format string has syntax: "Delimiter0 ${ColumnName0:Format0} Delimiter1 ${ColumnName1:Format1} Delimiter2"
    /// The following vectors is filled with corresponding values, delimiters.size() - 1 = formats.size() = format_idx_to_column_idx.size()
    /// If format_idx_to_column_idx[i] has no value, then TemplateRowInputFormat will skip i-th column.

    std::vector<String> delimiters;
    std::vector<EscapingRule> escaping_rules;
    std::vector<std::optional<size_t>> format_idx_to_column_idx;

    /// For diagnostic info
    Strings column_names;

    using ColumnIdxGetter = std::function<std::optional<size_t>(const String &)>;

    ParsedTemplateFormatString() = default;
    ParsedTemplateFormatString(const FormatSchemaInfo & schema, const ColumnIdxGetter & idx_by_name, bool allow_indexes = true);

    void parse(const String & format_string, const ColumnIdxGetter & idx_by_name, bool allow_indexes = true);

    static const char * readMayBeQuotedColumnNameInto(const char * pos, size_t size, String & s);
    size_t columnsCount() const;

    String dump() const;
    [[noreturn]] void throwInvalidFormat(const String & message, size_t column) const;
};

}