MCPcopy Create free account
hub / github.com/ByConity/ByConity / planSetOperation

Method planSetOperation

src/QueryPlan/QueryPlanner.cpp:2246–2447  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2244}
2245
2246RelationPlan 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(

Callers

nothing calls this directly

Calls 15

getLeastSupertypeFunction · 0.85
mapFieldSymbolInfosFunction · 0.85
frontMethod · 0.80
columnsMethod · 0.80
newSymbolMethod · 0.80
ExceptionClass · 0.50
findFunction · 0.50
to_stringFunction · 0.50
push_backMethod · 0.45
emptyMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected