Added constraints to InterpreterCreateQuery and storages

This commit is contained in:
Gleb Novikov 2019-05-17 07:08:03 +03:00
parent f24bedd2b8
commit 502d86bd02
7 changed files with 100 additions and 0 deletions

View File

@ -252,6 +252,16 @@ ASTPtr InterpreterCreateQuery::formatIndices(const IndicesDescription & indices)
return res;
}
ASTPtr InterpreterCreateQuery::formatConstraints(const ConstraintsDescription & constraints)
{
auto res = std::make_shared<ASTExpressionList>();
for (const auto & constraint : constraints.constraints)
res->children.push_back(constraint->clone());
return res;
}
ColumnsDescription InterpreterCreateQuery::getColumnsDescription(const ASTExpressionList & columns_ast, const Context & context)
{
/// First, deduce implicit types.
@ -370,6 +380,8 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
{
ColumnsDescription columns;
IndicesDescription indices;
ConstraintsDescription constraints;
if (create.columns_list)
{
@ -379,11 +391,16 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
for (const auto & index : create.columns_list->indices->children)
indices.indices.push_back(
std::dynamic_pointer_cast<ASTIndexDeclaration>(index->clone()));
if (create.columns_list->constraints)
for (const auto & constraint : create.columns_list->constraints->children)
constraints.constraints.push_back(
std::dynamic_pointer_cast<ASTConstraintDeclaration>(constraint->clone()));
}
else if (!create.as_table.empty())
{
columns = as_storage->getColumns();
indices = as_storage->getIndicesDescription();
constraints = as_storage->getConstraintsDescription();
}
else if (create.select)
{
@ -395,6 +412,7 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
/// Even if query has list of columns, canonicalize it (unfold Nested columns).
ASTPtr new_columns = formatColumns(columns);
ASTPtr new_indices = formatIndices(indices);
ASTPtr new_constraints = formatConstraints(constraints);
if (!create.columns_list)
{
@ -412,6 +430,11 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
else if (new_indices)
create.columns_list->set(create.columns_list->indices, new_indices);
if (new_constraints && create.columns_list->constraints)
create.columns_list->replace(create.columns_list->constraints, new_constraints);
else if (new_constraints)
create.columns_list->set(create.columns_list->constraints, new_constraints);
/// Check for duplicates
std::set<String> all_columns;
for (const auto & column : columns)

View File

@ -3,6 +3,7 @@
#include <Interpreters/IInterpreter.h>
#include <Storages/ColumnsDescription.h>
#include <Storages/IndicesDescription.h>
#include <Storages/ConstraintsDescription.h>
#include <Common/ThreadPool.h>
@ -31,6 +32,7 @@ public:
static ASTPtr formatColumns(const ColumnsDescription & columns);
static ASTPtr formatIndices(const IndicesDescription & indices);
static ASTPtr formatConstraints(const ConstraintsDescription & constraints);
void setDatabaseLoadingThreadpool(ThreadPool & thread_pool_)
{

View File

@ -0,0 +1,39 @@
#include <Storages/ConstraintsDescription.h>
#include <Parsers/formatAST.h>
#include <Parsers/ParserCreateQuery.h>
#include <Parsers/parseQuery.h>
#include <Parsers/ASTExpressionList.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);
for (const auto & constraint : list->children)
res.constraints.push_back(std::dynamic_pointer_cast<ASTConstraintDeclaration>(constraint));
return res;
}
}

View File

@ -0,0 +1,23 @@
#pragma once
#include <Parsers/ASTConstraintDeclaration.h>
namespace DB
{
using ConstraintsASTs = std::vector<std::shared_ptr<ASTConstraintDeclaration>>;
struct ConstraintsDescription
{
ConstraintsASTs constraints;
ConstraintsDescription() = default;
bool empty() const { return constraints.empty(); }
String toString() const;
static ConstraintsDescription parse(const String & str);
};
}

View File

@ -36,6 +36,11 @@ void ITableDeclaration::setIndicesDescription(IndicesDescription indices_)
indices = std::move(indices_);
}
void ITableDeclaration::setConstraintsDescription(ConstraintsDescription constraints_)
{
constraints = std::move(constraints_);
}
bool ITableDeclaration::hasColumn(const String & column_name) const
{

View File

@ -2,6 +2,7 @@
#include <Storages/ColumnsDescription.h>
#include <Storages/IndicesDescription.h>
#include <Storages/ConstraintsDescription.h>
namespace DB
@ -19,6 +20,9 @@ public:
virtual const IndicesDescription & getIndicesDescription() const { return indices; }
virtual void setIndicesDescription(IndicesDescription indices_);
virtual const ConstraintsDescription & getConstraintsDescription() const { return constraints; }
virtual void setConstraintsDescription(ConstraintsDescription constraints_);
/// NOTE: These methods should include virtual columns, but should NOT include ALIAS columns
/// (they are treated separately).
virtual NameAndTypePair getColumn(const String & column_name) const;
@ -57,6 +61,7 @@ public:
private:
ColumnsDescription columns;
IndicesDescription indices;
ConstraintsDescription constraints;
};
}

View File

@ -46,6 +46,9 @@ public:
virtual const IndicesDescription & getIndicesDescription() const override { return data.getIndicesDescription(); }
virtual void setIndicesDescription(IndicesDescription indices_) override { data.setIndicesDescription(std::move(indices_)); }
virtual const ConstraintsDescription & getConstraintsDescription() const override { return data.getConstraintsDescription(); }
virtual void setConstraintsDescription(ConstraintsDescription constraints_) override { data.setConstraintsDescription(constraints_; )}
NameAndTypePair getColumn(const String & column_name) const override { return data.getColumn(column_name); }
bool hasColumn(const String & column_name) const override { return data.hasColumn(column_name); }