docs: protected ProcedurePartitionData parseCreateProcedureClauses(
                ProcedureDescriptor descriptor,
                String clauses) throws VoltCompilerException {
  
          // Nothing to do if there were no clauses.
          // Null means there's no partition data to return.
          // There's also no roles to add.
          if (clauses == null || clauses.isEmpty()) {
              return null;
          }
          ProcedurePartitionData data = null;
  
          Matcher matcher = SQLParser.matchAnyCreateProcedureStatementClause(clauses);
          int start = 0;
          while (matcher.find(start)) {
              start = matcher.end();
  
              if (matcher.group(1) != null) {
                  // Add roles if it's an ALLOW clause. More that one ALLOW clause is okay.
                  for (String roleName : StringUtils.split(matcher.group(1), ',')) {
                      // Don't put the same role in the list more than once.
                     String roleNameFixed = roleName.trim().toLowerCase();
                      if (!descriptor.m_authGroups.contains(roleNameFixed)) {
                          descriptor.m_authGroups.add(roleNameFixed);
                      }
                  }
              }
              else {
                  // Add partition info if it's a PARTITION clause. Only one is allowed.
                  if (data != null) {
                      throw m_compiler.new VoltCompilerException(
                          "Only one PARTITION clause is allowed for CREATE PROCEDURE.");
                  }
                  data = new ProcedurePartitionData(matcher.group(2), matcher.group(3), matcher.group(4),
                          matcher.group(5), matcher.group(6), matcher.group(7));
              }
          }
  
          return data;
      }