2011-08-15 01:12:57 +00:00
|
|
|
|
#pragma once
|
2010-03-04 19:20:28 +00:00
|
|
|
|
|
2015-09-29 19:19:54 +00:00
|
|
|
|
#include <common/logger_useful.h>
|
2013-02-05 09:52:13 +00:00
|
|
|
|
|
2010-05-21 19:52:50 +00:00
|
|
|
|
#include <DB/Core/Defines.h>
|
2011-08-09 15:57:33 +00:00
|
|
|
|
#include <DB/Core/Names.h>
|
2011-08-15 02:24:44 +00:00
|
|
|
|
#include <DB/Core/NamesAndTypes.h>
|
2015-10-05 01:35:28 +00:00
|
|
|
|
#include <DB/Common/Exception.h>
|
2012-05-22 18:32:45 +00:00
|
|
|
|
#include <DB/Core/QueryProcessingStage.h>
|
2011-08-15 01:12:57 +00:00
|
|
|
|
#include <DB/Parsers/IAST.h>
|
2013-08-07 13:07:42 +00:00
|
|
|
|
#include <DB/Parsers/ASTAlterQuery.h>
|
2013-02-01 19:02:04 +00:00
|
|
|
|
#include <DB/Interpreters/Settings.h>
|
2014-03-19 10:45:13 +00:00
|
|
|
|
#include <DB/Storages/ITableDeclaration.h>
|
2014-07-11 08:12:03 +00:00
|
|
|
|
#include <DB/Storages/AlterCommands.h>
|
2013-02-05 09:52:13 +00:00
|
|
|
|
#include <Poco/File.h>
|
2014-03-19 10:45:13 +00:00
|
|
|
|
#include <Poco/RWLock.h>
|
2015-02-10 21:10:58 +00:00
|
|
|
|
#include <memory>
|
2016-04-04 20:08:13 +00:00
|
|
|
|
#include <experimental/optional>
|
2013-01-23 17:38:03 +00:00
|
|
|
|
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2016-01-11 21:46:36 +00:00
|
|
|
|
namespace ErrorCodes
|
|
|
|
|
{
|
|
|
|
|
extern const int TABLE_IS_DROPPED;
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-17 07:01:31 +00:00
|
|
|
|
class Context;
|
2014-03-19 10:45:13 +00:00
|
|
|
|
class IBlockInputStream;
|
|
|
|
|
class IBlockOutputStream;
|
|
|
|
|
|
2016-05-28 12:22:22 +00:00
|
|
|
|
using BlockOutputStreamPtr = std::shared_ptr<IBlockOutputStream>;
|
|
|
|
|
using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>;
|
2016-05-28 10:15:36 +00:00
|
|
|
|
using BlockInputStreams = std::vector<BlockInputStreamPtr>;
|
2013-06-17 07:01:31 +00:00
|
|
|
|
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
2014-03-24 13:24:47 +00:00
|
|
|
|
class IStorage;
|
|
|
|
|
|
2016-05-28 10:15:36 +00:00
|
|
|
|
using StoragePtr = std::shared_ptr<IStorage>;
|
2014-03-24 13:24:47 +00:00
|
|
|
|
|
|
|
|
|
|
2010-03-01 16:59:51 +00:00
|
|
|
|
/** Хранилище. Отвечает за:
|
|
|
|
|
* - хранение данных таблицы;
|
|
|
|
|
* - определение, в каком файле (или не файле) хранятся данные;
|
|
|
|
|
* - поиск данных и обновление данных;
|
|
|
|
|
* - структура хранения данных (сжатие, etc.)
|
|
|
|
|
* - конкуррентный доступ к данным (блокировки, etc.)
|
|
|
|
|
*/
|
2016-08-26 21:25:05 +00:00
|
|
|
|
class IStorage : public std::enable_shared_from_this<IStorage>, private boost::noncopyable, public ITableDeclaration
|
2010-03-01 16:59:51 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2014-03-09 17:36:01 +00:00
|
|
|
|
/// Основное имя типа таблицы (например, StorageMergeTree).
|
2010-03-04 19:20:28 +00:00
|
|
|
|
virtual std::string getName() const = 0;
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
2015-03-15 08:05:28 +00:00
|
|
|
|
/** Возвращает true, если хранилище получает данные с удалённого сервера или серверов. */
|
2012-10-30 20:15:07 +00:00
|
|
|
|
virtual bool isRemote() const { return false; }
|
|
|
|
|
|
2015-03-15 08:05:28 +00:00
|
|
|
|
/** Возвращает true, если хранилище поддерживает запросы с секцией SAMPLE. */
|
2012-12-12 14:25:55 +00:00
|
|
|
|
virtual bool supportsSampling() const { return false; }
|
|
|
|
|
|
2015-03-15 08:05:28 +00:00
|
|
|
|
/** Возвращает true, если хранилище поддерживает запросы с секцией FINAL. */
|
2013-04-23 11:08:41 +00:00
|
|
|
|
virtual bool supportsFinal() const { return false; }
|
2014-10-18 19:14:09 +00:00
|
|
|
|
|
2015-03-15 08:05:28 +00:00
|
|
|
|
/** Возвращает true, если хранилище поддерживает запросы с секцией PREWHERE. */
|
2013-11-28 13:16:46 +00:00
|
|
|
|
virtual bool supportsPrewhere() const { return false; }
|
|
|
|
|
|
2015-03-15 08:05:28 +00:00
|
|
|
|
/** Возвращает true, если хранилище поддерживает несколько реплик. */
|
2015-01-16 15:22:12 +00:00
|
|
|
|
virtual bool supportsParallelReplicas() const { return false; }
|
|
|
|
|
|
2014-03-19 10:45:13 +00:00
|
|
|
|
/** Не дает изменять описание таблицы (в том числе переименовывать и удалять таблицу).
|
|
|
|
|
* Если в течение какой-то операции структура таблицы должна оставаться неизменной, нужно держать такой лок на все ее время.
|
|
|
|
|
* Например, нужно держать такой лок на время всего запроса SELECT или INSERT и на все время слияния набора кусков
|
2014-03-24 13:24:47 +00:00
|
|
|
|
* (но между выбором кусков для слияния и их слиянием структура таблицы может измениться).
|
2014-03-19 10:45:13 +00:00
|
|
|
|
* NOTE: Это лок на "чтение" описания таблицы. Чтобы изменить описание таблицы, нужно взять TableStructureWriteLock.
|
|
|
|
|
*/
|
|
|
|
|
class TableStructureReadLock
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
friend class IStorage;
|
|
|
|
|
|
2014-03-24 13:24:47 +00:00
|
|
|
|
StoragePtr storage;
|
2014-03-19 10:45:13 +00:00
|
|
|
|
/// Порядок важен.
|
2016-04-04 20:08:13 +00:00
|
|
|
|
std::experimental::optional<Poco::ScopedReadRWLock> data_lock;
|
|
|
|
|
std::experimental::optional<Poco::ScopedReadRWLock> structure_lock;
|
|
|
|
|
|
2016-05-28 10:15:36 +00:00
|
|
|
|
public:
|
2016-04-04 20:08:13 +00:00
|
|
|
|
TableStructureReadLock(StoragePtr storage_, bool lock_structure, bool lock_data) : storage(storage_)
|
|
|
|
|
{
|
|
|
|
|
if (lock_data)
|
|
|
|
|
data_lock.emplace(storage->data_lock);
|
|
|
|
|
if (lock_structure)
|
|
|
|
|
structure_lock.emplace(storage->structure_lock);
|
|
|
|
|
}
|
2014-03-19 10:45:13 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-05-28 10:15:36 +00:00
|
|
|
|
using TableStructureReadLockPtr = std::shared_ptr<TableStructureReadLock>;
|
|
|
|
|
using TableStructureReadLocks = std::vector<TableStructureReadLockPtr>;
|
2014-03-19 10:45:13 +00:00
|
|
|
|
|
|
|
|
|
/** Не дает изменять структуру или имя таблицы.
|
|
|
|
|
* Если в рамках этого лока будут изменены данные в таблице, нужно указать will_modify_data=true.
|
|
|
|
|
* Это возьмет дополнительный лок, не позволяющий начать ALTER MODIFY.
|
|
|
|
|
*
|
|
|
|
|
* WARNING: Вызывать методы из ITableDeclaration нужно под такой блокировкой. Без нее они не thread safe.
|
|
|
|
|
* WARNING: Чтобы не было дедлоков, нельзя вызывать это метод при захваченном мьютексе в Context.
|
|
|
|
|
*/
|
|
|
|
|
TableStructureReadLockPtr lockStructure(bool will_modify_data)
|
|
|
|
|
{
|
2016-08-26 21:25:05 +00:00
|
|
|
|
TableStructureReadLockPtr res = std::make_shared<TableStructureReadLock>(shared_from_this(), true, will_modify_data);
|
2014-03-20 10:59:45 +00:00
|
|
|
|
if (is_dropped)
|
|
|
|
|
throw Exception("Table is dropped", ErrorCodes::TABLE_IS_DROPPED);
|
|
|
|
|
return res;
|
2014-03-19 10:45:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-05-28 10:15:36 +00:00
|
|
|
|
using TableStructureWriteLockPtr = std::unique_ptr<Poco::ScopedWriteRWLock>;
|
|
|
|
|
using TableDataWriteLockPtr = std::unique_ptr<Poco::ScopedWriteRWLock>;
|
|
|
|
|
using TableFullWriteLockPtr = std::pair<TableDataWriteLockPtr, TableStructureWriteLockPtr>;
|
2014-03-19 10:45:13 +00:00
|
|
|
|
|
|
|
|
|
/** Не дает читать структуру таблицы. Берется для ALTER, RENAME и DROP.
|
|
|
|
|
*/
|
2014-03-20 13:00:42 +00:00
|
|
|
|
TableFullWriteLockPtr lockForAlter()
|
2014-03-20 10:59:45 +00:00
|
|
|
|
{
|
2015-04-07 21:24:05 +00:00
|
|
|
|
/// Порядок вычисления важен.
|
|
|
|
|
auto data_lock = lockDataForAlter();
|
|
|
|
|
auto structure_lock = lockStructureForAlter();
|
|
|
|
|
|
|
|
|
|
return {std::move(data_lock), std::move(structure_lock)};
|
2014-03-20 10:59:45 +00:00
|
|
|
|
}
|
2014-03-19 10:45:13 +00:00
|
|
|
|
|
|
|
|
|
/** Не дает изменять данные в таблице. (Более того, не дает посмотреть на структуру таблицы с намерением изменить данные).
|
|
|
|
|
* Берется на время записи временных данных в ALTER MODIFY.
|
|
|
|
|
* Под этим локом можно брать lockStructureForAlter(), чтобы изменить структуру таблицы.
|
|
|
|
|
*/
|
2014-03-20 10:59:45 +00:00
|
|
|
|
TableDataWriteLockPtr lockDataForAlter()
|
|
|
|
|
{
|
2015-02-10 21:10:58 +00:00
|
|
|
|
auto res = std::make_unique<Poco::ScopedWriteRWLock>(data_lock);
|
2014-03-20 10:59:45 +00:00
|
|
|
|
if (is_dropped)
|
|
|
|
|
throw Exception("Table is dropped", ErrorCodes::TABLE_IS_DROPPED);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
2014-03-19 10:45:13 +00:00
|
|
|
|
|
2014-03-20 13:00:42 +00:00
|
|
|
|
TableStructureWriteLockPtr lockStructureForAlter()
|
|
|
|
|
{
|
2015-02-10 21:10:58 +00:00
|
|
|
|
auto res = std::make_unique<Poco::ScopedWriteRWLock>(structure_lock);
|
2014-03-20 13:00:42 +00:00
|
|
|
|
if (is_dropped)
|
|
|
|
|
throw Exception("Table is dropped", ErrorCodes::TABLE_IS_DROPPED);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-19 10:45:13 +00:00
|
|
|
|
|
2010-03-04 19:20:28 +00:00
|
|
|
|
/** Читать набор столбцов из таблицы.
|
|
|
|
|
* Принимает список столбцов, которых нужно прочитать, а также описание запроса,
|
|
|
|
|
* из которого может быть извлечена информация о том, каким способом извлекать данные
|
|
|
|
|
* (индексы, блокировки и т. п.)
|
2012-01-09 19:20:48 +00:00
|
|
|
|
* Возвращает поток с помощью которого можно последовательно читать данные
|
|
|
|
|
* или несколько потоков для параллельного чтения данных.
|
2012-05-22 18:32:45 +00:00
|
|
|
|
* Также в processed_stage записывается, до какой стадии запрос был обработан.
|
|
|
|
|
* (Обычно функция только читает столбцы из списка, но в других случаях,
|
|
|
|
|
* например, запрос может быть частично обработан на удалённом сервере.)
|
2012-01-09 19:20:48 +00:00
|
|
|
|
*
|
2013-02-01 19:02:04 +00:00
|
|
|
|
* settings - настройки на один запрос.
|
|
|
|
|
* Обычно Storage не заботится об этих настройках, так как они применяются в интерпретаторе.
|
|
|
|
|
* Но, например, при распределённой обработке запроса, настройки передаются на удалённый сервер.
|
|
|
|
|
*
|
2012-05-30 04:45:49 +00:00
|
|
|
|
* threads - рекомендация, сколько потоков возвращать,
|
|
|
|
|
* если хранилище может возвращать разное количество потоков.
|
2014-03-19 10:45:13 +00:00
|
|
|
|
*
|
|
|
|
|
* Гарантируется, что структура таблицы не изменится за время жизни возвращенных потоков (то есть не будет ALTER, RENAME и DROP).
|
2010-03-01 16:59:51 +00:00
|
|
|
|
*/
|
2012-01-09 19:20:48 +00:00
|
|
|
|
virtual BlockInputStreams read(
|
2011-08-09 15:57:33 +00:00
|
|
|
|
const Names & column_names,
|
2011-08-15 01:12:57 +00:00
|
|
|
|
ASTPtr query,
|
2014-12-17 11:53:17 +00:00
|
|
|
|
const Context & context,
|
2013-02-01 19:02:04 +00:00
|
|
|
|
const Settings & settings,
|
2012-05-22 18:32:45 +00:00
|
|
|
|
QueryProcessingStage::Enum & processed_stage,
|
2012-01-09 19:20:48 +00:00
|
|
|
|
size_t max_block_size = DEFAULT_BLOCK_SIZE,
|
2012-05-30 04:45:49 +00:00
|
|
|
|
unsigned threads = 1)
|
2010-03-04 19:20:28 +00:00
|
|
|
|
{
|
2013-06-17 07:01:31 +00:00
|
|
|
|
throw Exception("Method read is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
2010-03-04 19:20:28 +00:00
|
|
|
|
}
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
2010-03-18 19:32:14 +00:00
|
|
|
|
/** Пишет данные в таблицу.
|
|
|
|
|
* Принимает описание запроса, в котором может содержаться информация о методе записи данных.
|
|
|
|
|
* Возвращает объект, с помощью которого можно последовательно писать данные.
|
2014-03-19 10:45:13 +00:00
|
|
|
|
*
|
|
|
|
|
* Гарантируется, что структура таблицы не изменится за время жизни возвращенных потоков (то есть не будет ALTER, RENAME и DROP).
|
2010-03-18 19:32:14 +00:00
|
|
|
|
*/
|
2011-08-28 02:22:23 +00:00
|
|
|
|
virtual BlockOutputStreamPtr write(
|
2015-09-10 20:43:42 +00:00
|
|
|
|
ASTPtr query,
|
|
|
|
|
const Settings & settings)
|
2010-03-18 19:32:14 +00:00
|
|
|
|
{
|
2013-06-17 07:01:31 +00:00
|
|
|
|
throw Exception("Method write is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
2011-08-19 18:31:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-03-20 10:59:45 +00:00
|
|
|
|
/** Удалить данные таблицы. Вызывается перед удалением директории с данными.
|
2013-02-26 13:11:55 +00:00
|
|
|
|
* Если не требуется никаких действий, кроме удаления директории с данными, этот метод можно оставить пустым.
|
2013-01-23 17:38:03 +00:00
|
|
|
|
*/
|
2014-03-20 11:01:56 +00:00
|
|
|
|
virtual void drop() {}
|
2011-08-19 18:31:14 +00:00
|
|
|
|
|
2012-06-18 06:19:13 +00:00
|
|
|
|
/** Переименовать таблицу.
|
|
|
|
|
* Переименование имени в файле с метаданными, имени в списке таблиц в оперативке, осуществляется отдельно.
|
|
|
|
|
* В этой функции нужно переименовать директорию с данными, если она есть.
|
2014-03-19 10:45:13 +00:00
|
|
|
|
* Вызывается при заблокированной на запись структуре таблицы.
|
2012-06-18 06:19:13 +00:00
|
|
|
|
*/
|
2014-07-28 14:33:05 +00:00
|
|
|
|
virtual void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name)
|
2012-06-18 06:19:13 +00:00
|
|
|
|
{
|
2013-06-17 07:01:31 +00:00
|
|
|
|
throw Exception("Method rename is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
2012-06-18 06:19:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-19 18:31:14 +00:00
|
|
|
|
/** ALTER таблицы в виде изменения столбцов, не затрагивающий изменение Storage или его параметров.
|
2014-07-11 08:12:03 +00:00
|
|
|
|
* Этот метод должен полностью выполнить запрос ALTER, самостоятельно заботясь о блокировках.
|
|
|
|
|
* Для обновления метаданных таблицы на диске этот метод должен вызвать InterpreterAlterQuery::updateMetadata.
|
2011-08-19 18:31:14 +00:00
|
|
|
|
*/
|
2016-01-28 01:00:27 +00:00
|
|
|
|
virtual void alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context)
|
2011-08-19 18:31:14 +00:00
|
|
|
|
{
|
2013-06-17 07:01:31 +00:00
|
|
|
|
throw Exception("Method alter is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
2010-03-18 19:32:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-07 11:46:01 +00:00
|
|
|
|
/** Выполнить запрос (DROP|DETACH) PARTITION.
|
2014-08-06 09:24:30 +00:00
|
|
|
|
*/
|
2015-10-02 21:28:19 +00:00
|
|
|
|
virtual void dropPartition(ASTPtr query, const Field & partition, bool detach, bool unreplicated, const Settings & settings)
|
2014-08-06 09:24:30 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Method dropPartition is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-07 11:46:01 +00:00
|
|
|
|
/** Выполнить запрос ATTACH [UNREPLICATED] (PART|PARTITION).
|
|
|
|
|
*/
|
2015-10-02 21:28:19 +00:00
|
|
|
|
virtual void attachPartition(ASTPtr query, const Field & partition, bool unreplicated, bool part, const Settings & settings)
|
2014-08-07 11:46:01 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Method attachPartition is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-18 19:14:09 +00:00
|
|
|
|
/** Выполнить запрос FETCH PARTITION.
|
2014-10-09 20:28:33 +00:00
|
|
|
|
*/
|
2014-10-18 19:14:09 +00:00
|
|
|
|
virtual void fetchPartition(const Field & partition, const String & from, const Settings & settings)
|
2014-10-09 20:28:33 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Method fetchPartition is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-11 04:11:07 +00:00
|
|
|
|
/** Выполнить запрос FREEZE PARTITION. То есть, создать локальный бэкап (снэпшот) данных с помощью функции localBackup (см. localBackup.h)
|
|
|
|
|
*/
|
2016-06-28 20:50:37 +00:00
|
|
|
|
virtual void freezePartition(const Field & partition, const String & with_name, const Settings & settings)
|
2014-11-11 04:11:07 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Method freezePartition is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-28 01:00:27 +00:00
|
|
|
|
/** Выполнить запрос RESHARD PARTITION.
|
|
|
|
|
*/
|
2016-03-01 17:47:53 +00:00
|
|
|
|
virtual void reshardPartitions(ASTPtr query, const String & database_name,
|
|
|
|
|
const Field & first_partition, const Field & last_partition,
|
|
|
|
|
const WeightedZooKeeperPaths & weighted_zookeeper_paths,
|
2016-03-25 11:48:45 +00:00
|
|
|
|
const ASTPtr & sharding_key_expr, bool do_copy, const Field & coordinator,
|
2016-01-28 01:00:27 +00:00
|
|
|
|
const Settings & settings)
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Method reshardPartition is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
|
}
|
|
|
|
|
|
2012-07-16 20:25:19 +00:00
|
|
|
|
/** Выполнить какую-либо фоновую работу. Например, объединение кусков в таблице типа MergeTree.
|
2012-07-31 16:37:20 +00:00
|
|
|
|
* Возвращает - была ли выполнена какая-либо работа.
|
2012-07-16 20:25:19 +00:00
|
|
|
|
*/
|
2016-05-16 18:43:38 +00:00
|
|
|
|
virtual bool optimize(const String & partition, bool final, const Settings & settings)
|
2012-07-16 20:25:19 +00:00
|
|
|
|
{
|
2015-04-14 14:58:59 +00:00
|
|
|
|
throw Exception("Method optimize is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
2012-07-16 20:25:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-09-30 01:29:19 +00:00
|
|
|
|
/** Если при уничтожении объекта надо сделать какую-то сложную работу - сделать её заранее.
|
|
|
|
|
* Например, если таблица содержит какие-нибудь потоки для фоновой работы - попросить их завершиться и дождаться завершения.
|
|
|
|
|
* По-умолчанию - ничего не делать.
|
2014-03-20 10:59:45 +00:00
|
|
|
|
* Может вызываться одновременно из разных потоков, даже после вызова drop().
|
2013-09-30 01:29:19 +00:00
|
|
|
|
*/
|
|
|
|
|
virtual void shutdown() {}
|
2014-03-20 10:59:45 +00:00
|
|
|
|
|
2014-09-30 03:08:47 +00:00
|
|
|
|
bool is_dropped{false};
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
2014-04-12 15:49:36 +00:00
|
|
|
|
/// Поддерживается ли индекс в секции IN
|
2016-05-16 18:43:38 +00:00
|
|
|
|
virtual bool supportsIndexForIn() const { return false; }
|
2014-04-10 08:57:01 +00:00
|
|
|
|
|
2014-07-31 13:39:23 +00:00
|
|
|
|
/// проверяет валидность данных
|
|
|
|
|
virtual bool checkData() const { throw DB::Exception("Check query is not supported for " + getName() + " storage"); }
|
|
|
|
|
|
2013-02-06 11:26:35 +00:00
|
|
|
|
protected:
|
2014-09-30 03:08:47 +00:00
|
|
|
|
using ITableDeclaration::ITableDeclaration;
|
2016-08-26 21:25:05 +00:00
|
|
|
|
using std::enable_shared_from_this<IStorage>::shared_from_this;
|
2014-03-09 17:36:01 +00:00
|
|
|
|
|
2013-01-23 17:38:03 +00:00
|
|
|
|
private:
|
2014-03-19 10:45:13 +00:00
|
|
|
|
/// Брать следующие два лока всегда нужно в этом порядке.
|
|
|
|
|
|
|
|
|
|
/** Берется на чтение на все время запроса INSERT и на все время слияния кусков (для MergeTree).
|
|
|
|
|
* Берется на запись на все время ALTER MODIFY.
|
|
|
|
|
*
|
|
|
|
|
* Формально:
|
|
|
|
|
* Ввзятие на запись гарантирует, что:
|
|
|
|
|
* 1) данные в таблице не изменится, пока лок жив,
|
|
|
|
|
* 2) все изменения данных после отпускания лока будут основаны на структуре таблицы на момент после отпускания лока.
|
|
|
|
|
* Нужно брать на чтение на все время операции, изменяющей данные.
|
|
|
|
|
*/
|
|
|
|
|
mutable Poco::RWLock data_lock;
|
|
|
|
|
|
|
|
|
|
/** Лок для множества столбцов и пути к таблице. Берется на запись в RENAME, ALTER (для ALTER MODIFY ненадолго) и DROP.
|
|
|
|
|
* Берется на чтение на все время SELECT, INSERT и слияния кусков (для MergeTree).
|
|
|
|
|
*
|
|
|
|
|
* Взятие этого лока на запись - строго более "сильная" операция, чем взятие parts_writing_lock на запись.
|
|
|
|
|
* То есть, если этот лок взят на запись, о parts_writing_lock можно не заботиться.
|
|
|
|
|
* parts_writing_lock нужен только для случаев, когда не хочется брать table_structure_lock надолго (ALTER MODIFY).
|
|
|
|
|
*/
|
|
|
|
|
mutable Poco::RWLock structure_lock;
|
2013-01-23 17:38:03 +00:00
|
|
|
|
};
|
2010-03-01 16:59:51 +00:00
|
|
|
|
|
2015-09-04 20:52:00 +00:00
|
|
|
|
using StorageVector = std::vector<StoragePtr>;
|
|
|
|
|
using TableLocks = IStorage::TableStructureReadLocks;
|
|
|
|
|
|
|
|
|
|
/// имя таблицы -> таблица
|
|
|
|
|
using Tables = std::map<String, StoragePtr>;
|
|
|
|
|
|
2011-08-15 01:12:57 +00:00
|
|
|
|
}
|