From 1618f5a8bf057404bd292c5561324ffa00d9499b Mon Sep 17 00:00:00 2001 From: spongedc Date: Sat, 26 Feb 2022 12:13:27 +0800 Subject: [PATCH] support 'EXISTS [MATERIALIZED|LIVE|WINDOW] VIEW' syntax --- src/Interpreters/InterpreterExistsQuery.cpp | 14 ++++++- src/Parsers/ASTQueryWithTableAndOutput.h | 4 ++ src/Parsers/ParserTablePropertiesQuery.cpp | 42 +++++++++++++++++++ src/Parsers/TablePropertiesQueriesASTs.h | 12 +++++- .../0_stateless/01048_exists_query.reference | 6 +++ .../0_stateless/01048_exists_query.sql | 10 +++++ 6 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/Interpreters/InterpreterExistsQuery.cpp b/src/Interpreters/InterpreterExistsQuery.cpp index 758c6d814073..ffcdc9c843d8 100644 --- a/src/Interpreters/InterpreterExistsQuery.cpp +++ b/src/Interpreters/InterpreterExistsQuery.cpp @@ -58,7 +58,19 @@ QueryPipeline InterpreterExistsQuery::executeImpl() String database = getContext()->resolveDatabase(exists_query->getDatabase()); getContext()->checkAccess(AccessType::SHOW_TABLES, database, exists_query->getTable()); auto table = DatabaseCatalog::instance().tryGetTable({database, exists_query->getTable()}, getContext()); - result = table && table->isView(); + if (exists_query->materialized) { + result = table && table->isView() && table->getName() == "MaterializedView"; + } + else if (exists_query->live) { + result = table && table->isView() && table->getName() == "LiveView"; + } + else if (exists_query->window) { + result = table && table->isView() && table->getName() == ""; + } + else + { + result = table && table->isView(); + } } else if ((exists_query = query_ptr->as())) { diff --git a/src/Parsers/ASTQueryWithTableAndOutput.h b/src/Parsers/ASTQueryWithTableAndOutput.h index 233028c50236..da455477ecef 100644 --- a/src/Parsers/ASTQueryWithTableAndOutput.h +++ b/src/Parsers/ASTQueryWithTableAndOutput.h @@ -20,6 +20,10 @@ class ASTQueryWithTableAndOutput : public ASTQueryWithOutput UUID uuid = UUIDHelpers::Nil; bool temporary{false}; + bool materialized; + bool live; + bool window; + String getDatabase() const; String getTable() const; diff --git a/src/Parsers/ParserTablePropertiesQuery.cpp b/src/Parsers/ParserTablePropertiesQuery.cpp index 84f12f97ea1b..dff5bdbcc5c3 100644 --- a/src/Parsers/ParserTablePropertiesQuery.cpp +++ b/src/Parsers/ParserTablePropertiesQuery.cpp @@ -22,6 +22,9 @@ bool ParserTablePropertiesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & ParserKeyword s_table("TABLE"); ParserKeyword s_view("VIEW"); ParserKeyword s_dictionary("DICTIONARY"); + ParserKeyword s_materialized("MATERIALIZED"); + ParserKeyword s_live("LIVE"); + ParserKeyword s_window("WINDOW"); ParserToken s_dot(TokenType::Dot); ParserIdentifier name_p(true); @@ -41,6 +44,45 @@ bool ParserTablePropertiesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & query = std::make_shared(); parse_only_database_name = true; } + else if (s_materialized.ignore(pos, expected)) + { + if (s_view.ignore(pos, expected)) + { + query = std::make_shared(); + query->materialized = true; + exists_view = true; + } + else + { + return false; + } + } + else if (s_live.ignore(pos, expected)) + { + if (s_view.ignore(pos, expected)) + { + query = std::make_shared(); + query->live = true; + exists_view = true; + } + else + { + return false; + } + } + else if (s_window.ignore(pos, expected)) + { + if (s_view.ignore(pos, expected)) + { + query = std::make_shared(); + query->window = true; + exists_view = true; + } + else + { + return false; + } + } else if (s_view.ignore(pos, expected)) { query = std::make_shared(); diff --git a/src/Parsers/TablePropertiesQueriesASTs.h b/src/Parsers/TablePropertiesQueriesASTs.h index 3de6feb24091..c4c64a5d7aa3 100644 --- a/src/Parsers/TablePropertiesQueriesASTs.h +++ b/src/Parsers/TablePropertiesQueriesASTs.h @@ -77,12 +77,22 @@ struct ASTDescribeQueryExistsQueryIDAndQueryNames }; using ASTExistsTableQuery = ASTQueryWithTableAndOutputImpl; -using ASTExistsViewQuery = ASTQueryWithTableAndOutputImpl; using ASTExistsDictionaryQuery = ASTQueryWithTableAndOutputImpl; using ASTShowCreateTableQuery = ASTQueryWithTableAndOutputImpl; using ASTShowCreateViewQuery = ASTQueryWithTableAndOutputImpl; using ASTShowCreateDictionaryQuery = ASTQueryWithTableAndOutputImpl; +class ASTExistsViewQuery : public ASTQueryWithTableAndOutputImpl +{ +protected: + void formatQueryImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << "EXISTS" << " " + << (materialized ? "MATERIALIZED" : (live ? "LIVE" : (window ? "WINDOW" : ""))) + << " VIEW " << (settings.hilite ? hilite_none : "") << backQuoteIfNeed(getTable()); + } +}; + class ASTExistsDatabaseQuery : public ASTQueryWithTableAndOutputImpl { protected: diff --git a/tests/queries/0_stateless/01048_exists_query.reference b/tests/queries/0_stateless/01048_exists_query.reference index ede3b4cdea79..072b9ceb0268 100644 --- a/tests/queries/0_stateless/01048_exists_query.reference +++ b/tests/queries/0_stateless/01048_exists_query.reference @@ -28,6 +28,12 @@ 0 0 0 +1 +1 +0 +0 +0 +0 0 0 0 diff --git a/tests/queries/0_stateless/01048_exists_query.sql b/tests/queries/0_stateless/01048_exists_query.sql index 07d3a026c68a..900dd4b931fd 100644 --- a/tests/queries/0_stateless/01048_exists_query.sql +++ b/tests/queries/0_stateless/01048_exists_query.sql @@ -55,6 +55,16 @@ EXISTS VIEW db_01048.v_not_exist; EXISTS VIEW db_not_exists.v_not_exist; DROP TABLE db_01048.t_01048_2; +CREATE TABLE db_01048.t_01048_3 (x UInt8) ENGINE = Memory; +CREATE MATERIALIZED VIEW db_01048.v_01048 ENGINE = Memory AS SELECT * FROM db_01048.t_01048_3; +EXISTS VIEW db_01048.v_01048; +EXISTS MATERIALIZED VIEW db_01048.v_01048; +EXISTS LIVE VIEW db_01048.v_01048; +DROP VIEW db_01048.v_01048; +EXISTS VIEW db_01048.v_01048; +EXISTS MATERIALIZED VIEW db_01048.v_01048; +EXISTS LIVE VIEW db_01048.v_01048; +DROP TABLE db_01048.t_01048_3; DROP DATABASE db_01048; EXISTS db_01048.t_01048;