docs: private void initPreAggOutputSchema() {
          ProjectionPlanNode proj =
              (ProjectionPlanNode)getInlinePlanNode(PlanNodeType.PROJECTION);
          if (proj != null) {
              // Does this operation needs to change complex expressions
              // into tuple value expressions with an column alias?
              // Is this always true for clone?  Or do we need a new method?
              m_outputSchema = proj.getOutputSchema().copyAndReplaceWithTVE();
              // It's just a cheap knock-off of the projection's
              m_hasSignificantOutputSchema = false;
          }
          else if (m_tableScanSchema.size() != 0) {
              // Order the scan columns according to the table schema
              // before we stick them in the projection output
              int difftor = 0;
              for (SchemaColumn col : m_tableScanSchema) {
                  col.setDifferentiator(difftor);
                  ++difftor;
                  AbstractExpression colExpr = col.getExpression();
                  assert(colExpr instanceof TupleValueExpression);
                  TupleValueExpression tve = (TupleValueExpression) colExpr;
                  tve.setColumnIndexUsingSchema(m_tableSchema);
              }
              // and update their indexes against the table schema
              m_tableScanSchema.sortByTveIndex();
  
              // Create inline projection to map table outputs to scan outputs
              ProjectionPlanNode projectionNode =
                      new ProjectionPlanNode(m_tableScanSchema);
              addInlinePlanNode(projectionNode);
              // a bit redundant but logically consistent
              m_outputSchema = projectionNode.getOutputSchema().copyAndReplaceWithTVE();
              m_hasSignificantOutputSchema = false; // It's just a cheap knock-off of the projection's
          }
          else {
              // We come here if m_tableScanSchema is empty.
              //
              // m_tableScanSchema might be empty for cases like
              //   select now from table;
              // where there are no columns in the table that are accessed.
              //
              // Just fill m_outputSchema with the table's columns.
              m_outputSchema = m_tableSchema.clone();
              m_hasSignificantOutputSchema = true;
          }
          m_preAggOutputSchema = m_outputSchema;
      }