Program: 78790
Project: 78790
Buggy source:
/** 
 * Initialize tableInfos by analyzing the input string.
 * @param relationString
 * @throws OdaException 
 */
private void initialize(String relationString) throws OdaException {
  if (relationString == null || relationString.length() == 0)   throw new OdaException("String_Node_Str");
  String[] tables=relationString.split(CONST_TABLE_DELIMITER);
  for (int i=0; i < tables.length; i++) {
    String[] temp=tables[i].trim().split(CONST_TABLE_COLUMN_DELIMITER);
    assert(temp.length == 3);
    TableInfo tableInfo=new TableInfo(temp[0].trim(),temp[1].substring(1,temp[1].length() - 1).trim());
    String[] columns=temp[2].trim().split(CONST_COLUMN_DELIMITER);
    for (int j=0; j < columns.length; j++) {
      String trimedColumn=columns[j].trim();
      String[] columnInfos=trimedColumn.substring(1,trimedColumn.length() - 1).split(CONST_COLUMN_METAINFO_DELIMITER);
      String columnXpath=null;
      if (columnInfos.length == 3) {
        columnXpath=columnInfos[2];
      }
 else {
        columnXpath="String_Node_Str";
      }
      for (int m=0; m < columnInfos.length; m++)       columnInfos[m]=columnInfos[m].trim();
      if (columnXpath.matches("String_Node_Str")) {
        String value=columnXpath.replaceAll("String_Node_Str","String_Node_Str").trim();
        value=value.substring(1,value.length() - 2);
        tableInfo.addFilter(columnInfos[0],value);
        columnXpath=columnXpath.replaceAll("String_Node_Str","String_Node_Str");
      }
      tableInfo.addColumn(new ColumnInfo(j + 1,columnInfos[0],columnInfos[1],combineColumnPath(tableInfo.getRootPath(),columnXpath),columnXpath));
    }
    this.tableInfos.put(temp[0].trim(),tableInfo);
  }
}

Fixed version (ground truth):
/** 
 * Initialize tableInfos by analyzing the input string.
 * @param relationString
 * @throws OdaException 
 */
private void initialize(String relationString) throws OdaException {
  if (relationString == null || relationString.length() == 0)   throw new OdaException("String_Node_Str");
  String[] tables=relationString.split(CONST_TABLE_DELIMITER);
  for (int i=0; i < tables.length; i++) {
    String[] temp=tables[i].trim().split(CONST_TABLE_COLUMN_DELIMITER);
    assert(temp.length == 3);
    TableInfo tableInfo=new TableInfo(temp[0].trim(),temp[1].substring(1,temp[1].length() - 1).trim());
    String[] columns=temp[2].trim().split(CONST_COLUMN_DELIMITER);
    for (int j=0; j < columns.length; j++) {
      String trimedColumn=columns[j].trim();
      String[] columnInfos=trimedColumn.substring(1,trimedColumn.length() - 1).split(CONST_COLUMN_METAINFO_DELIMITER);
      String columnXpath=null;
      if (columnInfos.length == 3) {
        columnXpath=columnInfos[2];
      }
 else {
        columnXpath="String_Node_Str";
      }
      for (int m=0; m < columnInfos.length; m++)       columnInfos[m]=columnInfos[m].trim();
      String originalColumnXpath=columnXpath;
      if (columnXpath.matches("String_Node_Str")) {
        String value=columnXpath.replaceAll("String_Node_Str","String_Node_Str").trim();
        value=value.substring(1,value.length() - 2);
        tableInfo.addFilter(columnInfos[0],value);
        columnXpath=columnXpath.replaceAll("String_Node_Str","String_Node_Str");
      }
      tableInfo.addColumn(new ColumnInfo(j + 1,columnInfos[0],columnInfos[1],combineColumnPath(tableInfo.getRootPath(),columnXpath),originalColumnXpath));
    }
    this.tableInfos.put(temp[0].trim(),tableInfo);
  }
}