Program: 15699
Project: 15699
Buggy source:
private Column parseColumnWithType(String columnName){
  String original=currentToken;
  boolean regular=false;
  if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        original+="String_Node_Str";
      }
 else {
        read("String_Node_Str");
        read("String_Node_Str");
        original+="String_Node_Str";
      }
    }
  }
 else {
    regular=true;
  }
  long precision=-1;
  int displaySize=-1;
  java.util.List<String> enumerators=new ArrayList<String>();
  int scale=-1;
  String comment=null;
  Column templateColumn=null;
  DataType dataType;
  if (!identifiersToUpper) {
    original=StringUtils.toUpperEnglish(original);
  }
  UserDataType userDataType=database.findUserDataType(original);
  if (userDataType != null) {
    templateColumn=userDataType.getColumn();
    dataType=DataType.getDataType(templateColumn.getType());
    comment=templateColumn.getComment();
    original=templateColumn.getOriginalSQL();
    precision=templateColumn.getPrecision();
    displaySize=templateColumn.getDisplaySize();
    scale=templateColumn.getScale();
  }
 else {
    dataType=DataType.getTypeByName(original);
    if (dataType == null) {
      throw DbException.get(ErrorCode.UNKNOWN_DATA_TYPE_1,currentToken);
    }
  }
  if (database.getIgnoreCase() && dataType.type == Value.STRING && !equalsToken("String_Node_Str",original)) {
    original="String_Node_Str";
    dataType=DataType.getTypeByName(original);
  }
  if (regular) {
    read();
  }
  precision=precision == -1 ? dataType.defaultPrecision : precision;
  displaySize=displaySize == -1 ? dataType.defaultDisplaySize : displaySize;
  scale=scale == -1 ? dataType.defaultScale : scale;
  if (dataType.supportsPrecision || dataType.supportsScale) {
    if (readIf("String_Node_Str")) {
      if (!readIf("String_Node_Str")) {
        long p=readLong();
        if (readIf("String_Node_Str")) {
          p*=1024;
        }
 else         if (readIf("String_Node_Str")) {
          p*=1024 * 1024;
        }
 else         if (readIf("String_Node_Str")) {
          p*=1024 * 1024 * 1024;
        }
        if (p > Long.MAX_VALUE) {
          p=Long.MAX_VALUE;
        }
        original+="String_Node_Str" + p;
        readIf("String_Node_Str");
        if (dataType.supportsScale) {
          if (readIf("String_Node_Str")) {
            scale=readInt();
            original+="String_Node_Str" + scale;
          }
 else {
            if (dataType.type == Value.TIMESTAMP) {
              scale=MathUtils.convertLongToInt(p);
              p=precision;
            }
 else {
              scale=0;
            }
          }
        }
        precision=p;
        displaySize=MathUtils.convertLongToInt(precision);
        original+="String_Node_Str";
      }
      read("String_Node_Str");
    }
  }
 else   if (dataType.enumerated) {
    if (readIf("String_Node_Str")) {
      original+='(';
      String enumerator0=readString();
      enumerators.add(enumerator0.toLowerCase().trim());
      original+="String_Node_Str" + enumerator0 + "String_Node_Str";
      while (readIf("String_Node_Str")) {
        original+=',';
        String enumeratorN=readString();
        original+="String_Node_Str" + enumeratorN + "String_Node_Str";
        enumerators.add(enumeratorN.toLowerCase().trim());
      }
      read("String_Node_Str");
      original+=')';
    }
  }
 else   if (readIf("String_Node_Str")) {
    readPositiveInt();
    read("String_Node_Str");
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    read("String_Node_Str");
    if (dataType.type == Value.STRING) {
      dataType=DataType.getTypeByName("String_Node_Str");
    }
  }
  readIf("String_Node_Str");
  int type=dataType.type;
  if (scale > precision) {
    throw DbException.get(ErrorCode.INVALID_VALUE_SCALE_PRECISION,Integer.toString(scale),Long.toString(precision));
  }
  Column column=new Column(columnName,type,precision,scale,displaySize,enumerators.toArray(new String[enumerators.size()]));
  if (templateColumn != null) {
    column.setNullable(templateColumn.isNullable());
    column.setDefaultExpression(session,templateColumn.getDefaultExpression());
    int selectivity=templateColumn.getSelectivity();
    if (selectivity != Constants.SELECTIVITY_DEFAULT) {
      column.setSelectivity(selectivity);
    }
    Expression checkConstraint=templateColumn.getCheckConstraint(session,columnName);
    column.addCheckConstraint(session,checkConstraint);
  }
  column.setComment(comment);
  column.setOriginalSQL(original);
  return column;
}

Fixed version (ground truth):
private Column parseColumnWithType(String columnName){
  String original=currentToken;
  boolean regular=false;
  if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      original+="String_Node_Str";
    }
  }
 else   if (readIf("String_Node_Str")) {
    if (readIf("String_Node_Str")) {
      if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        original+="String_Node_Str";
      }
 else {
        read("String_Node_Str");
        read("String_Node_Str");
        original+="String_Node_Str";
      }
    }
  }
 else {
    regular=true;
  }
  long precision=-1;
  int displaySize=-1;
  java.util.List<String> enumerators=null;
  int scale=-1;
  String comment=null;
  Column templateColumn=null;
  DataType dataType;
  if (!identifiersToUpper) {
    original=StringUtils.toUpperEnglish(original);
  }
  UserDataType userDataType=database.findUserDataType(original);
  if (userDataType != null) {
    templateColumn=userDataType.getColumn();
    dataType=DataType.getDataType(templateColumn.getType());
    comment=templateColumn.getComment();
    original=templateColumn.getOriginalSQL();
    precision=templateColumn.getPrecision();
    displaySize=templateColumn.getDisplaySize();
    scale=templateColumn.getScale();
  }
 else {
    dataType=DataType.getTypeByName(original);
    if (dataType == null) {
      throw DbException.get(ErrorCode.UNKNOWN_DATA_TYPE_1,currentToken);
    }
  }
  if (database.getIgnoreCase() && dataType.type == Value.STRING && !equalsToken("String_Node_Str",original)) {
    original="String_Node_Str";
    dataType=DataType.getTypeByName(original);
  }
  if (regular) {
    read();
  }
  precision=precision == -1 ? dataType.defaultPrecision : precision;
  displaySize=displaySize == -1 ? dataType.defaultDisplaySize : displaySize;
  scale=scale == -1 ? dataType.defaultScale : scale;
  if (dataType.supportsPrecision || dataType.supportsScale) {
    if (readIf("String_Node_Str")) {
      if (!readIf("String_Node_Str")) {
        long p=readLong();
        if (readIf("String_Node_Str")) {
          p*=1024;
        }
 else         if (readIf("String_Node_Str")) {
          p*=1024 * 1024;
        }
 else         if (readIf("String_Node_Str")) {
          p*=1024 * 1024 * 1024;
        }
        if (p > Long.MAX_VALUE) {
          p=Long.MAX_VALUE;
        }
        original+="String_Node_Str" + p;
        readIf("String_Node_Str");
        if (dataType.supportsScale) {
          if (readIf("String_Node_Str")) {
            scale=readInt();
            original+="String_Node_Str" + scale;
          }
 else {
            if (dataType.type == Value.TIMESTAMP) {
              scale=MathUtils.convertLongToInt(p);
              p=precision;
            }
 else {
              scale=0;
            }
          }
        }
        precision=p;
        displaySize=MathUtils.convertLongToInt(precision);
        original+="String_Node_Str";
      }
      read("String_Node_Str");
    }
  }
 else   if (dataType.enumerated) {
    if (readIf("String_Node_Str")) {
      enumerators=new ArrayList<String>();
      original+='(';
      String enumerator0=readString();
      enumerators.add(enumerator0.toLowerCase().trim());
      original+="String_Node_Str" + enumerator0 + "String_Node_Str";
      while (readIf("String_Node_Str")) {
        original+=',';
        String enumeratorN=readString();
        original+="String_Node_Str" + enumeratorN + "String_Node_Str";
        enumerators.add(enumeratorN.toLowerCase().trim());
      }
      read("String_Node_Str");
      original+=')';
    }
  }
 else   if (readIf("String_Node_Str")) {
    readPositiveInt();
    read("String_Node_Str");
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    read("String_Node_Str");
    if (dataType.type == Value.STRING) {
      dataType=DataType.getTypeByName("String_Node_Str");
    }
  }
  readIf("String_Node_Str");
  int type=dataType.type;
  if (scale > precision) {
    throw DbException.get(ErrorCode.INVALID_VALUE_SCALE_PRECISION,Integer.toString(scale),Long.toString(precision));
  }
  Column column=new Column(columnName,type,precision,scale,displaySize,enumerators == null ? null : enumerators.toArray(new String[enumerators.size()]));
  if (templateColumn != null) {
    column.setNullable(templateColumn.isNullable());
    column.setDefaultExpression(session,templateColumn.getDefaultExpression());
    int selectivity=templateColumn.getSelectivity();
    if (selectivity != Constants.SELECTIVITY_DEFAULT) {
      column.setSelectivity(selectivity);
    }
    Expression checkConstraint=templateColumn.getCheckConstraint(session,columnName);
    column.addCheckConstraint(session,checkConstraint);
  }
  column.setComment(comment);
  column.setOriginalSQL(original);
  return column;
}