1 | #include <iomanip> |
2 | #include <Parsers/ASTInsertQuery.h> |
3 | #include <Parsers/ASTFunction.h> |
4 | #include <Common/quoteString.h> |
5 | |
6 | |
7 | namespace DB |
8 | { |
9 | |
10 | namespace ErrorCodes |
11 | { |
12 | extern const int INVALID_USAGE_OF_INPUT; |
13 | } |
14 | |
15 | |
16 | void ASTInsertQuery::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const |
17 | { |
18 | frame.need_parens = false; |
19 | |
20 | settings.ostr << (settings.hilite ? hilite_keyword : "" ) << "INSERT INTO " ; |
21 | if (table_function) |
22 | { |
23 | settings.ostr << (settings.hilite ? hilite_keyword : "" ) << "FUNCTION " ; |
24 | table_function->formatImpl(settings, state, frame); |
25 | } |
26 | else |
27 | settings.ostr << (settings.hilite ? hilite_none : "" ) |
28 | << (!database.empty() ? backQuoteIfNeed(database) + "." : "" ) << backQuoteIfNeed(table); |
29 | |
30 | if (columns) |
31 | { |
32 | settings.ostr << " (" ; |
33 | columns->formatImpl(settings, state, frame); |
34 | settings.ostr << ")" ; |
35 | } |
36 | |
37 | if (select) |
38 | { |
39 | settings.ostr << " " ; |
40 | select->formatImpl(settings, state, frame); |
41 | } |
42 | else |
43 | { |
44 | if (!format.empty()) |
45 | { |
46 | settings.ostr << (settings.hilite ? hilite_keyword : "" ) << " FORMAT " << (settings.hilite ? hilite_none : "" ) << format; |
47 | } |
48 | else |
49 | { |
50 | settings.ostr << (settings.hilite ? hilite_keyword : "" ) << " VALUES" << (settings.hilite ? hilite_none : "" ); |
51 | } |
52 | } |
53 | |
54 | if (settings_ast) |
55 | { |
56 | settings.ostr << (settings.hilite ? hilite_keyword : "" ) << "SETTINGS " << (settings.hilite ? hilite_none : "" ); |
57 | settings_ast->formatImpl(settings, state, frame); |
58 | } |
59 | } |
60 | |
61 | |
62 | static void tryFindInputFunctionImpl(const ASTPtr & ast, ASTPtr & input_function) |
63 | { |
64 | if (!ast) |
65 | return; |
66 | for (const auto & child : ast->children) |
67 | tryFindInputFunctionImpl(child, input_function); |
68 | |
69 | if (const auto * table_function_ast = ast->as<ASTFunction>()) |
70 | { |
71 | if (table_function_ast->name == "input" ) |
72 | { |
73 | if (input_function) |
74 | throw Exception("You can use 'input()' function only once per request." , ErrorCodes::INVALID_USAGE_OF_INPUT); |
75 | input_function = ast; |
76 | } |
77 | } |
78 | } |
79 | |
80 | |
81 | void ASTInsertQuery::tryFindInputFunction(ASTPtr & input_function) const |
82 | { |
83 | tryFindInputFunctionImpl(select, input_function); |
84 | } |
85 | |
86 | } |
87 | |