ClickHouse/dbms/src/Storages/StorageView.cpp

73 lines
2.2 KiB
C++
Raw Normal View History

2018-02-25 06:34:20 +00:00
#include <Interpreters/InterpreterSelectWithUnionQuery.h>
#include <Parsers/ASTIdentifier.h>
#include <Parsers/ASTCreateQuery.h>
2017-07-13 20:58:19 +00:00
#include <Common/typeid_cast.h>
#include <Storages/StorageView.h>
#include <Storages/StorageFactory.h>
2018-02-28 19:47:33 +00:00
#include <DataStreams/MaterializingBlockInputStream.h>
namespace DB
{
namespace ErrorCodes
{
extern const int INCORRECT_QUERY;
}
StorageView::StorageView(
const String & table_name_,
const String & database_name_,
const ASTCreateQuery & query,
const NamesAndTypesList & columns_,
const NamesAndTypesList & materialized_columns_,
const NamesAndTypesList & alias_columns_,
const ColumnDefaults & column_defaults_)
: IStorage{columns_, materialized_columns_, alias_columns_, column_defaults_}, table_name(table_name_),
database_name(database_name_)
{
if (!query.select)
throw Exception("SELECT query is not specified for " + getName(), ErrorCodes::INCORRECT_QUERY);
inner_query = query.select->ptr();
}
2014-06-12 23:21:38 +00:00
BlockInputStreams StorageView::read(
const Names & column_names,
2017-12-01 21:13:25 +00:00
const SelectQueryInfo & /*query_info*/,
const Context & context,
QueryProcessingStage::Enum & processed_stage,
2017-12-01 21:13:25 +00:00
const size_t /*max_block_size*/,
const unsigned /*num_streams*/)
{
processed_stage = QueryProcessingStage::FetchColumns;
2018-02-28 19:47:33 +00:00
BlockInputStreams res = InterpreterSelectWithUnionQuery(inner_query->clone(), context, column_names).executeWithMultipleStreams();
/// It's expected that the columns read from storage are not constant.
/// Because method 'getSampleBlockForColumns' is used to obtain a structure of result in InterpreterSelectQuery.
for (auto & stream : res)
stream = std::make_shared<MaterializingBlockInputStream>(stream);
return res;
}
void registerStorageView(StorageFactory & factory)
{
factory.registerStorage("View", [](const StorageFactory::Arguments & args)
{
if (args.query.storage)
throw Exception("Specifying ENGINE is not allowed for a View", ErrorCodes::INCORRECT_QUERY);
return StorageView::create(
args.table_name, args.database_name, args.query, args.columns,
args.materialized_columns, args.alias_columns, args.column_defaults);
});
}
}