Program: 82094
Project: 82094
Buggy source:
@Override public List<Field> getFields(String rowId,Record record) throws IOException {
  List<Field> fields=new ArrayList<Field>();
  String family=record.getFamily();
  if (family == null || family.isEmpty()) {
    family=BlurConstants.DEFAULT_FAMILY;
  }
  List<Column> columns=record.getColumns();
  addDefaultFields(fields,rowId,record);
  addFieldExistance(fields,record);
  Map<String,Integer> fieldCounts=new HashMap<String,Integer>();
  List<FieldTypeDefinition> postProcessingFieldTypes=new ArrayList<FieldTypeDefinition>();
  for (  Column column : columns) {
    String name=column.getName();
    String value=column.getValue();
    if (value == null || name == null) {
      continue;
    }
    FieldTypeDefinition fieldTypeDefinition=getFieldTypeDefinition(family,column);
    if (fieldTypeDefinition == null) {
      if (isStrict()) {
        LOG.error("String_Node_Str",family,column);
        throw new IOException("String_Node_Str" + family + "String_Node_Str"+ column+ "String_Node_Str");
      }
      addColumnDefinition(family,name,null,getDefaultMissingFieldLessIndexing(),getDefaultMissingFieldType(),false,DEFAULT_MULTI_VALUE_FIELD_VALUE,getDefaultMissingFieldProps());
      fieldTypeDefinition=getFieldTypeDefinition(family,column);
    }
    if (fieldTypeDefinition.isPostProcessingSupported()) {
      postProcessingFieldTypes.add(fieldTypeDefinition);
    }
    String fieldName=fieldTypeDefinition.getFieldName();
    Integer count=fieldCounts.get(fieldName);
    if (count == null) {
      count=1;
    }
 else {
      count=count + 1;
    }
    fieldCounts.put(fieldName,count);
    getAndAddFields(fields,family,column,fieldTypeDefinition,count);
    Collection<String> subColumns=getSubColumns(family,column);
    if (subColumns != null) {
      for (      String subName : subColumns) {
        FieldTypeDefinition subFieldTypeDefinition=getFieldTypeDefinition(family,column,subName);
        fieldName=subFieldTypeDefinition.getFieldName();
        count=fieldCounts.get(fieldName);
        if (count == null) {
          count=1;
        }
 else {
          count=count + 1;
        }
        getAndAddFields(fields,family,column,subName,subFieldTypeDefinition,count);
      }
    }
  }
  if (!postProcessingFieldTypes.isEmpty()) {
    Collections.sort(postProcessingFieldTypes,POST_PROCESSING_COMPARATOR);
    Iterable<? extends Field> iterable=fields;
    for (    FieldTypeDefinition fieldTypeDefinition : postProcessingFieldTypes) {
      iterable=fieldTypeDefinition.executePostProcessing(iterable);
    }
    return toList(iterable);
  }
 else {
    return fields;
  }
}

Fixed version (ground truth):
@Override public List<Field> getFields(String rowId,Record record) throws IOException {
  List<Field> fields=new ArrayList<Field>();
  String family=record.getFamily();
  if (family == null || family.isEmpty()) {
    family=BlurConstants.DEFAULT_FAMILY;
  }
  List<Column> columns=record.getColumns();
  addDefaultFields(fields,rowId,record);
  addFieldExistance(fields,record);
  Map<String,Integer> fieldCounts=new HashMap<String,Integer>();
  List<FieldTypeDefinition> postProcessingFieldTypes=new ArrayList<FieldTypeDefinition>();
  for (  Column column : columns) {
    String name=column.getName();
    String value=column.getValue();
    if (value == null || name == null) {
      continue;
    }
    FieldTypeDefinition fieldTypeDefinition=getFieldTypeDefinition(family,column);
    if (fieldTypeDefinition == null) {
      if (isStrict()) {
        LOG.error("String_Node_Str",family,column);
        throw new IOException("String_Node_Str" + family + "String_Node_Str"+ column+ "String_Node_Str");
      }
      addColumnDefinition(family,name,null,getDefaultMissingFieldLessIndexing(),getDefaultMissingFieldType(),false,DEFAULT_MULTI_VALUE_FIELD_VALUE,getDefaultMissingFieldProps());
      fieldTypeDefinition=getFieldTypeDefinition(family,column);
    }
    if (fieldTypeDefinition.isPostProcessingSupported()) {
      postProcessingFieldTypes.add(fieldTypeDefinition);
    }
    String fieldName=fieldTypeDefinition.getFieldName();
    Integer count=fieldCounts.get(fieldName);
    if (count == null) {
      count=1;
    }
 else {
      count=count + 1;
    }
    fieldCounts.put(fieldName,count);
    getAndAddFields(fields,family,column,fieldTypeDefinition,count);
    Collection<String> subColumns=getSubColumns(family,column);
    if (subColumns != null) {
      for (      String subName : subColumns) {
        FieldTypeDefinition subFieldTypeDefinition=getFieldTypeDefinition(family,column,subName);
        fieldName=subFieldTypeDefinition.getFieldName();
        count=fieldCounts.get(fieldName);
        if (count == null) {
          count=1;
        }
 else {
          count=count + 1;
        }
        getAndAddFields(fields,family,column,subName,subFieldTypeDefinition,count);
      }
    }
  }
  if (!postProcessingFieldTypes.isEmpty()) {
    Collections.sort(postProcessingFieldTypes,POST_PROCESSING_COMPARATOR);
    Iterable<? extends IndexableField> iterable=fields;
    for (    FieldTypeDefinition fieldTypeDefinition : postProcessingFieldTypes) {
      iterable=fieldTypeDefinition.executePostProcessing(iterable);
    }
    return toList(iterable);
  }
 else {
    return fields;
  }
}