MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / joinDependentStreams

Method joinDependentStreams

src/jrd/optimizer/Optimizer.cpp:2410–2457  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2408//
2409
2410bool Optimizer::joinDependentStreams(StreamList& joinStreams, RiverList& rivers, SortNode** sort)
2411{
2412 bool hasDependentStreams = false;
2413
2414 while (true)
2415 {
2416 // AB: Determine which streams have an index relationship
2417 // with the currently active rivers. This is needed so that
2418 // no merge is made between a new cross river and the
2419 // currently active rivers. Where in the new cross river
2420 // a stream depends (index) on the active rivers.
2421 StreamList dependentStreams, freeStreams;
2422 findDependentStreams(rivers, joinStreams, dependentStreams, freeStreams);
2423
2424 // If we have dependent and free streams then we can't rely on
2425 // the sort node to be used for index navigation
2426 if (dependentStreams.hasData() && freeStreams.hasData())
2427 sort = nullptr;
2428
2429 if (dependentStreams.hasData())
2430 {
2431 hasDependentStreams = true;
2432
2433 // Copy free streams
2434 joinStreams.assign(freeStreams);
2435
2436 // Make rivers from the dependent streams
2437 generateInnerJoin(dependentStreams, rivers, sort, rse->rse_plan);
2438
2439 for (const auto depStream : dependentStreams)
2440 csb->csb_rpt[depStream].activate();
2441 }
2442 else
2443 {
2444 if (freeStreams.hasData())
2445 {
2446 // Deactivate streams from rivers on stack, because
2447 // the remaining streams don't have any indexed relationship with them
2448 for (const auto river : rivers)
2449 river->deactivate(csb);
2450 }
2451
2452 break;
2453 }
2454 }
2455
2456 return hasDependentStreams;
2457};
2458
2459
2460//

Callers

nothing calls this directly

Calls 4

hasDataMethod · 0.45
assignMethod · 0.45
activateMethod · 0.45
deactivateMethod · 0.45

Tested by

no test coverage detected