#pragma once #include #include #include #include #include #include namespace DB { class Context; /** Base class for system tables whose all columns have String type. */ template class IStorageSystemOneBlock : public IStorage { protected: virtual void fillData(MutableColumns & res_columns, const Context & context, const SelectQueryInfo & query_info) const = 0; public: IStorageSystemOneBlock(const String & name_) : IStorage({"system", name_}) { StorageInMemoryMetadata metadata_; metadata_.setColumns(ColumnsDescription(Self::getNamesAndTypes())); setInMemoryMetadata(metadata_); } Pipes read(const Names & column_names, const SelectQueryInfo & query_info, const Context & context, QueryProcessingStage::Enum /*processed_stage*/, size_t /*max_block_size*/, unsigned /*num_streams*/) override { check(column_names); Block sample_block = getSampleBlock(); MutableColumns res_columns = sample_block.cloneEmptyColumns(); fillData(res_columns, context, query_info); UInt64 num_rows = res_columns.at(0)->size(); Chunk chunk(std::move(res_columns), num_rows); Pipes pipes; pipes.emplace_back(std::make_shared(sample_block, std::move(chunk))); return pipes; } }; }