Program: 15684
Project: 15684
Buggy source:
private Expression readCondition(){
  if (readIf("String_Node_Str")) {
    return new ConditionNot(readCondition());
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    Query query=parseSelect();
    read("String_Node_Str");
    return new ConditionExists(query);
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    Expression r1=readConcat();
    read("String_Node_Str");
    Expression r2=readConcat();
    read("String_Node_Str");
    return new Comparison(session,Comparison.SPATIAL_INTERSECTS,r1,r2);
  }
  Expression r=readConcat();
  while (true) {
    int backup=parseIndex;
    boolean not=false;
    if (readIf("String_Node_Str")) {
      not=true;
      if (isToken("String_Node_Str")) {
        parseIndex=backup;
        currentToken="String_Node_Str";
        break;
      }
    }
    if (readIf("String_Node_Str")) {
      Expression b=readConcat();
      Expression esc=null;
      if (readIf("String_Node_Str")) {
        esc=readConcat();
      }
      recompileAlways=true;
      r=new CompareLike(database,r,b,esc,false);
    }
 else     if (readIf("String_Node_Str")) {
      Function function=Function.getFunction(database,"String_Node_Str");
      function.setDataType(new Column("String_Node_Str",Value.STRING_IGNORECASE));
      function.setParameter(0,r);
      r=function;
      Expression b=readConcat();
      Expression esc=null;
      if (readIf("String_Node_Str")) {
        esc=readConcat();
      }
      recompileAlways=true;
      r=new CompareLike(database,r,b,esc,false);
    }
 else     if (readIf("String_Node_Str")) {
      Expression b=readConcat();
      r=new CompareLike(database,r,b,null,true);
    }
 else     if (readIf("String_Node_Str")) {
      if (readIf("String_Node_Str")) {
        if (readIf("String_Node_Str")) {
          r=new Comparison(session,Comparison.IS_NOT_NULL,r,null);
        }
 else         if (readIf("String_Node_Str")) {
          read("String_Node_Str");
          r=new Comparison(session,Comparison.EQUAL_NULL_SAFE,r,readConcat());
        }
 else {
          r=new Comparison(session,Comparison.NOT_EQUAL_NULL_SAFE,r,readConcat());
        }
      }
 else       if (readIf("String_Node_Str")) {
        r=new Comparison(session,Comparison.IS_NULL,r,null);
      }
 else       if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        r=new Comparison(session,Comparison.NOT_EQUAL_NULL_SAFE,r,readConcat());
      }
 else {
        r=new Comparison(session,Comparison.EQUAL_NULL_SAFE,r,readConcat());
      }
    }
 else     if (readIf("String_Node_Str")) {
      read("String_Node_Str");
      if (readIf("String_Node_Str")) {
        if (database.getMode().prohibitEmptyInPredicate) {
          throw getSyntaxError();
        }
        r=ValueExpression.get(ValueBoolean.get(false));
      }
 else {
        if (isSelect()) {
          Query query=parseSelect();
          query.setNeverLazy(true);
          r=new ConditionInSelect(database,r,query,false,Comparison.EQUAL);
        }
 else {
          ArrayList<Expression> v=New.arrayList();
          Expression last;
          do {
            last=readExpression();
            v.add(last);
          }
 while (readIf("String_Node_Str"));
          if (v.size() == 1 && (last instanceof Subquery)) {
            Subquery s=(Subquery)last;
            Query q=s.getQuery();
            r=new ConditionInSelect(database,r,q,false,Comparison.EQUAL);
          }
 else {
            r=new ConditionIn(database,r,v);
          }
        }
        read("String_Node_Str");
      }
    }
 else     if (readIf("String_Node_Str")) {
      Expression low=readConcat();
      read("String_Node_Str");
      Expression high=readConcat();
      Expression condLow=new Comparison(session,Comparison.SMALLER_EQUAL,low,r);
      Expression condHigh=new Comparison(session,Comparison.BIGGER_EQUAL,high,r);
      r=new ConditionAndOr(ConditionAndOr.AND,condLow,condHigh);
    }
 else {
      int compareType=getCompareType(currentTokenType);
      if (compareType < 0) {
        break;
      }
      read();
      if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        Query query=parseSelect();
        r=new ConditionInSelect(database,r,query,true,compareType);
        read("String_Node_Str");
      }
 else       if (readIf("String_Node_Str") || readIf("String_Node_Str")) {
        read("String_Node_Str");
        Query query=parseSelect();
        r=new ConditionInSelect(database,r,query,false,compareType);
        read("String_Node_Str");
      }
 else {
        Expression right=readConcat();
        if (SysProperties.OLD_STYLE_OUTER_JOIN && readIf("String_Node_Str") && readIf("String_Node_Str")&& readIf("String_Node_Str")) {
          if (r instanceof ExpressionColumn && right instanceof ExpressionColumn) {
            ExpressionColumn leftCol=(ExpressionColumn)r;
            ExpressionColumn rightCol=(ExpressionColumn)right;
            ArrayList<TableFilter> filters=currentSelect.getTopFilters();
            for (            TableFilter f : filters) {
              while (f != null) {
                leftCol.mapColumns(f,0);
                rightCol.mapColumns(f,0);
                f=f.getJoin();
              }
            }
            TableFilter leftFilter=leftCol.getTableFilter();
            TableFilter rightFilter=rightCol.getTableFilter();
            r=new Comparison(session,compareType,r,right);
            if (leftFilter != null && rightFilter != null) {
              int idx=filters.indexOf(rightFilter);
              if (idx >= 0) {
                filters.remove(idx);
                leftFilter.addJoin(rightFilter,true,false,r);
              }
 else {
                rightFilter.mapAndAddFilter(r);
              }
              r=ValueExpression.get(ValueBoolean.get(true));
            }
          }
        }
 else {
          r=new Comparison(session,compareType,r,right);
        }
      }
    }
    if (not) {
      r=new ConditionNot(r);
    }
  }
  return r;
}

Fixed version (ground truth):
private Expression readCondition(){
  if (readIf("String_Node_Str")) {
    return new ConditionNot(readCondition());
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    Query query=parseSelect();
    read("String_Node_Str");
    return new ConditionExists(query);
  }
  if (readIf("String_Node_Str")) {
    read("String_Node_Str");
    Expression r1=readConcat();
    read("String_Node_Str");
    Expression r2=readConcat();
    read("String_Node_Str");
    return new Comparison(session,Comparison.SPATIAL_INTERSECTS,r1,r2);
  }
  Expression r=readConcat();
  while (true) {
    int backup=parseIndex;
    boolean not=false;
    if (readIf("String_Node_Str")) {
      not=true;
      if (isToken("String_Node_Str")) {
        parseIndex=backup;
        currentToken="String_Node_Str";
        break;
      }
    }
    if (readIf("String_Node_Str")) {
      Expression b=readConcat();
      Expression esc=null;
      if (readIf("String_Node_Str")) {
        esc=readConcat();
      }
      recompileAlways=true;
      r=new CompareLike(database,r,b,esc,false);
    }
 else     if (readIf("String_Node_Str")) {
      Function function=Function.getFunction(database,"String_Node_Str");
      function.setDataType(new Column("String_Node_Str",Value.STRING_IGNORECASE));
      function.setParameter(0,r);
      r=function;
      Expression b=readConcat();
      Expression esc=null;
      if (readIf("String_Node_Str")) {
        esc=readConcat();
      }
      recompileAlways=true;
      r=new CompareLike(database,r,b,esc,false);
    }
 else     if (readIf("String_Node_Str")) {
      Expression b=readConcat();
      recompileAlways=true;
      r=new CompareLike(database,r,b,null,true);
    }
 else     if (readIf("String_Node_Str")) {
      if (readIf("String_Node_Str")) {
        if (readIf("String_Node_Str")) {
          r=new Comparison(session,Comparison.IS_NOT_NULL,r,null);
        }
 else         if (readIf("String_Node_Str")) {
          read("String_Node_Str");
          r=new Comparison(session,Comparison.EQUAL_NULL_SAFE,r,readConcat());
        }
 else {
          r=new Comparison(session,Comparison.NOT_EQUAL_NULL_SAFE,r,readConcat());
        }
      }
 else       if (readIf("String_Node_Str")) {
        r=new Comparison(session,Comparison.IS_NULL,r,null);
      }
 else       if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        r=new Comparison(session,Comparison.NOT_EQUAL_NULL_SAFE,r,readConcat());
      }
 else {
        r=new Comparison(session,Comparison.EQUAL_NULL_SAFE,r,readConcat());
      }
    }
 else     if (readIf("String_Node_Str")) {
      read("String_Node_Str");
      if (readIf("String_Node_Str")) {
        if (database.getMode().prohibitEmptyInPredicate) {
          throw getSyntaxError();
        }
        r=ValueExpression.get(ValueBoolean.get(false));
      }
 else {
        if (isSelect()) {
          Query query=parseSelect();
          query.setNeverLazy(true);
          r=new ConditionInSelect(database,r,query,false,Comparison.EQUAL);
        }
 else {
          ArrayList<Expression> v=New.arrayList();
          Expression last;
          do {
            last=readExpression();
            v.add(last);
          }
 while (readIf("String_Node_Str"));
          if (v.size() == 1 && (last instanceof Subquery)) {
            Subquery s=(Subquery)last;
            Query q=s.getQuery();
            r=new ConditionInSelect(database,r,q,false,Comparison.EQUAL);
          }
 else {
            r=new ConditionIn(database,r,v);
          }
        }
        read("String_Node_Str");
      }
    }
 else     if (readIf("String_Node_Str")) {
      Expression low=readConcat();
      read("String_Node_Str");
      Expression high=readConcat();
      Expression condLow=new Comparison(session,Comparison.SMALLER_EQUAL,low,r);
      Expression condHigh=new Comparison(session,Comparison.BIGGER_EQUAL,high,r);
      r=new ConditionAndOr(ConditionAndOr.AND,condLow,condHigh);
    }
 else {
      int compareType=getCompareType(currentTokenType);
      if (compareType < 0) {
        break;
      }
      read();
      if (readIf("String_Node_Str")) {
        read("String_Node_Str");
        Query query=parseSelect();
        r=new ConditionInSelect(database,r,query,true,compareType);
        read("String_Node_Str");
      }
 else       if (readIf("String_Node_Str") || readIf("String_Node_Str")) {
        read("String_Node_Str");
        Query query=parseSelect();
        r=new ConditionInSelect(database,r,query,false,compareType);
        read("String_Node_Str");
      }
 else {
        Expression right=readConcat();
        if (SysProperties.OLD_STYLE_OUTER_JOIN && readIf("String_Node_Str") && readIf("String_Node_Str")&& readIf("String_Node_Str")) {
          if (r instanceof ExpressionColumn && right instanceof ExpressionColumn) {
            ExpressionColumn leftCol=(ExpressionColumn)r;
            ExpressionColumn rightCol=(ExpressionColumn)right;
            ArrayList<TableFilter> filters=currentSelect.getTopFilters();
            for (            TableFilter f : filters) {
              while (f != null) {
                leftCol.mapColumns(f,0);
                rightCol.mapColumns(f,0);
                f=f.getJoin();
              }
            }
            TableFilter leftFilter=leftCol.getTableFilter();
            TableFilter rightFilter=rightCol.getTableFilter();
            r=new Comparison(session,compareType,r,right);
            if (leftFilter != null && rightFilter != null) {
              int idx=filters.indexOf(rightFilter);
              if (idx >= 0) {
                filters.remove(idx);
                leftFilter.addJoin(rightFilter,true,false,r);
              }
 else {
                rightFilter.mapAndAddFilter(r);
              }
              r=ValueExpression.get(ValueBoolean.get(true));
            }
          }
        }
 else {
          r=new Comparison(session,compareType,r,right);
        }
      }
    }
    if (not) {
      r=new ConditionNot(r);
    }
  }
  return r;
}