ClickHouse/src/Storages/ConstraintsDescription.cpp

58 lines
1.6 KiB
C++
Raw Normal View History

#include <Storages/ConstraintsDescription.h>
#include <Parsers/formatAST.h>
#include <Parsers/ParserCreateQuery.h>
#include <Parsers/parseQuery.h>
#include <Parsers/ASTExpressionList.h>
#include <Core/Defines.h>
namespace DB
{
String ConstraintsDescription::toString() const
{
if (constraints.empty())
return {};
ASTExpressionList list;
for (const auto & constraint : constraints)
list.children.push_back(constraint);
return serializeAST(list, true);
}
ConstraintsDescription ConstraintsDescription::parse(const String & str)
{
if (str.empty())
return {};
ConstraintsDescription res;
ParserConstraintDeclarationList parser;
ASTPtr list = parseQuery(parser, str, 0, DBMS_DEFAULT_MAX_PARSER_DEPTH);
for (const auto & constraint : list->children)
2020-05-12 11:26:44 +00:00
res.constraints.push_back(constraint);
return res;
}
2019-05-25 14:07:45 +00:00
ConstraintsExpressions ConstraintsDescription::getExpressions(const DB::Context & context,
const DB::NamesAndTypesList & source_columns_) const
{
ConstraintsExpressions res;
res.reserve(constraints.size());
for (const auto & constraint : constraints)
{
// SyntaxAnalyzer::analyze has query as non-const argument so to avoid accidental query changes we clone it
2020-05-12 16:38:11 +00:00
auto * constraint_ptr = constraint->as<ASTConstraintDeclaration>();
2020-05-12 11:26:44 +00:00
ASTPtr expr = constraint_ptr->expr->clone();
2019-05-25 14:07:45 +00:00
auto syntax_result = SyntaxAnalyzer(context).analyze(expr, source_columns_);
2020-05-12 11:26:44 +00:00
res.push_back(ExpressionAnalyzer(constraint_ptr->expr->clone(), syntax_result, context).getActions(false));
2019-05-25 14:07:45 +00:00
}
return res;
}
}