| 58 | ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } |
| 59 | |
| 60 | ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override |
| 61 | { |
| 62 | auto col_str = ColumnString::create(); |
| 63 | ColumnString::Chars & vec = col_str->getChars(); |
| 64 | WriteBufferFromVector<ColumnString::Chars> buffer(vec); |
| 65 | ColumnString::Offsets & offsets = col_str->getOffsets(); |
| 66 | offsets.resize(input_rows_count); |
| 67 | |
| 68 | Block arg_columns; |
| 69 | |
| 70 | size_t arguments_size = arguments.size(); |
| 71 | for (size_t i = 1; i < arguments_size; ++i) |
| 72 | { |
| 73 | auto argument_column = arguments[i]; |
| 74 | argument_column.name = arguments_column_names[i]; |
| 75 | arg_columns.insert(std::move(argument_column)); |
| 76 | } |
| 77 | |
| 78 | materializeBlockInplace(arg_columns); |
| 79 | auto out = FormatFactory::instance().getOutputFormat(format_name, buffer, arg_columns, context, format_settings); |
| 80 | |
| 81 | /// This function make sense only for row output formats. |
| 82 | auto * row_output_format = dynamic_cast<IRowOutputFormat *>(out.get()); |
| 83 | if (!row_output_format) |
| 84 | throw Exception(ErrorCodes::BAD_ARGUMENTS, |
| 85 | "Cannot turn rows into a {} format strings. {} function supports only row output formats", |
| 86 | format_name, getName()); |
| 87 | |
| 88 | auto columns = arg_columns.getColumns(); |
| 89 | for (size_t i = 0; i != input_rows_count; ++i) |
| 90 | { |
| 91 | row_output_format->writePrefixIfNeeded(); |
| 92 | row_output_format->writeRow(columns, i); |
| 93 | row_output_format->finalize(); |
| 94 | if (no_newline) |
| 95 | { |
| 96 | if (buffer.position() != buffer.buffer().begin() && buffer.position()[-1] == '\n') |
| 97 | --buffer.position(); |
| 98 | } |
| 99 | |
| 100 | offsets[i] = buffer.count(); |
| 101 | row_output_format->resetFormatter(); |
| 102 | } |
| 103 | |
| 104 | return col_str; |
| 105 | } |
| 106 | |
| 107 | private: |
| 108 | const char * function_name; |
nothing calls this directly
no test coverage detected