MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / executeImpl

Method executeImpl

src/Functions/array/arrayEnumerateExtended.h:126–206  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

124
125template <typename Derived>
126ColumnPtr 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)

Callers

nothing calls this directly

Calls 15

executeFixedStringFunction · 0.85
executeStringFunction · 0.70
ExceptionClass · 0.50
getNameFunction · 0.50
createFunction · 0.50
sizeMethod · 0.45
getMethod · 0.45
getNameMethod · 0.45
emplace_backMethod · 0.45
convertToFullColumnMethod · 0.45
backMethod · 0.45
getOffsetsMethod · 0.45

Tested by

no test coverage detected