2012-12-24 19:50:22 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <Poco/Timespan.h>
|
|
|
|
|
#include <DB/Core/Defines.h>
|
|
|
|
|
#include <DB/Core/Field.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** Ограничения при выполнении запроса - часть настроек.
|
|
|
|
|
* Используются, чтобы обеспечить более безопасное исполнение запросов из пользовательского интерфейса.
|
|
|
|
|
* В основном, ограничения проверяются на каждый блок (а не на каждую строку). То есть, ограничения могут быть немного нарушены.
|
|
|
|
|
* Почти все ограничения действуют только на SELECT-ы.
|
2012-12-25 19:28:59 +00:00
|
|
|
|
* Почти все ограничения действуют на каждый поток по отдельности.
|
2012-12-24 19:50:22 +00:00
|
|
|
|
*/
|
|
|
|
|
struct Limits
|
|
|
|
|
{
|
|
|
|
|
/// Что делать, если ограничение превышено.
|
|
|
|
|
enum OverflowMode
|
|
|
|
|
{
|
2013-02-01 19:02:04 +00:00
|
|
|
|
THROW = 0, /// Кинуть исключение.
|
|
|
|
|
BREAK = 1, /// Прервать выполнение запроса, вернуть что есть.
|
|
|
|
|
ANY = 2, /** Только для GROUP BY: не добавлять новые строки в набор,
|
|
|
|
|
* но продолжать агрегировать для ключей, успевших попасть в набор.
|
|
|
|
|
*/
|
2012-12-24 19:50:22 +00:00
|
|
|
|
};
|
|
|
|
|
|
2012-12-25 20:36:35 +00:00
|
|
|
|
/** Ограничения на чтение из самых "глубоких" источников.
|
|
|
|
|
* То есть, только в самом глубоком подзапросе.
|
|
|
|
|
* При чтении с удалённого сервера, проверяется только на удалённом сервере.
|
|
|
|
|
*/
|
2012-12-24 19:50:22 +00:00
|
|
|
|
size_t max_rows_to_read;
|
|
|
|
|
size_t max_bytes_to_read;
|
|
|
|
|
OverflowMode read_overflow_mode;
|
|
|
|
|
|
|
|
|
|
size_t max_rows_to_group_by;
|
|
|
|
|
OverflowMode group_by_overflow_mode;
|
|
|
|
|
|
|
|
|
|
size_t max_rows_to_sort;
|
|
|
|
|
size_t max_bytes_to_sort;
|
|
|
|
|
OverflowMode sort_overflow_mode;
|
|
|
|
|
|
2012-12-25 20:36:35 +00:00
|
|
|
|
/** Ограничение на размер результата.
|
|
|
|
|
* Проверяются также для подзапросов и на удалённых серверах.
|
|
|
|
|
*/
|
2012-12-24 19:50:22 +00:00
|
|
|
|
size_t max_result_rows;
|
|
|
|
|
size_t max_result_bytes;
|
|
|
|
|
OverflowMode result_overflow_mode;
|
|
|
|
|
|
2012-12-25 20:36:35 +00:00
|
|
|
|
Poco::Timespan max_execution_time; // TODO: Проверять также при merge стадии сортировки, при слиянии и финализации агрегатных функций.
|
2012-12-24 19:50:22 +00:00
|
|
|
|
OverflowMode timeout_overflow_mode;
|
|
|
|
|
|
|
|
|
|
size_t min_execution_speed; /// В строчках в секунду.
|
|
|
|
|
Poco::Timespan timeout_before_checking_execution_speed; /// Проверять, что скорость не слишком низкая, после прошествия указанного времени.
|
|
|
|
|
|
|
|
|
|
size_t max_columns_to_read;
|
2012-12-26 20:29:28 +00:00
|
|
|
|
size_t max_temporary_columns;
|
|
|
|
|
size_t max_temporary_non_const_columns;
|
2012-12-24 19:50:22 +00:00
|
|
|
|
|
|
|
|
|
size_t max_subquery_depth;
|
|
|
|
|
size_t max_pipeline_depth;
|
2012-12-26 20:29:28 +00:00
|
|
|
|
size_t max_ast_depth; /// Проверяются не во время парсинга,
|
2013-06-03 13:17:17 +00:00
|
|
|
|
size_t max_ast_elements; /// а уже после парсинга запроса.
|
2012-12-24 19:50:22 +00:00
|
|
|
|
|
2012-12-25 20:36:50 +00:00
|
|
|
|
bool readonly;
|
2012-12-24 19:50:22 +00:00
|
|
|
|
|
2013-06-20 12:12:27 +00:00
|
|
|
|
/// Ограничения для максимального размера множества, получающегося при выполнении секции IN.
|
|
|
|
|
size_t max_rows_in_set;
|
|
|
|
|
size_t max_bytes_in_set;
|
|
|
|
|
OverflowMode set_overflow_mode;
|
|
|
|
|
|
|
|
|
|
/// Ограничения для максимального размера запоминаемого состояния при выполнении DISTINCT.
|
|
|
|
|
size_t max_rows_in_distinct;
|
|
|
|
|
size_t max_bytes_in_distinct;
|
|
|
|
|
OverflowMode distinct_overflow_mode;
|
|
|
|
|
|
2012-12-24 19:50:22 +00:00
|
|
|
|
/// По-умолчанию: всё не ограничено, кроме довольно слабых ограничений на глубину рекурсии и размер выражений.
|
|
|
|
|
Limits() :
|
|
|
|
|
max_rows_to_read(0), max_bytes_to_read(0), read_overflow_mode(THROW),
|
2012-12-25 19:28:59 +00:00
|
|
|
|
max_rows_to_group_by(0), group_by_overflow_mode(THROW),
|
2012-12-24 19:50:22 +00:00
|
|
|
|
max_rows_to_sort(0), max_bytes_to_sort(0), sort_overflow_mode(THROW),
|
|
|
|
|
max_result_rows(0), max_result_bytes(0), result_overflow_mode(THROW),
|
|
|
|
|
max_execution_time(0), timeout_overflow_mode(THROW),
|
|
|
|
|
min_execution_speed(0), timeout_before_checking_execution_speed(0),
|
|
|
|
|
max_columns_to_read(0), max_temporary_columns(0), max_temporary_non_const_columns(0),
|
2012-12-26 20:29:28 +00:00
|
|
|
|
max_subquery_depth(100), max_pipeline_depth(1000), max_ast_depth(1000), max_ast_elements(10000),
|
2013-06-20 12:12:27 +00:00
|
|
|
|
readonly(false),
|
|
|
|
|
max_rows_in_set(0), max_bytes_in_set(0), set_overflow_mode(THROW),
|
|
|
|
|
max_rows_in_distinct(0), max_bytes_in_distinct(0), distinct_overflow_mode(THROW)
|
2012-12-24 19:50:22 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Установить настройку по имени.
|
2013-02-01 20:29:22 +00:00
|
|
|
|
bool trySet(const String & name, const Field & value);
|
2012-12-24 19:50:22 +00:00
|
|
|
|
|
2013-02-17 19:54:32 +00:00
|
|
|
|
/// Установить настройку по имени. Прочитать сериализованное в бинарном виде значение из буфера (для межсерверного взаимодействия).
|
2013-02-01 20:29:22 +00:00
|
|
|
|
bool trySet(const String & name, ReadBuffer & buf);
|
2013-02-01 19:02:04 +00:00
|
|
|
|
|
2013-02-17 19:54:32 +00:00
|
|
|
|
/// Установить настройку по имени. Прочитать значение в текстовом виде из строки (например, из конфига, или из параметра URL).
|
|
|
|
|
bool trySet(const String & name, const String & value);
|
|
|
|
|
|
2012-12-24 19:50:22 +00:00
|
|
|
|
private:
|
2013-02-01 19:02:04 +00:00
|
|
|
|
friend class Settings;
|
|
|
|
|
|
|
|
|
|
/// Записать все настройки в буфер. (В отличие от соответствующего метода в Settings, пустая строка на конце не пишется).
|
2013-02-01 20:29:22 +00:00
|
|
|
|
void serialize(WriteBuffer & buf) const;
|
2012-12-24 19:50:22 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|