From 25ab402d21267800f87b2a97374073ed917b323b Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 24 Mar 2019 01:45:28 +0300 Subject: [PATCH] ParserCreateQuery: moved code to cpp --- dbms/src/Parsers/ASTCreateQuery.cpp | 235 ++++++++++++++++ dbms/src/Parsers/ASTCreateQuery.h | 254 ++---------------- dbms/src/Parsers/ParserCreateQuery.cpp | 2 + dbms/src/Storages/Kafka/KafkaSettings.cpp | 2 + .../Storages/MergeTree/MergeTreeSettings.cpp | 2 + dbms/src/Storages/StorageJoin.cpp | 1 + dbms/src/Storages/StorageView.cpp | 1 + 7 files changed, 270 insertions(+), 227 deletions(-) create mode 100644 dbms/src/Parsers/ASTCreateQuery.cpp diff --git a/dbms/src/Parsers/ASTCreateQuery.cpp b/dbms/src/Parsers/ASTCreateQuery.cpp new file mode 100644 index 00000000000..71c2676e9c4 --- /dev/null +++ b/dbms/src/Parsers/ASTCreateQuery.cpp @@ -0,0 +1,235 @@ +#include +#include +#include +#include +#include + + +namespace DB +{ + +ASTPtr ASTStorage::clone() const +{ + auto res = std::make_shared(*this); + res->children.clear(); + + if (engine) + res->set(res->engine, engine->clone()); + if (partition_by) + res->set(res->partition_by, partition_by->clone()); + if (primary_key) + res->set(res->primary_key, primary_key->clone()); + if (order_by) + res->set(res->order_by, order_by->clone()); + if (sample_by) + res->set(res->sample_by, sample_by->clone()); + + if (settings) + res->set(res->settings, settings->clone()); + + return res; +} + +void ASTStorage::formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const +{ + if (engine) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "ENGINE" << (s.hilite ? hilite_none : "") << " = "; + engine->formatImpl(s, state, frame); + } + if (partition_by) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "PARTITION BY " << (s.hilite ? hilite_none : ""); + partition_by->formatImpl(s, state, frame); + } + if (primary_key) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "PRIMARY KEY " << (s.hilite ? hilite_none : ""); + primary_key->formatImpl(s, state, frame); + } + if (order_by) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "ORDER BY " << (s.hilite ? hilite_none : ""); + order_by->formatImpl(s, state, frame); + } + if (sample_by) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "SAMPLE BY " << (s.hilite ? hilite_none : ""); + sample_by->formatImpl(s, state, frame); + } + if (settings) + { + s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "SETTINGS " << (s.hilite ? hilite_none : ""); + settings->formatImpl(s, state, frame); + } + +} + + +ASTPtr ASTColumnsElement::clone() const +{ + auto res = std::make_shared(); + res->prefix = prefix; + if (elem) + res->set(res->elem, elem->clone()); + return res; +} + +void ASTColumnsElement::formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const +{ + if (!elem) + return; + + if (prefix.empty()) + { + elem->formatImpl(s, state, frame); + return; + } + + frame.need_parens = false; + std::string indent_str = s.one_line ? "" : std::string(4 * frame.indent, ' '); + + s.ostr << s.nl_or_ws << indent_str; + s.ostr << (s.hilite ? hilite_keyword : "") << prefix << (s.hilite ? hilite_none : ""); + + FormatSettings nested_settings = s; + nested_settings.one_line = true; + nested_settings.nl_or_ws = ' '; + + elem->formatImpl(nested_settings, state, frame); +} + + +ASTPtr ASTColumns::clone() const +{ + auto res = std::make_shared(); + + if (columns) + res->set(res->columns, columns->clone()); + if (indices) + res->set(res->indices, indices->clone()); + + return res; +} + +void ASTColumns::formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const +{ + ASTExpressionList list; + + if (columns) + for (const auto & column : columns->children) + { + auto elem = std::make_shared(); + elem->prefix = ""; + elem->set(elem->elem, column->clone()); + list.children.push_back(elem); + } + if (indices) + for (const auto & index : indices->children) + { + auto elem = std::make_shared(); + elem->prefix = "INDEX"; + elem->set(elem->elem, index->clone()); + list.children.push_back(elem); + } + + if (!list.children.empty()) + list.formatImpl(s, state, frame); +} + + +ASTPtr ASTCreateQuery::clone() const +{ + auto res = std::make_shared(*this); + res->children.clear(); + + if (columns_list) + res->set(res->columns_list, columns_list->clone()); + if (storage) + res->set(res->storage, storage->clone()); + if (select) + res->set(res->select, select->clone()); + + cloneOutputOptions(*res); + + return res; +} + +void ASTCreateQuery::formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const +{ + frame.need_parens = false; + + if (!database.empty() && table.empty()) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") + << (attach ? "ATTACH DATABASE " : "CREATE DATABASE ") + << (if_not_exists ? "IF NOT EXISTS " : "") + << (settings.hilite ? hilite_none : "") + << backQuoteIfNeed(database); + formatOnCluster(settings); + + if (storage) + storage->formatImpl(settings, state, frame); + + return; + } + + { + std::string what = "TABLE"; + if (is_view) + what = "VIEW"; + if (is_materialized_view) + what = "MATERIALIZED VIEW"; + + settings.ostr + << (settings.hilite ? hilite_keyword : "") + << (attach ? "ATTACH " : "CREATE ") + << (temporary ? "TEMPORARY " : "") + << (replace_view ? "OR REPLACE " : "") + << what << " " + << (if_not_exists ? "IF NOT EXISTS " : "") + << (settings.hilite ? hilite_none : "") + << (!database.empty() ? backQuoteIfNeed(database) + "." : "") << backQuoteIfNeed(table); + formatOnCluster(settings); + } + + if (!to_table.empty()) + { + settings.ostr + << (settings.hilite ? hilite_keyword : "") << " TO " << (settings.hilite ? hilite_none : "") + << (!to_database.empty() ? backQuoteIfNeed(to_database) + "." : "") << backQuoteIfNeed(to_table); + } + + if (!as_table.empty()) + { + settings.ostr + << (settings.hilite ? hilite_keyword : "") << " AS " << (settings.hilite ? hilite_none : "") + << (!as_database.empty() ? backQuoteIfNeed(as_database) + "." : "") << backQuoteIfNeed(as_table); + } + + if (columns_list) + { + settings.ostr << (settings.one_line ? " (" : "\n("); + FormatStateStacked frame_nested = frame; + ++frame_nested.indent; + columns_list->formatImpl(settings, state, frame_nested); + settings.ostr << (settings.one_line ? ")" : "\n)"); + } + + if (storage) + storage->formatImpl(settings, state, frame); + + if (is_populate) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << " POPULATE" << (settings.hilite ? hilite_none : ""); + } + + if (select) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << " AS" << settings.nl_or_ws << (settings.hilite ? hilite_none : ""); + select->formatImpl(settings, state, frame); + } +} + +} + diff --git a/dbms/src/Parsers/ASTCreateQuery.h b/dbms/src/Parsers/ASTCreateQuery.h index 5b6d7398452..27dc2465dce 100644 --- a/dbms/src/Parsers/ASTCreateQuery.h +++ b/dbms/src/Parsers/ASTCreateQuery.h @@ -1,9 +1,5 @@ #pragma once -#include -#include -#include -#include #include #include @@ -11,6 +7,9 @@ namespace DB { +class ASTFunction; +class ASTSetQuery; + class ASTStorage : public IAST { public: @@ -23,154 +22,44 @@ public: String getID(char) const override { return "Storage definition"; } - ASTPtr clone() const override - { - auto res = std::make_shared(*this); - res->children.clear(); + ASTPtr clone() const override; - if (engine) - res->set(res->engine, engine->clone()); - if (partition_by) - res->set(res->partition_by, partition_by->clone()); - if (primary_key) - res->set(res->primary_key, primary_key->clone()); - if (order_by) - res->set(res->order_by, order_by->clone()); - if (sample_by) - res->set(res->sample_by, sample_by->clone()); - - if (settings) - res->set(res->settings, settings->clone()); - - return res; - } - - void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override - { - if (engine) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "ENGINE" << (s.hilite ? hilite_none : "") << " = "; - engine->formatImpl(s, state, frame); - } - if (partition_by) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "PARTITION BY " << (s.hilite ? hilite_none : ""); - partition_by->formatImpl(s, state, frame); - } - if (primary_key) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "PRIMARY KEY " << (s.hilite ? hilite_none : ""); - primary_key->formatImpl(s, state, frame); - } - if (order_by) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "ORDER BY " << (s.hilite ? hilite_none : ""); - order_by->formatImpl(s, state, frame); - } - if (sample_by) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "SAMPLE BY " << (s.hilite ? hilite_none : ""); - sample_by->formatImpl(s, state, frame); - } - if (settings) - { - s.ostr << (s.hilite ? hilite_keyword : "") << s.nl_or_ws << "SETTINGS " << (s.hilite ? hilite_none : ""); - settings->formatImpl(s, state, frame); - } - - } + void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override; }; +class ASTColumnsElement : public IAST +{ +public: + String prefix; + IAST * elem; + + String getID(char c) const override { return "ASTColumnsElement for " + elem->getID(c); } + + ASTPtr clone() const override; + + void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override; +}; + + +class ASTExpressionList; + class ASTColumns : public IAST { -private: - class ASTColumnsElement : public IAST - { - public: - String prefix; - IAST * elem; - - String getID(char c) const override { return "ASTColumnsElement for " + elem->getID(c); } - - ASTPtr clone() const override - { - auto res = std::make_shared(); - res->prefix = prefix; - if (elem) - res->set(res->elem, elem->clone()); - return res; - } - - void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override - { - if (!elem) - return; - - if (prefix.empty()) - { - elem->formatImpl(s, state, frame); - return; - } - - frame.need_parens = false; - std::string indent_str = s.one_line ? "" : std::string(4 * frame.indent, ' '); - - s.ostr << s.nl_or_ws << indent_str; - s.ostr << (s.hilite ? hilite_keyword : "") << prefix << (s.hilite ? hilite_none : ""); - - FormatSettings nested_settings = s; - nested_settings.one_line = true; - nested_settings.nl_or_ws = ' '; - - elem->formatImpl(nested_settings, state, frame); - } - }; public: ASTExpressionList * columns = nullptr; ASTExpressionList * indices = nullptr; String getID(char) const override { return "Columns definition"; } - ASTPtr clone() const override - { - auto res = std::make_shared(); + ASTPtr clone() const override; - if (columns) - res->set(res->columns, columns->clone()); - if (indices) - res->set(res->indices, indices->clone()); - - return res; - } - - void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override - { - ASTExpressionList list; - - if (columns) - for (const auto & column : columns->children) - { - auto elem = std::make_shared(); - elem->prefix = ""; - elem->set(elem->elem, column->clone()); - list.children.push_back(elem); - } - if (indices) - for (const auto & index : indices->children) - { - auto elem = std::make_shared(); - elem->prefix = "INDEX"; - elem->set(elem->elem, index->clone()); - list.children.push_back(elem); - } - - if (!list.children.empty()) - list.formatImpl(s, state, frame); - } + void formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const override; }; +class ASTSelectWithUnionQuery; + /// CREATE TABLE or ATTACH TABLE query class ASTCreateQuery : public ASTQueryWithTableAndOutput, public ASTQueryWithOnCluster { @@ -192,22 +81,7 @@ public: /** Get the text that identifies this element. */ String getID(char delim) const override { return (attach ? "AttachQuery" : "CreateQuery") + (delim + database) + delim + table; } - ASTPtr clone() const override - { - auto res = std::make_shared(*this); - res->children.clear(); - - if (columns_list) - res->set(res->columns_list, columns_list->clone()); - if (storage) - res->set(res->storage, storage->clone()); - if (select) - res->set(res->select, select->clone()); - - cloneOutputOptions(*res); - - return res; - } + ASTPtr clone() const override; ASTPtr getRewrittenASTWithoutOnCluster(const std::string & new_database) const override { @@ -215,81 +89,7 @@ public: } protected: - void formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override - { - frame.need_parens = false; - - if (!database.empty() && table.empty()) - { - settings.ostr << (settings.hilite ? hilite_keyword : "") - << (attach ? "ATTACH DATABASE " : "CREATE DATABASE ") - << (if_not_exists ? "IF NOT EXISTS " : "") - << (settings.hilite ? hilite_none : "") - << backQuoteIfNeed(database); - formatOnCluster(settings); - - if (storage) - storage->formatImpl(settings, state, frame); - - return; - } - - { - std::string what = "TABLE"; - if (is_view) - what = "VIEW"; - if (is_materialized_view) - what = "MATERIALIZED VIEW"; - - settings.ostr - << (settings.hilite ? hilite_keyword : "") - << (attach ? "ATTACH " : "CREATE ") - << (temporary ? "TEMPORARY " : "") - << (replace_view ? "OR REPLACE " : "") - << what << " " - << (if_not_exists ? "IF NOT EXISTS " : "") - << (settings.hilite ? hilite_none : "") - << (!database.empty() ? backQuoteIfNeed(database) + "." : "") << backQuoteIfNeed(table); - formatOnCluster(settings); - } - - if (!to_table.empty()) - { - settings.ostr - << (settings.hilite ? hilite_keyword : "") << " TO " << (settings.hilite ? hilite_none : "") - << (!to_database.empty() ? backQuoteIfNeed(to_database) + "." : "") << backQuoteIfNeed(to_table); - } - - if (!as_table.empty()) - { - settings.ostr - << (settings.hilite ? hilite_keyword : "") << " AS " << (settings.hilite ? hilite_none : "") - << (!as_database.empty() ? backQuoteIfNeed(as_database) + "." : "") << backQuoteIfNeed(as_table); - } - - if (columns_list) - { - settings.ostr << (settings.one_line ? " (" : "\n("); - FormatStateStacked frame_nested = frame; - ++frame_nested.indent; - columns_list->formatImpl(settings, state, frame_nested); - settings.ostr << (settings.one_line ? ")" : "\n)"); - } - - if (storage) - storage->formatImpl(settings, state, frame); - - if (is_populate) - { - settings.ostr << (settings.hilite ? hilite_keyword : "") << " POPULATE" << (settings.hilite ? hilite_none : ""); - } - - if (select) - { - settings.ostr << (settings.hilite ? hilite_keyword : "") << " AS" << settings.nl_or_ws << (settings.hilite ? hilite_none : ""); - select->formatImpl(settings, state, frame); - } - } + void formatQueryImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override; }; } diff --git a/dbms/src/Parsers/ParserCreateQuery.cpp b/dbms/src/Parsers/ParserCreateQuery.cpp index 72610951868..1b976efa668 100644 --- a/dbms/src/Parsers/ParserCreateQuery.cpp +++ b/dbms/src/Parsers/ParserCreateQuery.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/dbms/src/Storages/Kafka/KafkaSettings.cpp b/dbms/src/Storages/Kafka/KafkaSettings.cpp index 814e1542444..1d77bdc39af 100644 --- a/dbms/src/Storages/Kafka/KafkaSettings.cpp +++ b/dbms/src/Storages/Kafka/KafkaSettings.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include diff --git a/dbms/src/Storages/MergeTree/MergeTreeSettings.cpp b/dbms/src/Storages/MergeTree/MergeTreeSettings.cpp index 65b800460ed..3ba11ba6c3f 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeSettings.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeSettings.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include diff --git a/dbms/src/Storages/StorageJoin.cpp b/dbms/src/Storages/StorageJoin.cpp index 3a734fdb9b1..cfa2a9a2933 100644 --- a/dbms/src/Storages/StorageJoin.cpp +++ b/dbms/src/Storages/StorageJoin.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/dbms/src/Storages/StorageView.cpp b/dbms/src/Storages/StorageView.cpp index dec57408746..21476febbd2 100644 --- a/dbms/src/Storages/StorageView.cpp +++ b/dbms/src/Storages/StorageView.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include