2014-07-11 08:10:45 +00:00
|
|
|
|
#pragma once
|
2014-10-16 13:37:01 +00:00
|
|
|
|
|
2014-07-11 08:10:45 +00:00
|
|
|
|
#include <DB/Core/NamesAndTypes.h>
|
2014-10-16 13:37:01 +00:00
|
|
|
|
#include <DB/Storages/ColumnDefault.h>
|
2014-07-11 08:10:45 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2014-09-12 00:32:27 +00:00
|
|
|
|
/// Операция из запроса ALTER (кроме манипуляции с PART/PARTITION). Добавление столбцов типа Nested не развернуто в добавление отдельных столбцов.
|
2014-07-11 08:10:45 +00:00
|
|
|
|
struct AlterCommand
|
|
|
|
|
{
|
|
|
|
|
enum Type
|
|
|
|
|
{
|
2016-05-05 18:28:46 +00:00
|
|
|
|
ADD_COLUMN,
|
|
|
|
|
DROP_COLUMN,
|
|
|
|
|
MODIFY_COLUMN,
|
|
|
|
|
MODIFY_PRIMARY_KEY,
|
2014-07-11 08:10:45 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Type type;
|
|
|
|
|
|
|
|
|
|
String column_name;
|
|
|
|
|
|
|
|
|
|
/// Для ADD и MODIFY - новый тип столбца.
|
|
|
|
|
DataTypePtr data_type;
|
|
|
|
|
|
2014-10-16 13:37:01 +00:00
|
|
|
|
ColumnDefaultType default_type{};
|
|
|
|
|
ASTPtr default_expression{};
|
|
|
|
|
|
2014-07-11 08:10:45 +00:00
|
|
|
|
/// Для ADD - после какого столбца добавить новый. Если пустая строка, добавить в конец. Добавить в начало сейчас нельзя.
|
|
|
|
|
String after_column;
|
|
|
|
|
|
2016-05-05 18:28:46 +00:00
|
|
|
|
/// Для MODIFY_PRIMARY_KEY
|
|
|
|
|
ASTPtr primary_key;
|
2014-07-11 08:10:45 +00:00
|
|
|
|
|
|
|
|
|
/// одинаковыми считаются имена, если они совпадают целиком или name_without_dot совпадает с частью имени до точки
|
|
|
|
|
static bool namesEqual(const String & name_without_dot, const DB::NameAndTypePair & name_type)
|
|
|
|
|
{
|
|
|
|
|
String name_with_dot = name_without_dot + ".";
|
|
|
|
|
return (name_with_dot == name_type.name.substr(0, name_without_dot.length() + 1) || name_without_dot == name_type.name);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-16 13:37:01 +00:00
|
|
|
|
void apply(NamesAndTypesList & columns,
|
|
|
|
|
NamesAndTypesList & materialized_columns,
|
|
|
|
|
NamesAndTypesList & alias_columns,
|
|
|
|
|
ColumnDefaults & column_defaults) const;
|
2014-10-21 12:11:20 +00:00
|
|
|
|
|
|
|
|
|
AlterCommand() = default;
|
|
|
|
|
AlterCommand(const Type type, const String & column_name, const DataTypePtr & data_type,
|
|
|
|
|
const ColumnDefaultType default_type, const ASTPtr & default_expression,
|
|
|
|
|
const String & after_column = String{})
|
|
|
|
|
: type{type}, column_name{column_name}, data_type{data_type}, default_type{default_type},
|
|
|
|
|
default_expression{default_expression}, after_column{after_column}
|
|
|
|
|
{}
|
2014-07-11 08:10:45 +00:00
|
|
|
|
};
|
|
|
|
|
|
2014-10-21 12:11:20 +00:00
|
|
|
|
class IStorage;
|
|
|
|
|
class Context;
|
|
|
|
|
|
2014-07-11 08:10:45 +00:00
|
|
|
|
class AlterCommands : public std::vector<AlterCommand>
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-10-16 13:37:01 +00:00
|
|
|
|
void apply(NamesAndTypesList & columns,
|
|
|
|
|
NamesAndTypesList & materialized_columns,
|
|
|
|
|
NamesAndTypesList & alias_columns,
|
|
|
|
|
ColumnDefaults & column_defaults) const;
|
2014-10-21 12:11:20 +00:00
|
|
|
|
|
|
|
|
|
void validate(IStorage * table, const Context & context);
|
2014-07-11 08:10:45 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|