1 | #pragma once |
2 | |
3 | #include <Interpreters/IInterpreter.h> |
4 | #include <Storages/ColumnsDescription.h> |
5 | #include <Storages/IStorage_fwd.h> |
6 | #include <Storages/IndicesDescription.h> |
7 | #include <Storages/ConstraintsDescription.h> |
8 | #include <Common/ThreadPool.h> |
9 | |
10 | |
11 | namespace DB |
12 | { |
13 | |
14 | class Context; |
15 | class ASTCreateQuery; |
16 | class ASTExpressionList; |
17 | class ASTConstraintDeclaration; |
18 | |
19 | |
20 | /** Allows to create new table or database, |
21 | * or create an object for existing table or database. |
22 | */ |
23 | class InterpreterCreateQuery : public IInterpreter |
24 | { |
25 | public: |
26 | InterpreterCreateQuery(const ASTPtr & query_ptr_, Context & context_); |
27 | |
28 | BlockIO execute() override; |
29 | |
30 | /// List of columns and their types in AST. |
31 | static ASTPtr formatColumns(const NamesAndTypesList & columns); |
32 | static ASTPtr formatColumns(const ColumnsDescription & columns); |
33 | |
34 | static ASTPtr formatIndices(const IndicesDescription & indices); |
35 | static ASTPtr formatConstraints(const ConstraintsDescription & constraints); |
36 | |
37 | void setForceRestoreData(bool has_force_restore_data_flag_) |
38 | { |
39 | has_force_restore_data_flag = has_force_restore_data_flag_; |
40 | } |
41 | |
42 | void setInternal(bool internal_) |
43 | { |
44 | internal = internal_; |
45 | } |
46 | |
47 | /// Obtain information about columns, their types, default values and column comments, for case when columns in CREATE query is specified explicitly. |
48 | static ColumnsDescription getColumnsDescription(const ASTExpressionList & columns, const Context & context); |
49 | static ConstraintsDescription getConstraintsDescription(const ASTExpressionList * constraints); |
50 | |
51 | private: |
52 | struct TableProperties |
53 | { |
54 | ColumnsDescription columns; |
55 | IndicesDescription indices; |
56 | ConstraintsDescription constraints; |
57 | }; |
58 | |
59 | BlockIO createDatabase(ASTCreateQuery & create); |
60 | BlockIO createTable(ASTCreateQuery & create); |
61 | BlockIO createDictionary(ASTCreateQuery & create); |
62 | |
63 | /// Calculate list of columns, constraints, indices, etc... of table. Rewrite query in canonical way. |
64 | TableProperties setProperties(ASTCreateQuery & create) const; |
65 | void validateTableStructure(const ASTCreateQuery & create, const TableProperties & properties) const; |
66 | void setEngine(ASTCreateQuery & create) const; |
67 | void checkAccess(const ASTCreateQuery & create); |
68 | |
69 | /// Create IStorage and add it to database. If table already exists and IF NOT EXISTS specified, do nothing and return false. |
70 | bool doCreateTable(const ASTCreateQuery & create, const TableProperties & properties); |
71 | /// Inserts data in created table if it's CREATE ... SELECT |
72 | BlockIO fillTableIfNeeded(const ASTCreateQuery & create); |
73 | |
74 | ASTPtr query_ptr; |
75 | Context & context; |
76 | |
77 | /// Skip safety threshold when loading tables. |
78 | bool has_force_restore_data_flag = false; |
79 | /// Is this an internal query - not from the user. |
80 | bool internal = false; |
81 | }; |
82 | } |
83 | |