#pragma once #include #include #include namespace Poco { class Logger; } namespace DB { /** A non-persistent database to store temporary data. * It doesn't make any manipulations with filesystem. * All tables are created by calling code. * TODO: Maybe DatabaseRuntime is more suitable class name. */ class DatabaseMemory final : public DatabaseWithOwnTablesBase { public: DatabaseMemory(const String & name_, ContextPtr context); String getEngineName() const override { return "Memory"; } void createTable( ContextPtr context, const String & table_name, const StoragePtr & table, const ASTPtr & query) override; void dropTable( ContextPtr context, const String & table_name, bool no_delay) override; ASTPtr getCreateTableQueryImpl(const String & name, ContextPtr context, bool throw_on_error) const override; ASTPtr getCreateDatabaseQuery() const override; /// DatabaseMemory allows to create tables, which store data on disk. /// It's needed to create such tables in default database of clickhouse-local. /// TODO May be it's better to use DiskMemory for such tables. /// To save data on disk it's possible to explicitly CREATE DATABASE db ENGINE=Ordinary in clickhouse-local. String getTableDataPath(const String & table_name) const override { return data_path + escapeForFileName(table_name) + "/"; } String getTableDataPath(const ASTCreateQuery & query) const override { return getTableDataPath(query.getTable()); } UUID tryGetTableUUID(const String & table_name) const override; void drop(ContextPtr context) override; void alterTable(ContextPtr local_context, const StorageID & table_id, const StorageInMemoryMetadata & metadata) override; /// This database can contain tables to backup. bool hasTablesToBackup() const override { return true; } private: String data_path; using NameToASTCreate = std::unordered_map; NameToASTCreate create_queries; }; }