提交 150bde4e 编写于 作者: A Alexey Milovidov

dbms: VIEWs: added support for SAMPLE, FINAL, PREWHERE [#METR-13098].

上级 a6dcbb03
......@@ -18,6 +18,10 @@ public:
NameAndTypePair getColumn(const String & column_name) const override;
bool hasColumn(const String & column_name) const override;
bool supportsSampling() const override { return data->supportsSampling(); }
bool supportsFinal() const override { return data->supportsFinal(); }
bool supportsPrewhere() const override { return data->supportsPrewhere(); }
BlockOutputStreamPtr write(ASTPtr query) override;
void drop() override;
bool optimize() override;
......
......@@ -13,12 +13,16 @@ public:
static StoragePtr create(const String & table_name_, const String & database_name_,
Context & context_, ASTPtr & query_, NamesAndTypesListPtr columns_);
virtual std::string getName() const override { return "View"; }
virtual std::string getTableName() const override { return table_name; }
std::string getName() const override { return "View"; }
std::string getTableName() const override { return table_name; }
const NamesAndTypesList & getColumnsList() const override { return *columns; }
DB::ASTPtr getInnerQuery() const { return inner_query.clone(); };
virtual BlockInputStreams read(
/// Пробрасывается внутрь запроса и решается на его уровне.
bool supportsSampling() const override { return true; }
bool supportsFinal() const override { return true; }
BlockInputStreams read(
const Names & column_names,
ASTPtr query,
const Settings & settings,
......@@ -26,7 +30,7 @@ public:
size_t max_block_size = DEFAULT_BLOCK_SIZE,
unsigned threads = 1) override;
virtual void drop() override;
void drop() override;
protected:
String select_database_name;
......
......@@ -61,8 +61,20 @@ BlockInputStreams StorageView::read(
size_t max_block_size,
unsigned threads)
{
ASTPtr inner_query_clone = getInnerQuery();
ASTSelectQuery & inner_select = static_cast<ASTSelectQuery &>(*inner_query_clone);
const ASTSelectQuery & outer_select = typeid_cast<const ASTSelectQuery &>(*query);
/// Пробрасываем внутрь SAMPLE и FINAL, если они есть во внешнем запросе и их нет во внутреннем.
if (outer_select.sample_size && !inner_select.sample_size)
inner_select.sample_size = outer_select.sample_size;
if (outer_select.final && !inner_select.final)
inner_select.final = outer_select.final;
return BlockInputStreams(1,
InterpreterSelectQuery(getInnerQuery(), context, column_names).execute());
InterpreterSelectQuery(inner_query_clone, context, column_names).execute());
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册