2019-05-19 05:27:00 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <DataStreams/IBlockOutputStream.h>
|
|
|
|
#include <Storages/ConstraintsDescription.h>
|
|
|
|
#include <DataStreams/OneBlockInputStream.h>
|
|
|
|
#include <DataStreams/ExpressionBlockInputStream.h>
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
2019-08-14 19:51:03 +00:00
|
|
|
extern const int VIOLATED_CONSTRAINT;
|
2019-05-19 05:27:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class CheckConstraintsBlockOutputStream : public IBlockOutputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CheckConstraintsBlockOutputStream(
|
2019-07-28 12:33:40 +00:00
|
|
|
const String & table_,
|
2019-05-19 05:27:00 +00:00
|
|
|
const BlockOutputStreamPtr & output_,
|
|
|
|
const Block & header_,
|
2019-05-19 07:19:44 +00:00
|
|
|
const ConstraintsDescription & constraints_,
|
|
|
|
const Context & context_)
|
2019-07-28 12:33:40 +00:00
|
|
|
: table(table_),
|
|
|
|
output(output_),
|
2019-05-19 05:27:00 +00:00
|
|
|
header(header_),
|
|
|
|
constraints(constraints_),
|
2019-07-28 12:33:40 +00:00
|
|
|
expressions(constraints_.getExpressions(context_, header.getNamesAndTypesList())),
|
|
|
|
rows_written(0)
|
2019-05-19 05:27:00 +00:00
|
|
|
{ }
|
|
|
|
|
|
|
|
Block getHeader() const override { return header; }
|
|
|
|
void write(const Block & block) override;
|
|
|
|
|
|
|
|
void flush() override;
|
|
|
|
|
|
|
|
void writePrefix() override;
|
|
|
|
void writeSuffix() override;
|
|
|
|
|
|
|
|
private:
|
2019-08-11 09:28:15 +00:00
|
|
|
const ColumnUInt8* executeOnBlock(Block & block, const ExpressionActionsPtr & constraint);
|
2019-07-28 12:33:40 +00:00
|
|
|
std::vector<size_t> findAllWrong(const void *data, size_t size);
|
|
|
|
|
|
|
|
String table;
|
2019-05-19 05:27:00 +00:00
|
|
|
BlockOutputStreamPtr output;
|
|
|
|
Block header;
|
|
|
|
const ConstraintsDescription constraints;
|
|
|
|
const ConstraintsExpressions expressions;
|
2019-07-28 12:33:40 +00:00
|
|
|
size_t rows_written;
|
2019-05-19 05:27:00 +00:00
|
|
|
};
|
|
|
|
}
|