mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-21 09:10:48 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
e727d7cf90
commit
2aa2af9950
@ -60,6 +60,7 @@ namespace ErrorCodes
|
||||
COLUMN_QUERIED_MORE_THAN_ONCE,
|
||||
TYPE_MISMATCH,
|
||||
STORAGE_DOESNT_ALLOW_PARAMETERS,
|
||||
STORAGE_REQUIRES_PARAMETER,
|
||||
UNKNOWN_STORAGE,
|
||||
TABLE_ALREADY_EXISTS,
|
||||
TABLE_METADATA_ALREADY_EXISTS,
|
||||
|
@ -22,7 +22,7 @@ using Poco::SharedPtr;
|
||||
class IAST
|
||||
{
|
||||
public:
|
||||
typedef std::list<SharedPtr<IAST> > ASTs;
|
||||
typedef std::vector<SharedPtr<IAST> > ASTs;
|
||||
ASTs children;
|
||||
StringRange range;
|
||||
|
||||
@ -82,6 +82,6 @@ public:
|
||||
|
||||
|
||||
typedef SharedPtr<IAST> ASTPtr;
|
||||
typedef std::list<ASTPtr> ASTs;
|
||||
typedef std::vector<ASTPtr> ASTs;
|
||||
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ namespace DB
|
||||
{
|
||||
|
||||
using Poco::SharedPtr;
|
||||
class Context;
|
||||
|
||||
|
||||
/** Позволяет создать таблицу по имени движка.
|
||||
@ -18,6 +19,8 @@ public:
|
||||
const String & name,
|
||||
const String & data_path,
|
||||
const String & table_name,
|
||||
Context & context,
|
||||
ASTPtr & query,
|
||||
NamesAndTypesListPtr columns) const;
|
||||
};
|
||||
|
||||
|
@ -131,7 +131,7 @@ StoragePtr InterpreterCreateQuery::execute()
|
||||
else
|
||||
throw Exception("Incorrect CREATE query: required ENGINE.", ErrorCodes::INCORRECT_QUERY);
|
||||
|
||||
StoragePtr res = context.storage_factory->get(storage_name, data_path, table_name, columns);
|
||||
StoragePtr res = context.storage_factory->get(storage_name, data_path, table_name, context, query_ptr, columns);
|
||||
|
||||
/// Проверка наличия метаданных таблицы на диске и создание метаданных
|
||||
|
||||
|
@ -1,5 +1,11 @@
|
||||
#include <DB/Parsers/ASTCreateQuery.h>
|
||||
#include <DB/Parsers/ASTIdentifier.h>
|
||||
|
||||
#include <DB/Interpreters/Context.h>
|
||||
|
||||
#include <DB/Storages/StorageLog.h>
|
||||
#include <DB/Storages/StorageMemory.h>
|
||||
#include <DB/Storages/StorageDistributed.h>
|
||||
#include <DB/Storages/StorageSystemNumbers.h>
|
||||
#include <DB/Storages/StorageSystemOne.h>
|
||||
#include <DB/Storages/StorageFactory.h>
|
||||
@ -13,12 +19,44 @@ StoragePtr StorageFactory::get(
|
||||
const String & name,
|
||||
const String & data_path,
|
||||
const String & table_name,
|
||||
Context & context,
|
||||
ASTPtr & query,
|
||||
NamesAndTypesListPtr columns) const
|
||||
{
|
||||
if (name == "Log")
|
||||
{
|
||||
return new StorageLog(data_path, table_name, columns);
|
||||
}
|
||||
else if (name == "Memory")
|
||||
{
|
||||
return new StorageMemory(table_name, columns);
|
||||
}
|
||||
else if (name == "Distributed")
|
||||
{
|
||||
/** В запросе в качестве аргумента для движка указано имя конфигурационной секции,
|
||||
* в которой задан список удалённых серверов.
|
||||
*/
|
||||
ASTs & args = dynamic_cast<ASTFunction &>(*dynamic_cast<ASTCreateQuery &>(*query).storage).children;
|
||||
if (args.size() != 3)
|
||||
throw Exception("Storage Distributed requires exactly 3 parameters"
|
||||
" - name of configuration section with list of remote servers, name of remote database and name of remote table.",
|
||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||
|
||||
String config_name = dynamic_cast<ASTIdentifier &>(*args[0]).name;
|
||||
String remote_database = dynamic_cast<ASTIdentifier &>(*args[1]).name;
|
||||
String remote_table = dynamic_cast<ASTIdentifier &>(*args[2]).name;
|
||||
|
||||
StorageDistributed::Addresses addresses;
|
||||
|
||||
Poco::Util::AbstractConfiguration & config = Poco::Util::Application::instance().config();
|
||||
Poco::Util::AbstractConfiguration::Keys config_keys;
|
||||
config.keys("remote_servers." + config_name, config_keys);
|
||||
|
||||
for (Poco::Util::AbstractConfiguration::Keys::const_iterator it = config_keys.begin(); it != config_keys.end(); ++it)
|
||||
addresses.push_back(Poco::Net::SocketAddress(config.getString(*it + ".host"), config.getInt(*it + ".port")));
|
||||
|
||||
return new StorageDistributed(table_name, columns, addresses, remote_database, remote_table, *context.data_type_factory);
|
||||
}
|
||||
else if (name == "SystemNumbers")
|
||||
{
|
||||
if (columns->size() != 1 || columns->begin()->first != "number" || columns->begin()->second->getName() != "UInt64")
|
||||
|
Loading…
Reference in New Issue
Block a user