| 124 | |
| 125 | template <typename Derived> |
| 126 | ColumnPtr FunctionArrayEnumerateExtended<Derived>::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const |
| 127 | { |
| 128 | const ColumnArray::Offsets * offsets = nullptr; |
| 129 | size_t num_arguments = arguments.size(); |
| 130 | ColumnRawPtrs data_columns(num_arguments); |
| 131 | |
| 132 | Columns array_holders; |
| 133 | ColumnPtr offsets_column; |
| 134 | for (size_t i = 0; i < num_arguments; ++i) |
| 135 | { |
| 136 | const ColumnPtr & array_ptr = arguments[i].column; |
| 137 | const ColumnArray * array = checkAndGetColumn<ColumnArray>(array_ptr.get()); |
| 138 | if (!array) |
| 139 | { |
| 140 | const ColumnConst * const_array = checkAndGetColumnConst<ColumnArray>( |
| 141 | arguments[i].column.get()); |
| 142 | if (!const_array) |
| 143 | throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Illegal column {} of {}-th argument of function {}", |
| 144 | arguments[i].column->getName(), i + 1, getName()); |
| 145 | array_holders.emplace_back(const_array->convertToFullColumn()); |
| 146 | array = checkAndGetColumn<ColumnArray>(array_holders.back().get()); |
| 147 | } |
| 148 | |
| 149 | const ColumnArray::Offsets & offsets_i = array->getOffsets(); |
| 150 | if (i == 0) |
| 151 | { |
| 152 | offsets = &offsets_i; |
| 153 | offsets_column = array->getOffsetsPtr(); |
| 154 | } |
| 155 | else if (offsets_i != *offsets) |
| 156 | throw Exception(ErrorCodes::SIZES_OF_ARRAYS_DONT_MATCH, "Lengths of all arrays passed to {} must be equal.", |
| 157 | getName()); |
| 158 | |
| 159 | const auto * array_data = &array->getData(); |
| 160 | data_columns[i] = array_data; |
| 161 | } |
| 162 | |
| 163 | const NullMap * null_map = nullptr; |
| 164 | |
| 165 | for (size_t i = 0; i < num_arguments; ++i) |
| 166 | { |
| 167 | if (const auto * nullable_col = checkAndGetColumn<ColumnNullable>(data_columns[i])) |
| 168 | { |
| 169 | if (num_arguments == 1) |
| 170 | data_columns[i] = &nullable_col->getNestedColumn(); |
| 171 | |
| 172 | null_map = &nullable_col->getNullMapData(); |
| 173 | break; |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | auto res_nested = ColumnUInt32::create(); |
| 178 | |
| 179 | ColumnUInt32::Container & res_values = res_nested->getData(); |
| 180 | if (!offsets->empty()) |
| 181 | res_values.resize(offsets->back()); |
| 182 | |
| 183 | if (num_arguments == 1) |
nothing calls this directly
no test coverage detected