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;
|
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)
|
ColumnsDescription InterpreterCreateQuery::getColumnsDescription(const ASTExpressionList & columns_ast, const Context & context)
|
||||||
{
|
{
|
||||||
/// First, deduce implicit types.
|
/// First, deduce implicit types.
|
||||||
@ -370,6 +380,8 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
|
|||||||
{
|
{
|
||||||
ColumnsDescription columns;
|
ColumnsDescription columns;
|
||||||
IndicesDescription indices;
|
IndicesDescription indices;
|
||||||
|
ConstraintsDescription constraints;
|
||||||
|
|
||||||
|
|
||||||
if (create.columns_list)
|
if (create.columns_list)
|
||||||
{
|
{
|
||||||
@ -379,11 +391,16 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
|
|||||||
for (const auto & index : create.columns_list->indices->children)
|
for (const auto & index : create.columns_list->indices->children)
|
||||||
indices.indices.push_back(
|
indices.indices.push_back(
|
||||||
std::dynamic_pointer_cast<ASTIndexDeclaration>(index->clone()));
|
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())
|
else if (!create.as_table.empty())
|
||||||
{
|
{
|
||||||
columns = as_storage->getColumns();
|
columns = as_storage->getColumns();
|
||||||
indices = as_storage->getIndicesDescription();
|
indices = as_storage->getIndicesDescription();
|
||||||
|
constraints = as_storage->getConstraintsDescription();
|
||||||
}
|
}
|
||||||
else if (create.select)
|
else if (create.select)
|
||||||
{
|
{
|
||||||
@ -395,6 +412,7 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
|
|||||||
/// Even if query has list of columns, canonicalize it (unfold Nested columns).
|
/// Even if query has list of columns, canonicalize it (unfold Nested columns).
|
||||||
ASTPtr new_columns = formatColumns(columns);
|
ASTPtr new_columns = formatColumns(columns);
|
||||||
ASTPtr new_indices = formatIndices(indices);
|
ASTPtr new_indices = formatIndices(indices);
|
||||||
|
ASTPtr new_constraints = formatConstraints(constraints);
|
||||||
|
|
||||||
if (!create.columns_list)
|
if (!create.columns_list)
|
||||||
{
|
{
|
||||||
@ -412,6 +430,11 @@ ColumnsDescription InterpreterCreateQuery::setColumns(
|
|||||||
else if (new_indices)
|
else if (new_indices)
|
||||||
create.columns_list->set(create.columns_list->indices, 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
|
/// Check for duplicates
|
||||||
std::set<String> all_columns;
|
std::set<String> all_columns;
|
||||||
for (const auto & column : columns)
|
for (const auto & column : columns)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <Interpreters/IInterpreter.h>
|
#include <Interpreters/IInterpreter.h>
|
||||||
#include <Storages/ColumnsDescription.h>
|
#include <Storages/ColumnsDescription.h>
|
||||||
#include <Storages/IndicesDescription.h>
|
#include <Storages/IndicesDescription.h>
|
||||||
|
#include <Storages/ConstraintsDescription.h>
|
||||||
#include <Common/ThreadPool.h>
|
#include <Common/ThreadPool.h>
|
||||||
|
|
||||||
|
|
||||||
@ -31,6 +32,7 @@ public:
|
|||||||
static ASTPtr formatColumns(const ColumnsDescription & columns);
|
static ASTPtr formatColumns(const ColumnsDescription & columns);
|
||||||
|
|
||||||
static ASTPtr formatIndices(const IndicesDescription & indices);
|
static ASTPtr formatIndices(const IndicesDescription & indices);
|
||||||
|
static ASTPtr formatConstraints(const ConstraintsDescription & constraints);
|
||||||
|
|
||||||
void setDatabaseLoadingThreadpool(ThreadPool & thread_pool_)
|
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_);
|
indices = std::move(indices_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ITableDeclaration::setConstraintsDescription(ConstraintsDescription constraints_)
|
||||||
|
{
|
||||||
|
constraints = std::move(constraints_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ITableDeclaration::hasColumn(const String & column_name) const
|
bool ITableDeclaration::hasColumn(const String & column_name) const
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <Storages/ColumnsDescription.h>
|
#include <Storages/ColumnsDescription.h>
|
||||||
#include <Storages/IndicesDescription.h>
|
#include <Storages/IndicesDescription.h>
|
||||||
|
#include <Storages/ConstraintsDescription.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -19,6 +20,9 @@ public:
|
|||||||
virtual const IndicesDescription & getIndicesDescription() const { return indices; }
|
virtual const IndicesDescription & getIndicesDescription() const { return indices; }
|
||||||
virtual void setIndicesDescription(IndicesDescription 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
|
/// NOTE: These methods should include virtual columns, but should NOT include ALIAS columns
|
||||||
/// (they are treated separately).
|
/// (they are treated separately).
|
||||||
virtual NameAndTypePair getColumn(const String & column_name) const;
|
virtual NameAndTypePair getColumn(const String & column_name) const;
|
||||||
@ -57,6 +61,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
ColumnsDescription columns;
|
ColumnsDescription columns;
|
||||||
IndicesDescription indices;
|
IndicesDescription indices;
|
||||||
|
ConstraintsDescription constraints;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,9 @@ public:
|
|||||||
virtual const IndicesDescription & getIndicesDescription() const override { return data.getIndicesDescription(); }
|
virtual const IndicesDescription & getIndicesDescription() const override { return data.getIndicesDescription(); }
|
||||||
virtual void setIndicesDescription(IndicesDescription indices_) override { data.setIndicesDescription(std::move(indices_)); }
|
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); }
|
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); }
|
bool hasColumn(const String & column_name) const override { return data.hasColumn(column_name); }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user