docs: private void generateSubPlanForJoinNodeRecursively(JoinNode rootNode,
                                                         int nextNode, List<JoinNode> nodes)
      {
          assert(nodes.size() > nextNode);
          JoinNode joinNode = nodes.get(nextNode);
          if (nodes.size() == nextNode + 1) {
              for (AccessPath path : joinNode.m_accessPaths) {
                  joinNode.m_currentAccessPath = path;
                  AbstractPlanNode plan = getSelectSubPlanForJoinNode(rootNode);
                  if (plan == null) {
                      continue;
                  }
                  m_plans.add(plan);
              }
              return;
          }
  
          // If we have drained heap memory, don't recurse further on.
          if (! m_plans.isEmpty() && m_plans.size() % PLAN_ESTIMATE_PERIOD == 0 && shouldStopPlanning()) {
              return;
          }
          for (AccessPath path : joinNode.m_accessPaths) {
              joinNode.m_currentAccessPath = path;
              generateSubPlanForJoinNodeRecursively(rootNode, nextNode+1, nodes);
          }
      }