Add parser

This commit is contained in:
Guillaume Tassery 2019-12-19 04:46:20 +01:00
parent 630ef97854
commit d5b4b40b4e
4 changed files with 27 additions and 13 deletions

View File

@ -102,7 +102,7 @@ void startStopAction(Context & context, ASTSystemQuery & query, StorageActionBlo
if (!query.target_table.empty()) if (!query.target_table.empty())
{ {
String database = !query.target_database.empty() ? query.target_database : context.getCurrentDatabase(); String database = !query.database.empty() ? query.database : context.getCurrentDatabase();
if (start) if (start)
manager->remove(database, query.target_table, action_type); manager->remove(database, query.target_table, action_type);
@ -137,8 +137,8 @@ BlockIO InterpreterSystemQuery::execute()
system_context.setSetting("profile", context.getSystemProfileName()); system_context.setSetting("profile", context.getSystemProfileName());
/// Make canonical query for simpler processing /// Make canonical query for simpler processing
if (!query.target_table.empty() && query.target_database.empty()) if (!query.target_table.empty() && query.database.empty())
query.target_database = context.getCurrentDatabase(); query.database = context.getCurrentDatabase();
switch (query.type) switch (query.type)
{ {
@ -233,8 +233,8 @@ BlockIO InterpreterSystemQuery::execute()
restartReplicas(system_context); restartReplicas(system_context);
break; break;
case Type::RESTART_REPLICA: case Type::RESTART_REPLICA:
if (!tryRestartReplica(query.target_database, query.target_table, system_context)) if (!tryRestartReplica(query.database, query.target_table, system_context))
throw Exception("There is no " + query.target_database + "." + query.target_table + " replicated table", throw Exception("There is no " + query.database + "." + query.target_table + " replicated table",
ErrorCodes::BAD_ARGUMENTS); ErrorCodes::BAD_ARGUMENTS);
break; break;
case Type::FLUSH_LOGS: case Type::FLUSH_LOGS:
@ -335,7 +335,7 @@ void InterpreterSystemQuery::restartReplicas(Context & system_context)
void InterpreterSystemQuery::syncReplica(ASTSystemQuery & query) void InterpreterSystemQuery::syncReplica(ASTSystemQuery & query)
{ {
String database_name = !query.target_database.empty() ? query.target_database : context.getCurrentDatabase(); String database_name = !query.database.empty() ? query.database : context.getCurrentDatabase();
const String & table_name = query.target_table; const String & table_name = query.target_table;
StoragePtr table = context.getTable(database_name, table_name); StoragePtr table = context.getTable(database_name, table_name);
@ -358,7 +358,7 @@ void InterpreterSystemQuery::syncReplica(ASTSystemQuery & query)
void InterpreterSystemQuery::flushDistributed(ASTSystemQuery & query) void InterpreterSystemQuery::flushDistributed(ASTSystemQuery & query)
{ {
String database_name = !query.target_database.empty() ? query.target_database : context.getCurrentDatabase(); String database_name = !query.database.empty() ? query.database : context.getCurrentDatabase();
String & table_name = query.target_table; String & table_name = query.target_table;
if (auto storage_distributed = dynamic_cast<StorageDistributed *>(context.getTable(database_name, table_name).get())) if (auto storage_distributed = dynamic_cast<StorageDistributed *>(context.getTable(database_name, table_name).get()))

View File

@ -97,9 +97,9 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &,
{ {
settings.ostr << " "; settings.ostr << " ";
if (!target_database.empty()) if (!database.empty())
{ {
settings.ostr << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(target_database) settings.ostr << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(database)
<< (settings.hilite ? hilite_none : "") << "."; << (settings.hilite ? hilite_none : "") << ".";
} }
@ -107,6 +107,9 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &,
<< (settings.hilite ? hilite_none : ""); << (settings.hilite ? hilite_none : "");
}; };
if (!cluster.empty())
{
}
if ( type == Type::STOP_MERGES if ( type == Type::STOP_MERGES
|| type == Type::START_MERGES || type == Type::START_MERGES
|| type == Type::STOP_TTL_MERGES || type == Type::STOP_TTL_MERGES

View File

@ -1,13 +1,14 @@
#pragma once #pragma once
#include "config_core.h" #include "config_core.h"
#include <Parsers/ASTQueryWithOnCluster.h>
#include <Parsers/IAST.h> #include <Parsers/IAST.h>
namespace DB namespace DB
{ {
class ASTSystemQuery : public IAST class ASTSystemQuery : public IAST, public ASTQueryWithOnCluster
{ {
public: public:
@ -55,13 +56,18 @@ public:
Type type = Type::UNKNOWN; Type type = Type::UNKNOWN;
String target_dictionary; String target_dictionary;
String target_database; String database;
String target_table; String target_table;
String getID(char) const override { return "SYSTEM query"; } String getID(char) const override { return "SYSTEM query"; }
ASTPtr clone() const override { return std::make_shared<ASTSystemQuery>(*this); } ASTPtr clone() const override { return std::make_shared<ASTSystemQuery>(*this); }
ASTPtr getRewrittenASTWithoutOnCluster(const std::string & new_database) const override
{
return removeOnCluster<ASTSystemQuery>(clone(), new_database);
}
protected: protected:
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override; void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;

View File

@ -41,6 +41,11 @@ bool ParserSystemQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected &
switch (res->type) switch (res->type)
{ {
case Type::RELOAD_DICTIONARY: case Type::RELOAD_DICTIONARY:
if (ParserKeyword{"ON"}.ignore(pos, expected))
{
if (!ASTQueryWithOnCluster::parse(pos, res->cluster, expected))
return false;
}
if (!parseIdentifierOrStringLiteral(pos, expected, res->target_dictionary)) if (!parseIdentifierOrStringLiteral(pos, expected, res->target_dictionary))
return false; return false;
break; break;
@ -48,7 +53,7 @@ bool ParserSystemQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected &
case Type::RESTART_REPLICA: case Type::RESTART_REPLICA:
case Type::SYNC_REPLICA: case Type::SYNC_REPLICA:
case Type::FLUSH_DISTRIBUTED: case Type::FLUSH_DISTRIBUTED:
if (!parseDatabaseAndTableName(pos, expected, res->target_database, res->target_table)) if (!parseDatabaseAndTableName(pos, expected, res->database, res->target_table))
return false; return false;
break; break;
@ -66,7 +71,7 @@ bool ParserSystemQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected &
case Type::START_REPLICATION_QUEUES: case Type::START_REPLICATION_QUEUES:
case Type::STOP_DISTRIBUTED_SENDS: case Type::STOP_DISTRIBUTED_SENDS:
case Type::START_DISTRIBUTED_SENDS: case Type::START_DISTRIBUTED_SENDS:
parseDatabaseAndTableName(pos, expected, res->target_database, res->target_table); parseDatabaseAndTableName(pos, expected, res->database, res->target_table);
break; break;
default: default: