#pragma once #include #include #include #include namespace DB { /** Добавляет в блок недостающие столбцы со значениями по-умолчанию. * Эти столбцы - материалированные (не константы). */ class AddingDefaultBlockInputStream : public IProfilingBlockInputStream { public: AddingDefaultBlockInputStream( BlockInputStreamPtr input_, NamesAndTypesListPtr required_columns_, const ColumnDefaults & column_defaults_, const Context & context_) : required_columns(required_columns_), column_defaults(column_defaults_), context(context_) { children.push_back(input_); } String getName() const { return "AddingDefaultBlockInputStream"; } String getID() const { std::stringstream res; res << "AddingDefault(" << children.back()->getID(); for (NamesAndTypesList::const_iterator it = required_columns->begin(); it != required_columns->end(); ++it) res << ", " << it->name << ", " << it->type->getName(); res << ")"; return res.str(); } protected: Block readImpl() { Block res = children.back()->read(); if (!res) return res; res.addDefaults(required_columns, column_defaults, context); return res; } private: NamesAndTypesListPtr required_columns; const ColumnDefaults & column_defaults; Context context; }; }