code: private TableLoadResult copy (Table table, boolean createIndexes) {
          // This object will be returned to the caller to summarize the contents of the table and any errors.
          // FIXME: Should there be a separate TableSnapshotResult? Load result is empty except for fatal exception.
          TableLoadResult tableLoadResult = new TableLoadResult();
          try {
              // FIXME this is confusing, we only create a new table object so we can call a couple of methods on it,
              // all of which just need a list of fields.
              Table targetTable = new Table(tablePrefix + table.name, table.entityClass, table.required, table.fields);
              boolean success;
              if (feedIdToSnapshot == null) {
                  // If there is no feedId to snapshot (i.e., we're making an empty snapshot), simply create the table.
                  success = targetTable.createSqlTable(connection, true);
              } else {
                  // Otherwise, use the createTableFrom method to copy the data from the original.
                  String fromTableName = String.format("%s.%s", feedIdToSnapshot, table.name);
                  LOG.info("Copying table {} to {}", fromTableName, targetTable.name);
                  success = targetTable.createSqlTableFrom(connection, fromTableName);
              }
              // Only create indexes if table creation was successful.
              if (success && createIndexes) {
                  addEditorSpecificFields(connection, tablePrefix, table);
                  // Use spec table to create indexes. See createIndexes method for more info on why.
                  table.createIndexes(connection, tablePrefix);
                  // Populate default values for editor fields, including normalization of stop time stop sequences.
                  populateDefaultEditorValues(connection, tablePrefix, table);
              }
              LOG.info("Committing transaction...");
              connection.commit();
              LOG.info("Done.");
          } catch (Exception ex) {
              tableLoadResult.fatalException = ex.toString();
              LOG.error("Error: ", ex);
              try {
                  connection.rollback();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
          return tableLoadResult;
      }
docs: This is the main table copy method that wraps a call to Table#createSqlTableFrom and creates indexes for
  the table.