mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-11 17:02:25 +00:00
SHOW CREATE for DatabaseMemory
This commit is contained in:
parent
89a31e4253
commit
7f3b5efebe
@ -9,6 +9,11 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int UNKNOWN_TABLE;
|
||||
}
|
||||
|
||||
DatabaseMemory::DatabaseMemory(const String & name_)
|
||||
: DatabaseWithOwnTablesBase(name_, "DatabaseMemory(" + name_ + ")")
|
||||
, data_path("data/" + escapeForFileName(database_name) + "/")
|
||||
@ -18,16 +23,19 @@ void DatabaseMemory::createTable(
|
||||
const Context & /*context*/,
|
||||
const String & table_name,
|
||||
const StoragePtr & table,
|
||||
const ASTPtr & /*query*/)
|
||||
const ASTPtr & query)
|
||||
{
|
||||
attachTable(table_name, table);
|
||||
std::lock_guard lock{mutex};
|
||||
attachTableUnlocked(table_name, table);
|
||||
create_queries.emplace(table_name, query);
|
||||
}
|
||||
|
||||
void DatabaseMemory::dropTable(
|
||||
const Context & /*context*/,
|
||||
const String & table_name)
|
||||
{
|
||||
auto table = detachTable(table_name);
|
||||
std::lock_guard lock{mutex};
|
||||
auto table = detachTableUnlocked(table_name);
|
||||
try
|
||||
{
|
||||
table->drop();
|
||||
@ -37,9 +45,11 @@ void DatabaseMemory::dropTable(
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
attachTable(table_name, table);
|
||||
attachTableUnlocked(table_name, table);
|
||||
throw;
|
||||
}
|
||||
table->is_dropped = true;
|
||||
create_queries.erase(table_name);
|
||||
}
|
||||
|
||||
ASTPtr DatabaseMemory::getCreateDatabaseQuery(const Context & /*context*/) const
|
||||
@ -51,4 +61,13 @@ ASTPtr DatabaseMemory::getCreateDatabaseQuery(const Context & /*context*/) const
|
||||
return create_query;
|
||||
}
|
||||
|
||||
ASTPtr DatabaseMemory::getCreateTableQueryImpl(const Context &, const String & table_name, bool throw_on_error) const
|
||||
{
|
||||
std::lock_guard lock{mutex};
|
||||
auto it = create_queries.find(table_name);
|
||||
if (it == create_queries.end() && throw_on_error)
|
||||
throw Exception("No table " + table_name + " in database " + database_name, ErrorCodes::UNKNOWN_TABLE);
|
||||
return it->second;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ public:
|
||||
const Context & context,
|
||||
const String & table_name) override;
|
||||
|
||||
ASTPtr getCreateTableQueryImpl(const Context & /*context*/, const String & name, bool throw_on_error) const override;
|
||||
ASTPtr getCreateDatabaseQuery(const Context & /*context*/) const override;
|
||||
|
||||
/// DatabaseMemory allows to create tables, which store data on disk.
|
||||
@ -44,6 +45,8 @@ public:
|
||||
|
||||
private:
|
||||
String data_path;
|
||||
using NameToASTCreate = std::unordered_map<String, ASTPtr>;
|
||||
NameToASTCreate create_queries;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -67,25 +67,33 @@ bool DatabaseWithOwnTablesBase::empty(const Context & /*context*/) const
|
||||
|
||||
StoragePtr DatabaseWithOwnTablesBase::detachTable(const String & table_name)
|
||||
{
|
||||
StoragePtr res;
|
||||
{
|
||||
std::lock_guard lock(mutex);
|
||||
if (dictionaries.count(table_name))
|
||||
throw Exception("Cannot detach dictionary " + database_name + "." + table_name + " as table, use DETACH DICTIONARY query.", ErrorCodes::UNKNOWN_TABLE);
|
||||
std::lock_guard lock(mutex);
|
||||
return detachTableUnlocked(table_name);
|
||||
}
|
||||
|
||||
auto it = tables.find(table_name);
|
||||
if (it == tables.end())
|
||||
throw Exception("Table " + backQuote(database_name) + "." + backQuote(table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||
res = it->second;
|
||||
tables.erase(it);
|
||||
}
|
||||
StoragePtr DatabaseWithOwnTablesBase::detachTableUnlocked(const String & table_name)
|
||||
{
|
||||
StoragePtr res;
|
||||
if (dictionaries.count(table_name))
|
||||
throw Exception("Cannot detach dictionary " + database_name + "." + table_name + " as table, use DETACH DICTIONARY query.", ErrorCodes::UNKNOWN_TABLE);
|
||||
|
||||
auto it = tables.find(table_name);
|
||||
if (it == tables.end())
|
||||
throw Exception("Table " + backQuote(database_name) + "." + backQuote(table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||
res = it->second;
|
||||
tables.erase(it);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void DatabaseWithOwnTablesBase::attachTable(const String & table_name, const StoragePtr & table, const String &)
|
||||
void DatabaseWithOwnTablesBase::attachTable(const String & table_name, const StoragePtr & table, const String & relative_table_path)
|
||||
{
|
||||
std::lock_guard lock(mutex);
|
||||
attachTableUnlocked(table_name, table, relative_table_path);
|
||||
}
|
||||
|
||||
void DatabaseWithOwnTablesBase::attachTableUnlocked(const String & table_name, const StoragePtr & table, const String &)
|
||||
{
|
||||
if (!tables.emplace(table_name, table).second)
|
||||
throw Exception("Table " + database_name + "." + table_name + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
||||
}
|
||||
|
@ -47,6 +47,9 @@ protected:
|
||||
Poco::Logger * log;
|
||||
|
||||
DatabaseWithOwnTablesBase(const String & name_, const String & logger);
|
||||
|
||||
void attachTableUnlocked(const String & table_name, const StoragePtr & table, const String & relative_table_path = {});
|
||||
StoragePtr detachTableUnlocked(const String & table_name);
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -5,3 +5,4 @@ CREATE DATABASE memory_01069 ENGINE = Memory()
|
||||
4
|
||||
3
|
||||
4
|
||||
CREATE TABLE memory_01069.file (`n` UInt8) ENGINE = File(CSV)
|
||||
|
@ -15,4 +15,7 @@ DROP TABLE memory_01069.mt;
|
||||
SELECT * FROM memory_01069.mt ORDER BY n; -- { serverError 60 }
|
||||
SELECT * FROM memory_01069.file ORDER BY n;
|
||||
|
||||
SHOW CREATE TABLE memory_01069.mt; -- { serverError 60 }
|
||||
SHOW CREATE TABLE memory_01069.file;
|
||||
|
||||
DROP DATABASE memory_01069;
|
||||
|
Loading…
Reference in New Issue
Block a user