mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
remove Context from some IDatabase methods
This commit is contained in:
parent
04d6b59ac0
commit
f413061e0d
@ -118,7 +118,7 @@ void ClusterCopierApp::mainImpl()
|
|||||||
registerDisks();
|
registerDisks();
|
||||||
|
|
||||||
static const std::string default_database = "_local";
|
static const std::string default_database = "_local";
|
||||||
DatabaseCatalog::instance().attachDatabase(default_database, std::make_shared<DatabaseMemory>(default_database, *context));
|
DatabaseCatalog::instance().attachDatabase(default_database, std::make_shared<DatabaseMemory>(default_database));
|
||||||
context->setCurrentDatabase(default_database);
|
context->setCurrentDatabase(default_database);
|
||||||
|
|
||||||
/// Initialize query scope just in case.
|
/// Initialize query scope just in case.
|
||||||
|
@ -119,13 +119,13 @@ void LocalServer::tryInitPath()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void attachSystemTables(const Context & context)
|
static void attachSystemTables()
|
||||||
{
|
{
|
||||||
DatabasePtr system_database = DatabaseCatalog::instance().tryGetDatabase(DatabaseCatalog::SYSTEM_DATABASE);
|
DatabasePtr system_database = DatabaseCatalog::instance().tryGetDatabase(DatabaseCatalog::SYSTEM_DATABASE);
|
||||||
if (!system_database)
|
if (!system_database)
|
||||||
{
|
{
|
||||||
/// TODO: add attachTableDelayed into DatabaseMemory to speedup loading
|
/// TODO: add attachTableDelayed into DatabaseMemory to speedup loading
|
||||||
system_database = std::make_shared<DatabaseMemory>(DatabaseCatalog::SYSTEM_DATABASE, context);
|
system_database = std::make_shared<DatabaseMemory>(DatabaseCatalog::SYSTEM_DATABASE);
|
||||||
DatabaseCatalog::instance().attachDatabase(DatabaseCatalog::SYSTEM_DATABASE, system_database);
|
DatabaseCatalog::instance().attachDatabase(DatabaseCatalog::SYSTEM_DATABASE, system_database);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,7 +203,7 @@ try
|
|||||||
* if such tables will not be dropped, clickhouse-server will not be able to load them due to security reasons.
|
* if such tables will not be dropped, clickhouse-server will not be able to load them due to security reasons.
|
||||||
*/
|
*/
|
||||||
std::string default_database = config().getString("default_database", "_local");
|
std::string default_database = config().getString("default_database", "_local");
|
||||||
DatabaseCatalog::instance().attachDatabase(default_database, std::make_shared<DatabaseMemory>(default_database, *context));
|
DatabaseCatalog::instance().attachDatabase(default_database, std::make_shared<DatabaseMemory>(default_database));
|
||||||
context->setCurrentDatabase(default_database);
|
context->setCurrentDatabase(default_database);
|
||||||
applyCmdOptions();
|
applyCmdOptions();
|
||||||
|
|
||||||
@ -214,14 +214,14 @@ try
|
|||||||
|
|
||||||
LOG_DEBUG(log, "Loading metadata from " << context->getPath());
|
LOG_DEBUG(log, "Loading metadata from " << context->getPath());
|
||||||
loadMetadataSystem(*context);
|
loadMetadataSystem(*context);
|
||||||
attachSystemTables(*context);
|
attachSystemTables();
|
||||||
loadMetadata(*context);
|
loadMetadata(*context);
|
||||||
DatabaseCatalog::instance().loadDatabases();
|
DatabaseCatalog::instance().loadDatabases();
|
||||||
LOG_DEBUG(log, "Loaded metadata.");
|
LOG_DEBUG(log, "Loaded metadata.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
attachSystemTables(*context);
|
attachSystemTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
processQueries();
|
processQueries();
|
||||||
|
@ -293,7 +293,7 @@ DatabaseTablesIteratorPtr DatabaseAtomic::getTablesIterator(const IDatabase::Fil
|
|||||||
|
|
||||||
UUID DatabaseAtomic::tryGetTableUUID(const String & table_name) const
|
UUID DatabaseAtomic::tryGetTableUUID(const String & table_name) const
|
||||||
{
|
{
|
||||||
if (auto table = tryGetTable(global_context, table_name))
|
if (auto table = tryGetTable(table_name))
|
||||||
return table->getStorageID().uuid;
|
return table->getStorageID().uuid;
|
||||||
return UUIDHelpers::Nil;
|
return UUIDHelpers::Nil;
|
||||||
}
|
}
|
||||||
|
@ -50,16 +50,12 @@ Tables DatabaseDictionary::listTables(const FilterByNameFunction & filter_by_nam
|
|||||||
return tables;
|
return tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseDictionary::isTableExist(
|
bool DatabaseDictionary::isTableExist(const String & table_name) const
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
return context.getExternalDictionariesLoader().getCurrentStatus(table_name) != ExternalLoader::Status::NOT_EXIST;
|
return global_context.getExternalDictionariesLoader().getCurrentStatus(table_name) != ExternalLoader::Status::NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseDictionary::tryGetTable(
|
StoragePtr DatabaseDictionary::tryGetTable(const String & table_name) const
|
||||||
const Context & /*context*/,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
auto load_result = global_context.getExternalDictionariesLoader().getLoadResult(table_name);
|
auto load_result = global_context.getExternalDictionariesLoader().getLoadResult(table_name);
|
||||||
return createStorageDictionary(getDatabaseName(), load_result);
|
return createStorageDictionary(getDatabaseName(), load_result);
|
||||||
@ -70,13 +66,12 @@ DatabaseTablesIteratorPtr DatabaseDictionary::getTablesIterator(const FilterByNa
|
|||||||
return std::make_unique<DatabaseTablesSnapshotIterator>(listTables(filter_by_table_name));
|
return std::make_unique<DatabaseTablesSnapshotIterator>(listTables(filter_by_table_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseDictionary::empty(const Context & /*context*/) const
|
bool DatabaseDictionary::empty() const
|
||||||
{
|
{
|
||||||
return !global_context.getExternalDictionariesLoader().hasObjects();
|
return !global_context.getExternalDictionariesLoader().hasObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const String & table_name, bool throw_on_error) const
|
||||||
const String & table_name, bool throw_on_error) const
|
|
||||||
{
|
{
|
||||||
String query;
|
String query;
|
||||||
{
|
{
|
||||||
@ -96,7 +91,7 @@ ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
|||||||
buffer << ") Engine = Dictionary(" << backQuoteIfNeed(table_name) << ")";
|
buffer << ") Engine = Dictionary(" << backQuoteIfNeed(table_name) << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto settings = context.getSettingsRef();
|
auto settings = global_context.getSettingsRef();
|
||||||
ParserCreateQuery parser;
|
ParserCreateQuery parser;
|
||||||
const char * pos = query.data();
|
const char * pos = query.data();
|
||||||
std::string error_message;
|
std::string error_message;
|
||||||
@ -109,14 +104,14 @@ ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
|||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateDatabaseQuery(const Context & context) const
|
ASTPtr DatabaseDictionary::getCreateDatabaseQuery() const
|
||||||
{
|
{
|
||||||
String query;
|
String query;
|
||||||
{
|
{
|
||||||
WriteBufferFromString buffer(query);
|
WriteBufferFromString buffer(query);
|
||||||
buffer << "CREATE DATABASE " << backQuoteIfNeed(database_name) << " ENGINE = Dictionary";
|
buffer << "CREATE DATABASE " << backQuoteIfNeed(database_name) << " ENGINE = Dictionary";
|
||||||
}
|
}
|
||||||
auto settings = context.getSettingsRef();
|
auto settings = global_context.getSettingsRef();
|
||||||
ParserCreateQuery parser;
|
ParserCreateQuery parser;
|
||||||
return parseQuery(parser, query.data(), query.data() + query.size(), "", 0, settings.max_parser_depth);
|
return parseQuery(parser, query.data(), query.data() + query.size(), "", 0, settings.max_parser_depth);
|
||||||
}
|
}
|
||||||
|
@ -29,26 +29,22 @@ public:
|
|||||||
return "Dictionary";
|
return "Dictionary";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isTableExist(
|
bool isTableExist(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(
|
StoragePtr tryGetTable(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty() const override;
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery() const override;
|
||||||
|
|
||||||
bool shouldBeEmptyOnDetach() const override { return false; }
|
bool shouldBeEmptyOnDetach() const override { return false; }
|
||||||
|
|
||||||
void shutdown() override;
|
void shutdown() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ASTPtr getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const override;
|
ASTPtr getCreateTableQueryImpl(const String & table_name, bool throw_on_error) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
|
@ -82,7 +82,7 @@ DatabasePtr DatabaseFactory::getImpl(
|
|||||||
else if (engine_name == "Atomic")
|
else if (engine_name == "Atomic")
|
||||||
return std::make_shared<DatabaseAtomic>(database_name, metadata_path, context);
|
return std::make_shared<DatabaseAtomic>(database_name, metadata_path, context);
|
||||||
else if (engine_name == "Memory")
|
else if (engine_name == "Memory")
|
||||||
return std::make_shared<DatabaseMemory>(database_name, context);
|
return std::make_shared<DatabaseMemory>(database_name);
|
||||||
else if (engine_name == "Dictionary")
|
else if (engine_name == "Dictionary")
|
||||||
return std::make_shared<DatabaseDictionary>(database_name, context);
|
return std::make_shared<DatabaseDictionary>(database_name, context);
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ DatabasePtr DatabaseFactory::getImpl(
|
|||||||
auto mysql_database = std::make_shared<DatabaseMySQL>(
|
auto mysql_database = std::make_shared<DatabaseMySQL>(
|
||||||
context, database_name, metadata_path, engine_define, database_name_in_mysql, std::move(mysql_pool));
|
context, database_name, metadata_path, engine_define, database_name_in_mysql, std::move(mysql_pool));
|
||||||
|
|
||||||
mysql_database->empty(context); /// test database is works fine.
|
mysql_database->empty(); /// test database is works fine.
|
||||||
return mysql_database;
|
return mysql_database;
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
|
@ -103,18 +103,14 @@ void DatabaseLazy::alterTable(
|
|||||||
throw Exception("ALTER query is not supported for Lazy database.", ErrorCodes::UNSUPPORTED_METHOD);
|
throw Exception("ALTER query is not supported for Lazy database.", ErrorCodes::UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseLazy::isTableExist(
|
bool DatabaseLazy::isTableExist(const String & table_name) const
|
||||||
const Context & /* context */,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
SCOPE_EXIT({ clearExpiredTables(); });
|
SCOPE_EXIT({ clearExpiredTables(); });
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
return tables_cache.find(table_name) != tables_cache.end();
|
return tables_cache.find(table_name) != tables_cache.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseLazy::tryGetTable(
|
StoragePtr DatabaseLazy::tryGetTable(const String & table_name) const
|
||||||
const Context & /*context*/,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
SCOPE_EXIT({ clearExpiredTables(); });
|
SCOPE_EXIT({ clearExpiredTables(); });
|
||||||
{
|
{
|
||||||
@ -149,7 +145,7 @@ DatabaseTablesIteratorPtr DatabaseLazy::getTablesIterator(const FilterByNameFunc
|
|||||||
return std::make_unique<DatabaseLazyIterator>(*this, std::move(filtered_tables));
|
return std::make_unique<DatabaseLazyIterator>(*this, std::move(filtered_tables));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseLazy::empty(const Context & /* context */) const
|
bool DatabaseLazy::empty() const
|
||||||
{
|
{
|
||||||
return tables_cache.empty();
|
return tables_cache.empty();
|
||||||
}
|
}
|
||||||
@ -309,7 +305,7 @@ void DatabaseLazyIterator::next()
|
|||||||
{
|
{
|
||||||
current_storage.reset();
|
current_storage.reset();
|
||||||
++iterator;
|
++iterator;
|
||||||
while (isValid() && !database.isTableExist(database.global_context, *iterator))
|
while (isValid() && !database.isTableExist(*iterator))
|
||||||
++iterator;
|
++iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,7 +322,7 @@ const String & DatabaseLazyIterator::name() const
|
|||||||
const StoragePtr & DatabaseLazyIterator::table() const
|
const StoragePtr & DatabaseLazyIterator::table() const
|
||||||
{
|
{
|
||||||
if (!current_storage)
|
if (!current_storage)
|
||||||
current_storage = database.tryGetTable(database.global_context, *iterator);
|
current_storage = database.tryGetTable(*iterator);
|
||||||
return current_storage;
|
return current_storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,15 +51,11 @@ public:
|
|||||||
|
|
||||||
time_t getObjectMetadataModificationTime(const String & table_name) const override;
|
time_t getObjectMetadataModificationTime(const String & table_name) const override;
|
||||||
|
|
||||||
bool isTableExist(
|
bool isTableExist(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(
|
StoragePtr tryGetTable(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty() const override;
|
||||||
|
|
||||||
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
||||||
|
|
||||||
|
@ -15,9 +15,8 @@ namespace ErrorCodes
|
|||||||
extern const int UNKNOWN_TABLE;
|
extern const int UNKNOWN_TABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseMemory::DatabaseMemory(const String & name_, const Context & global_context_)
|
DatabaseMemory::DatabaseMemory(const String & name_)
|
||||||
: DatabaseWithOwnTablesBase(name_, "DatabaseMemory(" + name_ + ")")
|
: DatabaseWithOwnTablesBase(name_, "DatabaseMemory(" + name_ + ")")
|
||||||
, global_context(global_context_.getGlobalContext())
|
|
||||||
, data_path("data/" + escapeForFileName(database_name) + "/")
|
, data_path("data/" + escapeForFileName(database_name) + "/")
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -55,7 +54,7 @@ void DatabaseMemory::dropTable(
|
|||||||
create_queries.erase(table_name);
|
create_queries.erase(table_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseMemory::getCreateDatabaseQuery(const Context & /*context*/) const
|
ASTPtr DatabaseMemory::getCreateDatabaseQuery() const
|
||||||
{
|
{
|
||||||
auto create_query = std::make_shared<ASTCreateQuery>();
|
auto create_query = std::make_shared<ASTCreateQuery>();
|
||||||
create_query->database = database_name;
|
create_query->database = database_name;
|
||||||
@ -64,7 +63,7 @@ ASTPtr DatabaseMemory::getCreateDatabaseQuery(const Context & /*context*/) const
|
|||||||
return create_query;
|
return create_query;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseMemory::getCreateTableQueryImpl(const Context &, const String & table_name, bool throw_on_error) const
|
ASTPtr DatabaseMemory::getCreateTableQueryImpl(const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto it = create_queries.find(table_name);
|
auto it = create_queries.find(table_name);
|
||||||
@ -80,7 +79,7 @@ ASTPtr DatabaseMemory::getCreateTableQueryImpl(const Context &, const String & t
|
|||||||
|
|
||||||
UUID DatabaseMemory::tryGetTableUUID(const String & table_name) const
|
UUID DatabaseMemory::tryGetTableUUID(const String & table_name) const
|
||||||
{
|
{
|
||||||
if (auto table = tryGetTable(global_context, table_name))
|
if (auto table = tryGetTable(table_name))
|
||||||
return table->getStorageID().uuid;
|
return table->getStorageID().uuid;
|
||||||
return UUIDHelpers::Nil;
|
return UUIDHelpers::Nil;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ namespace DB
|
|||||||
class DatabaseMemory final : public DatabaseWithOwnTablesBase
|
class DatabaseMemory final : public DatabaseWithOwnTablesBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DatabaseMemory(const String & name_, const Context & global_context_);
|
DatabaseMemory(const String & name_);
|
||||||
|
|
||||||
String getEngineName() const override { return "Memory"; }
|
String getEngineName() const override { return "Memory"; }
|
||||||
|
|
||||||
@ -34,8 +34,8 @@ public:
|
|||||||
const String & table_name,
|
const String & table_name,
|
||||||
bool no_delay) override;
|
bool no_delay) override;
|
||||||
|
|
||||||
ASTPtr getCreateTableQueryImpl(const Context & /*context*/, const String & name, bool throw_on_error) const override;
|
ASTPtr getCreateTableQueryImpl(const String & name, bool throw_on_error) const override;
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & /*context*/) const override;
|
ASTPtr getCreateDatabaseQuery() const override;
|
||||||
|
|
||||||
/// DatabaseMemory allows to create tables, which store data on disk.
|
/// DatabaseMemory allows to create tables, which store data on disk.
|
||||||
/// It's needed to create such tables in default database of clickhouse-local.
|
/// It's needed to create such tables in default database of clickhouse-local.
|
||||||
@ -47,7 +47,6 @@ public:
|
|||||||
UUID tryGetTableUUID(const String & table_name) const override;
|
UUID tryGetTableUUID(const String & table_name) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Context & global_context;
|
|
||||||
String data_path;
|
String data_path;
|
||||||
using NameToASTCreate = std::unordered_map<String, ASTPtr>;
|
using NameToASTCreate = std::unordered_map<String, ASTPtr>;
|
||||||
NameToASTCreate create_queries;
|
NameToASTCreate create_queries;
|
||||||
|
@ -73,7 +73,7 @@ DatabaseMySQL::DatabaseMySQL(
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseMySQL::empty(const Context &) const
|
bool DatabaseMySQL::empty() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
@ -103,12 +103,12 @@ DatabaseTablesIteratorPtr DatabaseMySQL::getTablesIterator(const FilterByNameFun
|
|||||||
return std::make_unique<DatabaseTablesSnapshotIterator>(tables);
|
return std::make_unique<DatabaseTablesSnapshotIterator>(tables);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseMySQL::isTableExist(const Context & context, const String & name) const
|
bool DatabaseMySQL::isTableExist(const String & name) const
|
||||||
{
|
{
|
||||||
return bool(tryGetTable(context, name));
|
return bool(tryGetTable(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseMySQL::tryGetTable(const Context &, const String & mysql_table_name) const
|
StoragePtr DatabaseMySQL::tryGetTable(const String & mysql_table_name) const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ static ASTPtr getCreateQueryFromStorage(const StoragePtr & storage, const ASTPtr
|
|||||||
return create_table_query;
|
return create_table_query;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseMySQL::getCreateTableQueryImpl(const Context &, const String & table_name, bool throw_on_error) const
|
ASTPtr DatabaseMySQL::getCreateTableQueryImpl(const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
@ -184,7 +184,7 @@ time_t DatabaseMySQL::getObjectMetadataModificationTime(const String & table_nam
|
|||||||
return time_t(local_tables_cache[table_name].first);
|
return time_t(local_tables_cache[table_name].first);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseMySQL::getCreateDatabaseQuery(const Context & /*context*/) const
|
ASTPtr DatabaseMySQL::getCreateDatabaseQuery() const
|
||||||
{
|
{
|
||||||
const auto & create_query = std::make_shared<ASTCreateQuery>();
|
const auto & create_query = std::make_shared<ASTCreateQuery>();
|
||||||
create_query->database = database_name;
|
create_query->database = database_name;
|
||||||
@ -490,7 +490,7 @@ DatabaseMySQL::~DatabaseMySQL()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseMySQL::createTable(const Context & context, const String & table_name, const StoragePtr & storage, const ASTPtr & create_query)
|
void DatabaseMySQL::createTable(const Context &, const String & table_name, const StoragePtr & storage, const ASTPtr & create_query)
|
||||||
{
|
{
|
||||||
const auto & create = create_query->as<ASTCreateQuery>();
|
const auto & create = create_query->as<ASTCreateQuery>();
|
||||||
|
|
||||||
@ -501,7 +501,7 @@ void DatabaseMySQL::createTable(const Context & context, const String & table_na
|
|||||||
/// XXX: hack
|
/// XXX: hack
|
||||||
/// In order to prevent users from broken the table structure by executing attach table database_name.table_name (...)
|
/// In order to prevent users from broken the table structure by executing attach table database_name.table_name (...)
|
||||||
/// we should compare the old and new create_query to make them completely consistent
|
/// we should compare the old and new create_query to make them completely consistent
|
||||||
const auto & origin_create_query = getCreateTableQuery(context, table_name);
|
const auto & origin_create_query = getCreateTableQuery(table_name);
|
||||||
origin_create_query->as<ASTCreateQuery>()->attach = true;
|
origin_create_query->as<ASTCreateQuery>()->attach = true;
|
||||||
|
|
||||||
if (queryToString(origin_create_query) != queryToString(create_query))
|
if (queryToString(origin_create_query) != queryToString(create_query))
|
||||||
|
@ -28,15 +28,15 @@ public:
|
|||||||
|
|
||||||
String getEngineName() const override { return "MySQL"; }
|
String getEngineName() const override { return "MySQL"; }
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty() const override;
|
||||||
|
|
||||||
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
DatabaseTablesIteratorPtr getTablesIterator(const FilterByNameFunction & filter_by_table_name) override;
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & /*context*/) const override;
|
ASTPtr getCreateDatabaseQuery() const override;
|
||||||
|
|
||||||
bool isTableExist(const Context & context, const String & name) const override;
|
bool isTableExist(const String & name) const override;
|
||||||
|
|
||||||
StoragePtr tryGetTable(const Context & context, const String & name) const override;
|
StoragePtr tryGetTable(const String & name) const override;
|
||||||
|
|
||||||
time_t getObjectMetadataModificationTime(const String & name) const override;
|
time_t getObjectMetadataModificationTime(const String & name) const override;
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ public:
|
|||||||
void attachTable(const String & table_name, const StoragePtr & storage, const String & relative_table_path) override;
|
void attachTable(const String & table_name, const StoragePtr & storage, const String & relative_table_path) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ASTPtr getCreateTableQueryImpl(const Context & context, const String & name, bool throw_on_error) const override;
|
ASTPtr getCreateTableQueryImpl(const String & name, bool throw_on_error) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Context & global_context;
|
const Context & global_context;
|
||||||
|
@ -156,11 +156,11 @@ void DatabaseOnDisk::createTable(
|
|||||||
/// But there is protection from it - see using DDLGuard in InterpreterCreateQuery.
|
/// But there is protection from it - see using DDLGuard in InterpreterCreateQuery.
|
||||||
|
|
||||||
|
|
||||||
if (isDictionaryExist(context, table_name))
|
if (isDictionaryExist(table_name))
|
||||||
throw Exception("Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " already exists.",
|
throw Exception("Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " already exists.",
|
||||||
ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
||||||
|
|
||||||
if (isTableExist(context, table_name))
|
if (isTableExist(table_name))
|
||||||
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
||||||
|
|
||||||
if (create.attach_short_syntax)
|
if (create.attach_short_syntax)
|
||||||
@ -267,7 +267,7 @@ void DatabaseOnDisk::renameTable(
|
|||||||
String table_metadata_path;
|
String table_metadata_path;
|
||||||
ASTPtr attach_query;
|
ASTPtr attach_query;
|
||||||
/// DatabaseLazy::detachTable may return nullptr even if table exists, so we need tryGetTable for this case.
|
/// DatabaseLazy::detachTable may return nullptr even if table exists, so we need tryGetTable for this case.
|
||||||
StoragePtr table = tryGetTable(context, table_name);
|
StoragePtr table = tryGetTable(table_name);
|
||||||
detachTable(table_name);
|
detachTable(table_name);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -304,14 +304,14 @@ void DatabaseOnDisk::renameTable(
|
|||||||
Poco::File(table_metadata_path).remove();
|
Poco::File(table_metadata_path).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const
|
ASTPtr DatabaseOnDisk::getCreateTableQueryImpl(const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
ASTPtr ast;
|
ASTPtr ast;
|
||||||
bool has_table = tryGetTable(context, table_name) != nullptr;
|
bool has_table = tryGetTable(table_name) != nullptr;
|
||||||
auto table_metadata_path = getObjectMetadataPath(table_name);
|
auto table_metadata_path = getObjectMetadataPath(table_name);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ast = getCreateQueryFromMetadata(context, table_metadata_path, throw_on_error);
|
ast = getCreateQueryFromMetadata(table_metadata_path, throw_on_error);
|
||||||
}
|
}
|
||||||
catch (const Exception & e)
|
catch (const Exception & e)
|
||||||
{
|
{
|
||||||
@ -324,14 +324,14 @@ ASTPtr DatabaseOnDisk::getCreateTableQueryImpl(const Context & context, const St
|
|||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateDatabaseQuery(const Context & context) const
|
ASTPtr DatabaseOnDisk::getCreateDatabaseQuery() const
|
||||||
{
|
{
|
||||||
ASTPtr ast;
|
ASTPtr ast;
|
||||||
|
|
||||||
auto settings = context.getSettingsRef();
|
auto settings = global_context.getSettingsRef();
|
||||||
auto metadata_dir_path = getMetadataPath();
|
auto metadata_dir_path = getMetadataPath();
|
||||||
auto database_metadata_path = metadata_dir_path.substr(0, metadata_dir_path.size() - 1) + ".sql";
|
auto database_metadata_path = metadata_dir_path.substr(0, metadata_dir_path.size() - 1) + ".sql";
|
||||||
ast = getCreateQueryFromMetadata(context, database_metadata_path, true);
|
ast = getCreateQueryFromMetadata(database_metadata_path, true);
|
||||||
if (!ast)
|
if (!ast)
|
||||||
{
|
{
|
||||||
/// Handle databases (such as default) for which there are no database.sql files.
|
/// Handle databases (such as default) for which there are no database.sql files.
|
||||||
@ -474,9 +474,9 @@ ASTPtr DatabaseOnDisk::parseQueryFromMetadata(Poco::Logger * loger, const Contex
|
|||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateQueryFromMetadata(const Context & context, const String & database_metadata_path, bool throw_on_error) const
|
ASTPtr DatabaseOnDisk::getCreateQueryFromMetadata(const String & database_metadata_path, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
ASTPtr ast = parseQueryFromMetadata(log, context, database_metadata_path, throw_on_error);
|
ASTPtr ast = parseQueryFromMetadata(log, global_context, database_metadata_path, throw_on_error);
|
||||||
|
|
||||||
if (ast)
|
if (ast)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ public:
|
|||||||
const String & to_table_name,
|
const String & to_table_name,
|
||||||
bool exchange) override;
|
bool exchange) override;
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery() const override;
|
||||||
|
|
||||||
void drop(const Context & context) override;
|
void drop(const Context & context) override;
|
||||||
|
|
||||||
@ -74,11 +74,10 @@ protected:
|
|||||||
void iterateMetadataFiles(const Context & context, const IteratingFunction & process_metadata_file) const;
|
void iterateMetadataFiles(const Context & context, const IteratingFunction & process_metadata_file) const;
|
||||||
|
|
||||||
ASTPtr getCreateTableQueryImpl(
|
ASTPtr getCreateTableQueryImpl(
|
||||||
const Context & context,
|
|
||||||
const String & table_name,
|
const String & table_name,
|
||||||
bool throw_on_error) const override;
|
bool throw_on_error) const override;
|
||||||
|
|
||||||
ASTPtr getCreateQueryFromMetadata(const Context & context, const String & metadata_path, bool throw_on_error) const;
|
ASTPtr getCreateQueryFromMetadata(const String & metadata_path, bool throw_on_error) const;
|
||||||
|
|
||||||
virtual void commitCreateTable(const ASTCreateQuery & query, const StoragePtr & table,
|
virtual void commitCreateTable(const ASTCreateQuery & query, const StoragePtr & table,
|
||||||
const String & table_metadata_tmp_path, const String & table_metadata_path);
|
const String & table_metadata_tmp_path, const String & table_metadata_path);
|
||||||
|
@ -117,7 +117,7 @@ void DatabaseWithDictionaries::createDictionary(const Context & context, const S
|
|||||||
|
|
||||||
/// A race condition would be possible if a dictionary with the same name is simultaneously created using CREATE and using ATTACH.
|
/// A race condition would be possible if a dictionary with the same name is simultaneously created using CREATE and using ATTACH.
|
||||||
/// But there is protection from it - see using DDLGuard in InterpreterCreateQuery.
|
/// But there is protection from it - see using DDLGuard in InterpreterCreateQuery.
|
||||||
if (isDictionaryExist(context, dictionary_name))
|
if (isDictionaryExist(dictionary_name))
|
||||||
throw Exception("Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.", ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
throw Exception("Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.", ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
||||||
|
|
||||||
/// A dictionary with the same full name could be defined in *.xml config files.
|
/// A dictionary with the same full name could be defined in *.xml config files.
|
||||||
@ -127,7 +127,7 @@ void DatabaseWithDictionaries::createDictionary(const Context & context, const S
|
|||||||
"Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.",
|
"Dictionary " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.",
|
||||||
ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
ErrorCodes::DICTIONARY_ALREADY_EXISTS);
|
||||||
|
|
||||||
if (isTableExist(context, dictionary_name))
|
if (isTableExist(dictionary_name))
|
||||||
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(dictionary_name) + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
||||||
|
|
||||||
|
|
||||||
@ -215,14 +215,13 @@ DatabaseDictionariesIteratorPtr DatabaseWithDictionaries::getDictionariesIterato
|
|||||||
return std::make_unique<DatabaseDictionariesSnapshotIterator>(std::move(filtered_dictionaries));
|
return std::make_unique<DatabaseDictionariesSnapshotIterator>(std::move(filtered_dictionaries));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseWithDictionaries::isDictionaryExist(const Context & /*context*/, const String & dictionary_name) const
|
bool DatabaseWithDictionaries::isDictionaryExist(const String & dictionary_name) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
return dictionaries.find(dictionary_name) != dictionaries.end();
|
return dictionaries.find(dictionary_name) != dictionaries.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseWithDictionaries::getCreateDictionaryQueryImpl(
|
ASTPtr DatabaseWithDictionaries::getCreateDictionaryQueryImpl(
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name,
|
const String & dictionary_name,
|
||||||
bool throw_on_error) const
|
bool throw_on_error) const
|
||||||
{
|
{
|
||||||
@ -245,7 +244,7 @@ ASTPtr DatabaseWithDictionaries::getCreateDictionaryQueryImpl(
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto dictionary_metadata_path = getObjectMetadataPath(dictionary_name);
|
auto dictionary_metadata_path = getObjectMetadataPath(dictionary_name);
|
||||||
ast = getCreateQueryFromMetadata(context, dictionary_metadata_path, throw_on_error);
|
ast = getCreateQueryFromMetadata(dictionary_metadata_path, throw_on_error);
|
||||||
}
|
}
|
||||||
catch (const Exception & e)
|
catch (const Exception & e)
|
||||||
{
|
{
|
||||||
@ -286,7 +285,7 @@ time_t DatabaseWithDictionaries::getObjectMetadataModificationTime(const String
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DatabaseWithDictionaries::empty(const Context &) const
|
bool DatabaseWithDictionaries::empty() const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
return tables.empty() && dictionaries.empty();
|
return tables.empty() && dictionaries.empty();
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
|
|
||||||
void removeDictionary(const Context & context, const String & dictionary_name) override;
|
void removeDictionary(const Context & context, const String & dictionary_name) override;
|
||||||
|
|
||||||
bool isDictionaryExist(const Context & context, const String & dictionary_name) const override;
|
bool isDictionaryExist(const String & dictionary_name) const override;
|
||||||
|
|
||||||
DatabaseDictionariesIteratorPtr getDictionariesIterator(const FilterByNameFunction & filter_by_dictionary_name) override;
|
DatabaseDictionariesIteratorPtr getDictionariesIterator(const FilterByNameFunction & filter_by_dictionary_name) override;
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ public:
|
|||||||
|
|
||||||
time_t getObjectMetadataModificationTime(const String & object_name) const override;
|
time_t getObjectMetadataModificationTime(const String & object_name) const override;
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty() const override;
|
||||||
|
|
||||||
void shutdown() override;
|
void shutdown() override;
|
||||||
|
|
||||||
@ -41,8 +41,7 @@ protected:
|
|||||||
|
|
||||||
void detachDictionaryImpl(const String & dictionary_name, DictionaryAttachInfo & attach_info);
|
void detachDictionaryImpl(const String & dictionary_name, DictionaryAttachInfo & attach_info);
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQueryImpl(const Context & context,
|
ASTPtr getCreateDictionaryQueryImpl(const String & dictionary_name,
|
||||||
const String & dictionary_name,
|
|
||||||
bool throw_on_error) const override;
|
bool throw_on_error) const override;
|
||||||
|
|
||||||
std::unordered_map<String, DictionaryAttachInfo> dictionaries;
|
std::unordered_map<String, DictionaryAttachInfo> dictionaries;
|
||||||
|
@ -23,17 +23,13 @@ DatabaseWithOwnTablesBase::DatabaseWithOwnTablesBase(const String & name_, const
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseWithOwnTablesBase::isTableExist(
|
bool DatabaseWithOwnTablesBase::isTableExist(const String & table_name) const
|
||||||
const Context & /*context*/,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
return tables.find(table_name) != tables.end();
|
return tables.find(table_name) != tables.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseWithOwnTablesBase::tryGetTable(
|
StoragePtr DatabaseWithOwnTablesBase::tryGetTable(const String & table_name) const
|
||||||
const Context & /*context*/,
|
|
||||||
const String & table_name) const
|
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
auto it = tables.find(table_name);
|
auto it = tables.find(table_name);
|
||||||
@ -56,7 +52,7 @@ DatabaseTablesIteratorPtr DatabaseWithOwnTablesBase::getTablesIterator(const Fil
|
|||||||
return std::make_unique<DatabaseTablesSnapshotIterator>(std::move(filtered_tables));
|
return std::make_unique<DatabaseTablesSnapshotIterator>(std::move(filtered_tables));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseWithOwnTablesBase::empty(const Context & /*context*/) const
|
bool DatabaseWithOwnTablesBase::empty() const
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
return tables.empty();
|
return tables.empty();
|
||||||
|
@ -19,15 +19,11 @@ class Context;
|
|||||||
class DatabaseWithOwnTablesBase : public IDatabase
|
class DatabaseWithOwnTablesBase : public IDatabase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool isTableExist(
|
bool isTableExist(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(
|
StoragePtr tryGetTable(const String & table_name) const override;
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty() const override;
|
||||||
|
|
||||||
void attachTable(const String & table_name, const StoragePtr & table, const String & relative_table_path) override;
|
void attachTable(const String & table_name, const StoragePtr & table, const String & relative_table_path) override;
|
||||||
|
|
||||||
|
@ -130,22 +130,16 @@ public:
|
|||||||
virtual void loadStoredObjects(Context & /*context*/, bool /*has_force_restore_data_flag*/) {}
|
virtual void loadStoredObjects(Context & /*context*/, bool /*has_force_restore_data_flag*/) {}
|
||||||
|
|
||||||
/// Check the existence of the table.
|
/// Check the existence of the table.
|
||||||
virtual bool isTableExist(
|
virtual bool isTableExist(const String & name) const = 0;
|
||||||
const Context & context,
|
|
||||||
const String & name) const = 0;
|
|
||||||
|
|
||||||
/// Check the existence of the dictionary
|
/// Check the existence of the dictionary
|
||||||
virtual bool isDictionaryExist(
|
virtual bool isDictionaryExist(const String & /*name*/) const
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*name*/) const
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the table for work. Return nullptr if there is no table.
|
/// Get the table for work. Return nullptr if there is no table.
|
||||||
virtual StoragePtr tryGetTable(
|
virtual StoragePtr tryGetTable(const String & name) const = 0;
|
||||||
const Context & context,
|
|
||||||
const String & name) const = 0;
|
|
||||||
|
|
||||||
virtual UUID tryGetTableUUID(const String & /*table_name*/) const { return UUIDHelpers::Nil; }
|
virtual UUID tryGetTableUUID(const String & /*table_name*/) const { return UUIDHelpers::Nil; }
|
||||||
|
|
||||||
@ -162,7 +156,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Is the database empty.
|
/// Is the database empty.
|
||||||
virtual bool empty(const Context & context) const = 0;
|
virtual bool empty() const = 0;
|
||||||
|
|
||||||
/// Add the table to the database. Record its presence in the metadata.
|
/// Add the table to the database. Record its presence in the metadata.
|
||||||
virtual void createTable(
|
virtual void createTable(
|
||||||
@ -255,25 +249,25 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CREATE TABLE query for the table. It can also provide information for detached tables for which there is metadata.
|
/// Get the CREATE TABLE query for the table. It can also provide information for detached tables for which there is metadata.
|
||||||
ASTPtr tryGetCreateTableQuery(const Context & context, const String & name) const noexcept
|
ASTPtr tryGetCreateTableQuery(const String & name) const noexcept
|
||||||
{
|
{
|
||||||
return getCreateTableQueryImpl(context, name, false);
|
return getCreateTableQueryImpl(name, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr getCreateTableQuery(const Context & context, const String & name) const
|
ASTPtr getCreateTableQuery(const String & name) const
|
||||||
{
|
{
|
||||||
return getCreateTableQueryImpl(context, name, true);
|
return getCreateTableQueryImpl(name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CREATE DICTIONARY query for the dictionary. Returns nullptr if dictionary doesn't exists.
|
/// Get the CREATE DICTIONARY query for the dictionary. Returns nullptr if dictionary doesn't exists.
|
||||||
ASTPtr tryGetCreateDictionaryQuery(const Context & context, const String & name) const noexcept
|
ASTPtr tryGetCreateDictionaryQuery(const String & name) const noexcept
|
||||||
{
|
{
|
||||||
return getCreateDictionaryQueryImpl(context, name, false);
|
return getCreateDictionaryQueryImpl(name, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQuery(const Context & context, const String & name) const
|
ASTPtr getCreateDictionaryQuery(const String & name) const
|
||||||
{
|
{
|
||||||
return getCreateDictionaryQueryImpl(context, name, true);
|
return getCreateDictionaryQueryImpl(name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Poco::AutoPtr<Poco::Util::AbstractConfiguration> getDictionaryConfiguration(const String & /*name*/) const
|
virtual Poco::AutoPtr<Poco::Util::AbstractConfiguration> getDictionaryConfiguration(const String & /*name*/) const
|
||||||
@ -282,7 +276,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CREATE DATABASE query for current database.
|
/// Get the CREATE DATABASE query for current database.
|
||||||
virtual ASTPtr getCreateDatabaseQuery(const Context & /*context*/) const = 0;
|
virtual ASTPtr getCreateDatabaseQuery() const = 0;
|
||||||
|
|
||||||
/// Get name of database.
|
/// Get name of database.
|
||||||
String getDatabaseName() const { return database_name; }
|
String getDatabaseName() const { return database_name; }
|
||||||
@ -310,14 +304,14 @@ public:
|
|||||||
virtual ~IDatabase() {}
|
virtual ~IDatabase() {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ASTPtr getCreateTableQueryImpl(const Context & /*context*/, const String & /*name*/, bool throw_on_error) const
|
virtual ASTPtr getCreateTableQueryImpl(const String & /*name*/, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
if (throw_on_error)
|
if (throw_on_error)
|
||||||
throw Exception("There is no SHOW CREATE TABLE query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
throw Exception("There is no SHOW CREATE TABLE query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ASTPtr getCreateDictionaryQueryImpl(const Context & /*context*/, const String & /*name*/, bool throw_on_error) const
|
virtual ASTPtr getCreateDictionaryQueryImpl(const String & /*name*/, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
if (throw_on_error)
|
if (throw_on_error)
|
||||||
throw Exception("There is no SHOW CREATE DICTIONARY query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_DICTIONARY_QUERY);
|
throw Exception("There is no SHOW CREATE DICTIONARY query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_DICTIONARY_QUERY);
|
||||||
|
@ -97,7 +97,7 @@ StorageID TemporaryTableHolder::getGlobalTableID() const
|
|||||||
|
|
||||||
StoragePtr TemporaryTableHolder::getTable() const
|
StoragePtr TemporaryTableHolder::getTable() const
|
||||||
{
|
{
|
||||||
auto table = temporary_tables->tryGetTable(*global_context, "_tmp_" + toString(id));
|
auto table = temporary_tables->tryGetTable("_tmp_" + toString(id));
|
||||||
if (!table)
|
if (!table)
|
||||||
throw Exception("Temporary table " + getGlobalTableID().getNameForLogs() + " not found", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Temporary table " + getGlobalTableID().getNameForLogs() + " not found", ErrorCodes::LOGICAL_ERROR);
|
||||||
return table;
|
return table;
|
||||||
@ -108,7 +108,7 @@ void DatabaseCatalog::loadDatabases()
|
|||||||
{
|
{
|
||||||
drop_delay_sec = global_context->getConfigRef().getInt("database_atomic_delay_before_drop_table_sec", 60);
|
drop_delay_sec = global_context->getConfigRef().getInt("database_atomic_delay_before_drop_table_sec", 60);
|
||||||
|
|
||||||
auto db_for_temporary_and_external_tables = std::make_shared<DatabaseMemory>(TEMPORARY_DATABASE, *global_context);
|
auto db_for_temporary_and_external_tables = std::make_shared<DatabaseMemory>(TEMPORARY_DATABASE);
|
||||||
attachDatabase(TEMPORARY_DATABASE, db_for_temporary_and_external_tables);
|
attachDatabase(TEMPORARY_DATABASE, db_for_temporary_and_external_tables);
|
||||||
|
|
||||||
loadMarkedAsDroppedTables();
|
loadMarkedAsDroppedTables();
|
||||||
@ -159,7 +159,6 @@ DatabaseAndTable DatabaseCatalog::tryGetByUUID(const UUID & uuid) const
|
|||||||
|
|
||||||
DatabaseAndTable DatabaseCatalog::getTableImpl(
|
DatabaseAndTable DatabaseCatalog::getTableImpl(
|
||||||
const StorageID & table_id,
|
const StorageID & table_id,
|
||||||
const Context & local_context,
|
|
||||||
std::optional<Exception> * exception) const
|
std::optional<Exception> * exception) const
|
||||||
{
|
{
|
||||||
if (!table_id)
|
if (!table_id)
|
||||||
@ -207,7 +206,7 @@ DatabaseAndTable DatabaseCatalog::getTableImpl(
|
|||||||
database = it->second;
|
database = it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto table = database->tryGetTable(local_context, table_id.table_name);
|
auto table = database->tryGetTable(table_id.table_name);
|
||||||
if (!table && exception)
|
if (!table && exception)
|
||||||
exception->emplace("Table " + table_id.getNameForLogs() + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
exception->emplace("Table " + table_id.getNameForLogs() + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
|
|
||||||
@ -262,7 +261,7 @@ DatabasePtr DatabaseCatalog::detachDatabase(const String & database_name, bool d
|
|||||||
|
|
||||||
if (check_empty)
|
if (check_empty)
|
||||||
{
|
{
|
||||||
if (!db->empty(*global_context))
|
if (!db->empty())
|
||||||
throw Exception("New table appeared in database being dropped or detached. Try again.",
|
throw Exception("New table appeared in database being dropped or detached. Try again.",
|
||||||
ErrorCodes::DATABASE_NOT_EMPTY);
|
ErrorCodes::DATABASE_NOT_EMPTY);
|
||||||
auto database_atomic = typeid_cast<DatabaseAtomic *>(db.get());
|
auto database_atomic = typeid_cast<DatabaseAtomic *>(db.get());
|
||||||
@ -332,7 +331,7 @@ bool DatabaseCatalog::isTableExist(const DB::StorageID & table_id) const
|
|||||||
if (iter != databases.end())
|
if (iter != databases.end())
|
||||||
db = iter->second;
|
db = iter->second;
|
||||||
}
|
}
|
||||||
return db && db->isTableExist(*global_context, table_id.table_name);
|
return db && db->isTableExist(table_id.table_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseCatalog::assertTableDoesntExist(const StorageID & table_id) const
|
void DatabaseCatalog::assertTableDoesntExist(const StorageID & table_id) const
|
||||||
@ -466,13 +465,13 @@ std::unique_ptr<DDLGuard> DatabaseCatalog::getDDLGuard(const String & database,
|
|||||||
bool DatabaseCatalog::isDictionaryExist(const StorageID & table_id) const
|
bool DatabaseCatalog::isDictionaryExist(const StorageID & table_id) const
|
||||||
{
|
{
|
||||||
auto db = tryGetDatabase(table_id.getDatabaseName());
|
auto db = tryGetDatabase(table_id.getDatabaseName());
|
||||||
return db && db->isDictionaryExist(*global_context, table_id.getTableName());
|
return db && db->isDictionaryExist(table_id.getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseCatalog::getTable(const StorageID & table_id) const
|
StoragePtr DatabaseCatalog::getTable(const StorageID & table_id) const
|
||||||
{
|
{
|
||||||
std::optional<Exception> exc;
|
std::optional<Exception> exc;
|
||||||
auto res = getTableImpl(table_id, *global_context, &exc);
|
auto res = getTableImpl(table_id, &exc);
|
||||||
if (!res.second)
|
if (!res.second)
|
||||||
throw Exception(*exc);
|
throw Exception(*exc);
|
||||||
return res.second;
|
return res.second;
|
||||||
@ -480,13 +479,13 @@ StoragePtr DatabaseCatalog::getTable(const StorageID & table_id) const
|
|||||||
|
|
||||||
StoragePtr DatabaseCatalog::tryGetTable(const StorageID & table_id) const
|
StoragePtr DatabaseCatalog::tryGetTable(const StorageID & table_id) const
|
||||||
{
|
{
|
||||||
return getTableImpl(table_id, *global_context, nullptr).second;
|
return getTableImpl(table_id, nullptr).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseAndTable DatabaseCatalog::getDatabaseAndTable(const StorageID & table_id) const
|
DatabaseAndTable DatabaseCatalog::getDatabaseAndTable(const StorageID & table_id) const
|
||||||
{
|
{
|
||||||
std::optional<Exception> exc;
|
std::optional<Exception> exc;
|
||||||
auto res = getTableImpl(table_id, *global_context, &exc);
|
auto res = getTableImpl(table_id, &exc);
|
||||||
if (!res.second)
|
if (!res.second)
|
||||||
throw Exception(*exc);
|
throw Exception(*exc);
|
||||||
return res;
|
return res;
|
||||||
@ -494,7 +493,7 @@ DatabaseAndTable DatabaseCatalog::getDatabaseAndTable(const StorageID & table_id
|
|||||||
|
|
||||||
DatabaseAndTable DatabaseCatalog::tryGetDatabaseAndTable(const StorageID & table_id) const
|
DatabaseAndTable DatabaseCatalog::tryGetDatabaseAndTable(const StorageID & table_id) const
|
||||||
{
|
{
|
||||||
return getTableImpl(table_id, *global_context, nullptr);
|
return getTableImpl(table_id, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseCatalog::loadMarkedAsDroppedTables()
|
void DatabaseCatalog::loadMarkedAsDroppedTables()
|
||||||
|
@ -137,7 +137,7 @@ public:
|
|||||||
StoragePtr tryGetTable(const StorageID & table_id) const;
|
StoragePtr tryGetTable(const StorageID & table_id) const;
|
||||||
DatabaseAndTable getDatabaseAndTable(const StorageID & table_id) const;
|
DatabaseAndTable getDatabaseAndTable(const StorageID & table_id) const;
|
||||||
DatabaseAndTable tryGetDatabaseAndTable(const StorageID & table_id) const;
|
DatabaseAndTable tryGetDatabaseAndTable(const StorageID & table_id) const;
|
||||||
DatabaseAndTable getTableImpl(const StorageID & table_id, const Context & local_context, std::optional<Exception> * exception = nullptr) const;
|
DatabaseAndTable getTableImpl(const StorageID & table_id, std::optional<Exception> * exception = nullptr) const;
|
||||||
|
|
||||||
void addDependency(const StorageID & from, const StorageID & where);
|
void addDependency(const StorageID & from, const StorageID & where);
|
||||||
void removeDependency(const StorageID & from, const StorageID & where);
|
void removeDependency(const StorageID & from, const StorageID & where);
|
||||||
|
@ -39,7 +39,7 @@ LoadablesConfigurationPtr ExternalLoaderDatabaseConfigRepository::load(const std
|
|||||||
|
|
||||||
bool ExternalLoaderDatabaseConfigRepository::exists(const std::string & loadable_definition_name)
|
bool ExternalLoaderDatabaseConfigRepository::exists(const std::string & loadable_definition_name)
|
||||||
{
|
{
|
||||||
return database.isDictionaryExist(context, trimDatabaseName(loadable_definition_name, database));
|
return database.isDictionaryExist(trimDatabaseName(loadable_definition_name, database));
|
||||||
}
|
}
|
||||||
|
|
||||||
Poco::Timestamp ExternalLoaderDatabaseConfigRepository::getUpdateTime(const std::string & loadable_definition_name)
|
Poco::Timestamp ExternalLoaderDatabaseConfigRepository::getUpdateTime(const std::string & loadable_definition_name)
|
||||||
|
@ -504,7 +504,7 @@ void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
|||||||
String as_database_name = context.resolveDatabase(create.as_database);
|
String as_database_name = context.resolveDatabase(create.as_database);
|
||||||
String as_table_name = create.as_table;
|
String as_table_name = create.as_table;
|
||||||
|
|
||||||
ASTPtr as_create_ptr = DatabaseCatalog::instance().getDatabase(as_database_name)->getCreateTableQuery(context, as_table_name);
|
ASTPtr as_create_ptr = DatabaseCatalog::instance().getDatabase(as_database_name)->getCreateTableQuery(as_table_name);
|
||||||
const auto & as_create = as_create_ptr->as<ASTCreateQuery &>();
|
const auto & as_create = as_create_ptr->as<ASTCreateQuery &>();
|
||||||
|
|
||||||
const String qualified_name = backQuoteIfNeed(as_database_name) + "." + backQuoteIfNeed(as_table_name);
|
const String qualified_name = backQuoteIfNeed(as_database_name) + "." + backQuoteIfNeed(as_table_name);
|
||||||
@ -546,7 +546,7 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
|||||||
bool if_not_exists = create.if_not_exists;
|
bool if_not_exists = create.if_not_exists;
|
||||||
|
|
||||||
// Table SQL definition is available even if the table is detached
|
// Table SQL definition is available even if the table is detached
|
||||||
auto query = database->getCreateTableQuery(context, create.table);
|
auto query = database->getCreateTableQuery(create.table);
|
||||||
create = query->as<ASTCreateQuery &>(); // Copy the saved create query, but use ATTACH instead of CREATE
|
create = query->as<ASTCreateQuery &>(); // Copy the saved create query, but use ATTACH instead of CREATE
|
||||||
create.attach = true;
|
create.attach = true;
|
||||||
create.attach_short_syntax = true;
|
create.attach_short_syntax = true;
|
||||||
@ -608,7 +608,7 @@ bool InterpreterCreateQuery::doCreateTable(ASTCreateQuery & create,
|
|||||||
guard = DatabaseCatalog::instance().getDDLGuard(create.database, table_name);
|
guard = DatabaseCatalog::instance().getDDLGuard(create.database, table_name);
|
||||||
|
|
||||||
/// Table can be created before or it can be created concurrently in another thread, while we were waiting in DDLGuard.
|
/// Table can be created before or it can be created concurrently in another thread, while we were waiting in DDLGuard.
|
||||||
if (database->isTableExist(context, table_name))
|
if (database->isTableExist(table_name))
|
||||||
{
|
{
|
||||||
/// TODO Check structure of table
|
/// TODO Check structure of table
|
||||||
if (create.if_not_exists)
|
if (create.if_not_exists)
|
||||||
@ -708,7 +708,7 @@ BlockIO InterpreterCreateQuery::createDictionary(ASTCreateQuery & create)
|
|||||||
auto guard = DatabaseCatalog::instance().getDDLGuard(database_name, dictionary_name);
|
auto guard = DatabaseCatalog::instance().getDDLGuard(database_name, dictionary_name);
|
||||||
DatabasePtr database = DatabaseCatalog::instance().getDatabase(database_name);
|
DatabasePtr database = DatabaseCatalog::instance().getDatabase(database_name);
|
||||||
|
|
||||||
if (database->isDictionaryExist(context, dictionary_name))
|
if (database->isDictionaryExist(dictionary_name))
|
||||||
{
|
{
|
||||||
/// TODO Check structure of dictionary
|
/// TODO Check structure of dictionary
|
||||||
if (create.if_not_exists)
|
if (create.if_not_exists)
|
||||||
@ -720,7 +720,7 @@ BlockIO InterpreterCreateQuery::createDictionary(ASTCreateQuery & create)
|
|||||||
|
|
||||||
if (create.attach)
|
if (create.attach)
|
||||||
{
|
{
|
||||||
auto query = DatabaseCatalog::instance().getDatabase(database_name)->getCreateDictionaryQuery(context, dictionary_name);
|
auto query = DatabaseCatalog::instance().getDatabase(database_name)->getCreateDictionaryQuery(dictionary_name);
|
||||||
create = query->as<ASTCreateQuery &>();
|
create = query->as<ASTCreateQuery &>();
|
||||||
create.attach = true;
|
create.attach = true;
|
||||||
auto config = getDictionaryConfigurationFromAST(create);
|
auto config = getDictionaryConfigurationFromAST(create);
|
||||||
|
@ -144,7 +144,7 @@ BlockIO InterpreterDropQuery::executeToDictionary(
|
|||||||
|
|
||||||
DatabasePtr database = tryGetDatabase(database_name, if_exists);
|
DatabasePtr database = tryGetDatabase(database_name, if_exists);
|
||||||
|
|
||||||
if (!database || !database->isDictionaryExist(context, dictionary_name))
|
if (!database || !database->isDictionaryExist(dictionary_name))
|
||||||
{
|
{
|
||||||
if (!if_exists)
|
if (!if_exists)
|
||||||
throw Exception(
|
throw Exception(
|
||||||
|
@ -49,7 +49,7 @@ BlockInputStreamPtr InterpreterShowCreateQuery::executeImpl()
|
|||||||
auto resolve_table_type = show_query->temporary ? Context::ResolveExternal : Context::ResolveOrdinary;
|
auto resolve_table_type = show_query->temporary ? Context::ResolveExternal : Context::ResolveOrdinary;
|
||||||
auto table_id = context.resolveStorageID(*show_query, resolve_table_type);
|
auto table_id = context.resolveStorageID(*show_query, resolve_table_type);
|
||||||
context.checkAccess(AccessType::SHOW_COLUMNS, table_id);
|
context.checkAccess(AccessType::SHOW_COLUMNS, table_id);
|
||||||
create_query = DatabaseCatalog::instance().getDatabase(table_id.database_name)->getCreateTableQuery(context, table_id.table_name);
|
create_query = DatabaseCatalog::instance().getDatabase(table_id.database_name)->getCreateTableQuery(table_id.table_name);
|
||||||
}
|
}
|
||||||
else if ((show_query = query_ptr->as<ASTShowCreateDatabaseQuery>()))
|
else if ((show_query = query_ptr->as<ASTShowCreateDatabaseQuery>()))
|
||||||
{
|
{
|
||||||
@ -57,7 +57,7 @@ BlockInputStreamPtr InterpreterShowCreateQuery::executeImpl()
|
|||||||
throw Exception("Temporary databases are not possible.", ErrorCodes::SYNTAX_ERROR);
|
throw Exception("Temporary databases are not possible.", ErrorCodes::SYNTAX_ERROR);
|
||||||
show_query->database = context.resolveDatabase(show_query->database);
|
show_query->database = context.resolveDatabase(show_query->database);
|
||||||
context.checkAccess(AccessType::SHOW_DATABASES, show_query->database);
|
context.checkAccess(AccessType::SHOW_DATABASES, show_query->database);
|
||||||
create_query = DatabaseCatalog::instance().getDatabase(show_query->database)->getCreateDatabaseQuery(context);
|
create_query = DatabaseCatalog::instance().getDatabase(show_query->database)->getCreateDatabaseQuery();
|
||||||
}
|
}
|
||||||
else if ((show_query = query_ptr->as<ASTShowCreateDictionaryQuery>()))
|
else if ((show_query = query_ptr->as<ASTShowCreateDictionaryQuery>()))
|
||||||
{
|
{
|
||||||
@ -65,7 +65,7 @@ BlockInputStreamPtr InterpreterShowCreateQuery::executeImpl()
|
|||||||
throw Exception("Temporary dictionaries are not possible.", ErrorCodes::SYNTAX_ERROR);
|
throw Exception("Temporary dictionaries are not possible.", ErrorCodes::SYNTAX_ERROR);
|
||||||
show_query->database = context.resolveDatabase(show_query->database);
|
show_query->database = context.resolveDatabase(show_query->database);
|
||||||
context.checkAccess(AccessType::SHOW_DICTIONARIES, show_query->database, show_query->table);
|
context.checkAccess(AccessType::SHOW_DICTIONARIES, show_query->database, show_query->table);
|
||||||
create_query = DatabaseCatalog::instance().getDatabase(show_query->database)->getCreateDictionaryQuery(context, show_query->table);
|
create_query = DatabaseCatalog::instance().getDatabase(show_query->database)->getCreateDictionaryQuery(show_query->table);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!create_query && show_query && show_query->temporary)
|
if (!create_query && show_query && show_query->temporary)
|
||||||
|
@ -330,7 +330,7 @@ StoragePtr InterpreterSystemQuery::tryRestartReplica(const StorageID & replica,
|
|||||||
{
|
{
|
||||||
/// If table was already dropped by anyone, an exception will be thrown
|
/// If table was already dropped by anyone, an exception will be thrown
|
||||||
auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout);
|
auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout);
|
||||||
create_ast = database->getCreateTableQuery(system_context, replica.table_name);
|
create_ast = database->getCreateTableQuery(replica.table_name);
|
||||||
|
|
||||||
database->detachTable(replica.table_name);
|
database->detachTable(replica.table_name);
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ int main()
|
|||||||
Context context = Context::createGlobal(shared_context.get());
|
Context context = Context::createGlobal(shared_context.get());
|
||||||
context.makeGlobalContext();
|
context.makeGlobalContext();
|
||||||
|
|
||||||
auto system_database = std::make_shared<DatabaseMemory>("system", context);
|
auto system_database = std::make_shared<DatabaseMemory>("system");
|
||||||
DatabaseCatalog::instance().attachDatabase("system", system_database);
|
DatabaseCatalog::instance().attachDatabase("system", system_database);
|
||||||
//context.setCurrentDatabase("system");
|
//context.setCurrentDatabase("system");
|
||||||
system_database->attachTable("one", StorageSystemOne::create("one"), {});
|
system_database->attachTable("one", StorageSystemOne::create("one"), {});
|
||||||
|
@ -331,7 +331,7 @@ protected:
|
|||||||
|
|
||||||
if (columns_mask[src_index] || columns_mask[src_index + 1])
|
if (columns_mask[src_index] || columns_mask[src_index + 1])
|
||||||
{
|
{
|
||||||
ASTPtr ast = database->tryGetCreateTableQuery(context, table_name);
|
ASTPtr ast = database->tryGetCreateTableQuery(table_name);
|
||||||
|
|
||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
res_columns[res_index++]->insert(ast ? queryToString(ast) : "");
|
res_columns[res_index++]->insert(ast ? queryToString(ast) : "");
|
||||||
|
@ -30,7 +30,7 @@ struct State
|
|||||||
explicit State(Context & context_) : context(context_)
|
explicit State(Context & context_) : context(context_)
|
||||||
{
|
{
|
||||||
registerFunctions();
|
registerFunctions();
|
||||||
DatabasePtr database = std::make_shared<DatabaseMemory>("test", context);
|
DatabasePtr database = std::make_shared<DatabaseMemory>("test");
|
||||||
database->attachTable("table", StorageMemory::create(StorageID("test", "table"), ColumnsDescription{columns}, ConstraintsDescription{}));
|
database->attachTable("table", StorageMemory::create(StorageID("test", "table"), ColumnsDescription{columns}, ConstraintsDescription{}));
|
||||||
context.makeGlobalContext();
|
context.makeGlobalContext();
|
||||||
DatabaseCatalog::instance().attachDatabase("test", database);
|
DatabaseCatalog::instance().attachDatabase("test", database);
|
||||||
|
Loading…
Reference in New Issue
Block a user