docs: private CompiledPlan getNextSwapPlan() {
          // there's really only one way to do a swap, so just
          // plan it the right way once, then return null after that
          if (m_bestAndOnlyPlanWasGenerated) {
              return null;
          }
          m_bestAndOnlyPlanWasGenerated = true;
  
          // figure out which tables we're swapping
          assert (m_parsedSwap.m_tableList.size() == 2);
          Table theTable = m_parsedSwap.m_tableList.get(0);
          Table otherTable = m_parsedSwap.m_tableList.get(1);
          CompiledPlan retval = new CompiledPlan(m_isLargeQuery);
          retval.setReadOnly(false);
  
          // the root of the SWAP TABLE plan is always a SwapPlanNode
          SwapTablesPlanNode swapNode = new SwapTablesPlanNode();
          swapNode.initializeSwapTablesPlanNode(theTable, otherTable);
  
          // SWAP commands are only run single-partition when invoked from
          // an explicitly declared single-partition stored procedure.
          if (m_partitioning.wasSpecifiedAsSingle()) {
              retval.rootPlanGraph = swapNode;
              return retval;
          }
  
          // Add a compensating sum of modified tuple counts or a limit 1
          // AND a send on top of the union-like receive node.
          boolean isReplicated = theTable.getIsreplicated();
          retval.rootPlanGraph = addCoordinatorToDMLNode(swapNode, isReplicated);
          return retval;
      }