| 2244 | } |
| 2245 | |
| 2246 | RelationPlan QueryPlannerVisitor::planSetOperation(ASTs & selects, ASTSelectWithUnionQuery::Mode union_mode) |
| 2247 | { |
| 2248 | RelationPlans sub_plans; |
| 2249 | |
| 2250 | // 1. plan set element |
| 2251 | for (auto & select : selects) |
| 2252 | sub_plans.push_back(process(select)); |
| 2253 | |
| 2254 | if (sub_plans.empty()) |
| 2255 | throw Exception(ErrorCodes::LOGICAL_ERROR, "Set operation must have at least 1 element"); |
| 2256 | |
| 2257 | if (sub_plans.size() == 1) |
| 2258 | return sub_plans.front(); |
| 2259 | |
| 2260 | std::vector<NameToType> sub_plan_types; |
| 2261 | for (const auto & sub_plan : sub_plans) |
| 2262 | sub_plan_types.emplace_back(sub_plan.getRoot()->getOutputNamesToTypes()); |
| 2263 | |
| 2264 | FieldSubColumnIDs sub_column_positions; |
| 2265 | DataTypes sub_column_type_coercions; |
| 2266 | |
| 2267 | // compute common subcolumns for each field |
| 2268 | if (enable_subcolumn_optimization_through_union) |
| 2269 | { |
| 2270 | auto field_size = sub_plans.front().getFieldSymbolInfos().size(); |
| 2271 | for (size_t field_id = 0; field_id < field_size; ++field_id) |
| 2272 | { |
| 2273 | SubColumnIDSet common_sub_col_ids_prev; |
| 2274 | SubColumnIDSet common_sub_col_ids; |
| 2275 | |
| 2276 | for (size_t select_id = 0; select_id < selects.size(); ++select_id) |
| 2277 | { |
| 2278 | common_sub_col_ids_prev.swap(common_sub_col_ids); |
| 2279 | common_sub_col_ids.clear(); |
| 2280 | |
| 2281 | for (const auto & sub_col : sub_plans[select_id].getFieldSymbolInfos().at(field_id).sub_column_symbols) |
| 2282 | if (select_id == 0 || common_sub_col_ids_prev.count(sub_col.first)) |
| 2283 | common_sub_col_ids.emplace(sub_col.first); |
| 2284 | } |
| 2285 | |
| 2286 | for (const auto & sub_col_id : common_sub_col_ids) |
| 2287 | sub_column_positions.emplace_back(field_id, sub_col_id); |
| 2288 | } |
| 2289 | |
| 2290 | if (enable_implicit_type_conversion) |
| 2291 | { |
| 2292 | for (const auto & field_sub_col_id : sub_column_positions) |
| 2293 | { |
| 2294 | DataTypes sub_col_types; |
| 2295 | for (size_t select_id = 0; select_id < selects.size(); ++select_id) |
| 2296 | { |
| 2297 | auto sub_col_symbol = sub_plans[select_id] |
| 2298 | .getFieldSymbolInfos() |
| 2299 | .at(field_sub_col_id.first) |
| 2300 | .sub_column_symbols.at(field_sub_col_id.second); |
| 2301 | sub_col_types.push_back(sub_plan_types[select_id].at(sub_col_symbol)); |
| 2302 | } |
| 2303 | sub_column_type_coercions.emplace_back( |
nothing calls this directly
no test coverage detected