mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 21:20:49 +00:00
Added constraints to InterpreterCreateQuery and storages
This commit is contained in:
parent
f24bedd2b8
commit
502d86bd02
@ -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)
|
||||
|
@ -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_)
|
||||
{
|
||||
|
39
dbms/src/Storages/ConstraintsDescription.cpp
Normal file
39
dbms/src/Storages/ConstraintsDescription.cpp
Normal 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;
|
||||
}
|
||||
|
||||
}
|
23
dbms/src/Storages/ConstraintsDescription.h
Normal file
23
dbms/src/Storages/ConstraintsDescription.h
Normal 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);
|
||||
};
|
||||
|
||||
}
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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); }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user