docs: private AbstractPlanNode addProjection(AbstractPlanNode rootNode) {
          assert (m_parsedSelect != null);
          assert (m_parsedSelect.m_displayColumns != null);
  
          // Build the output schema for the projection based on the display columns
          NodeSchema proj_schema = m_parsedSelect.getFinalProjectionSchema();
          for (SchemaColumn col : proj_schema) {
              // Adjust the differentiator fields of TVEs, since they need to
              // reflect the inlined projection node in scan nodes.
              AbstractExpression colExpr = col.getExpression();
              Collection<TupleValueExpression> allTves =
                      ExpressionUtil.getTupleValueExpressions(colExpr);
              for (TupleValueExpression tve : allTves) {
                  if ( ! tve.needsDifferentiation()) {
                      // PartitionByPlanNode and a following OrderByPlanNode
                      // can have an internally generated RANK column.
                      // These do not need to have their differentiator updated,
                      // since it's only used for disambiguation in some
                      // combinations of "SELECT *" and subqueries.
                      // In fact attempting to adjust this special column will
                      // cause failed assertions.  The tve for this expression
                      // will be marked as not needing differentiation,
                      // so we just ignore it here.
                      continue;
                  }
                  rootNode.adjustDifferentiatorField(tve);
              }
          }
  
          ProjectionPlanNode projectionNode = new ProjectionPlanNode();
          projectionNode.setOutputSchemaWithoutClone(proj_schema);
  
          // If the projection can be done inline. then add the
          // projection node inline.
          if (rootNode instanceof AbstractScanPlanNode) {
              rootNode.addInlinePlanNode(projectionNode);
              return rootNode;
          }
  
          projectionNode.addAndLinkChild(rootNode);
          return projectionNode;
      }