docs: private InMemoryJarfile compileInternal(
              final VoltCompilerReader cannonicalDDLIfAny,
              final Catalog previousCatalogIfAny,
              final List<VoltCompilerReader> ddlReaderList,
              final InMemoryJarfile jarOutputRet)
      {
          // Expect to have either >1 ddl file or a project file.
          assert(ddlReaderList.size() > 0);
          // Make a temporary local output jar if one wasn't provided.
          final InMemoryJarfile jarOutput = (jarOutputRet != null
                                                  ? jarOutputRet
                                                  : new InMemoryJarfile());
  
          if (ddlReaderList == null || ddlReaderList.isEmpty()) {
              addErr("One or more DDL files are required.");
              return null;
          }
  
          // clear out the warnings and errors
          m_warnings.clear();
          m_infos.clear();
          m_errors.clear();
  
          // do all the work to get the catalog
          final Catalog catalog = compileCatalogInternal(cannonicalDDLIfAny, previousCatalogIfAny, ddlReaderList, jarOutput);
          if (catalog == null) {
              return null;
          }
          Cluster cluster = catalog.getClusters().get("cluster");
          assert(cluster != null);
          Database database = cluster.getDatabases().get("database");
          assert(database != null);
  
          // Build DDL from Catalog Data
          String ddlWithBatchSupport = CatalogSchemaTools.toSchema(catalog);
          m_canonicalDDL = CatalogSchemaTools.toSchemaWithoutInlineBatches(ddlWithBatchSupport);
  
          // generate the catalog report and write it to disk
          try {
              generateCatalogReport(m_catalog, ddlWithBatchSupport, standaloneCompiler, m_warnings, jarOutput);
          }
          catch (IOException e) {
              e.printStackTrace();
              return null;
          }
  
          jarOutput.put(AUTOGEN_DDL_FILE_NAME, m_canonicalDDL.getBytes(Constants.UTF8ENCODING));
          if (DEBUG_VERIFY_CATALOG) {
              debugVerifyCatalog(jarOutput, catalog);
          }
  
          // WRITE CATALOG TO JAR HERE
          final String catalogCommands = catalog.serialize();
  
          byte[] catalogBytes = catalogCommands.getBytes(Constants.UTF8ENCODING);
  
          try {
              // Don't update buildinfo if it's already present, e.g. while upgrading.
              // Note when upgrading the version has already been updated by the caller.
              if (!jarOutput.containsKey(CatalogUtil.CATALOG_BUILDINFO_FILENAME)) {
                  addBuildInfo(jarOutput);
              }
              jarOutput.put(CatalogUtil.CATALOG_FILENAME, catalogBytes);
          }
          catch (final Exception e) {
              e.printStackTrace();
              return null;
          }
  
          assert(!hasErrors());
  
          if (hasErrors()) {
              return null;
          }
  
          return jarOutput;
      }