Program: 51282
Project: 51282
Buggy source:
/** 
 * Bug 793616: Deeply nested UNION function takes forever to validate. (Problem was that each argument of a function was validated twice, hence the validation time was <code>O(2 ^ depth)</code>.)
 */
public void _testBug793616(){
  if (MondrianProperties.instance().TestExpDependencies.get() > 0) {
    return;
  }
  final long start=System.currentTimeMillis();
  Connection connection=getTestContext().getFoodMartConnection();
  final String queryString="String_Node_Str" + "String_Node_Str" + "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str";
  Query query=connection.parseQuery(queryString);
  final long afterParseMillis=System.currentTimeMillis();
  final long afterParseNonDbMillis=afterParseMillis - Util.dbTimeMillis();
  final long parseMillis=afterParseMillis - start;
  assertTrue("String_Node_Str" + parseMillis + "String_Node_Str",parseMillis <= 10000);
  Result result=connection.execute(query);
  assertEquals(59,result.getAxes()[1].getPositions().size());
  final long afterExecMillis=System.currentTimeMillis();
  final long afterExecNonDbMillis=afterExecMillis - Util.dbTimeMillis();
  final long execNonDbMillis=afterExecNonDbMillis - afterParseNonDbMillis;
  final long execMillis=(afterExecMillis - afterParseMillis);
  assertTrue("String_Node_Str" + execMillis + "String_Node_Str"+ execNonDbMillis+ "String_Node_Str",execNonDbMillis <= 2000 && execMillis <= 30000);
}

Fixed version (ground truth):
/** 
 * Bug 793616: Deeply nested UNION function takes forever to validate. (Problem was that each argument of a function was validated twice, hence the validation time was <code>O(2 ^ depth)</code>.)
 */
public void _testBug793616(){
  if (props.TestExpDependencies.get() > 0) {
    return;
  }
  final long start=System.currentTimeMillis();
  Connection connection=getTestContext().getFoodMartConnection();
  final String queryString="String_Node_Str" + "String_Node_Str" + "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str";
  Query query=connection.parseQuery(queryString);
  final long afterParseMillis=System.currentTimeMillis();
  final long afterParseNonDbMillis=afterParseMillis - Util.dbTimeMillis();
  final long parseMillis=afterParseMillis - start;
  assertTrue("String_Node_Str" + parseMillis + "String_Node_Str",parseMillis <= 10000);
  Result result=connection.execute(query);
  assertEquals(59,result.getAxes()[1].getPositions().size());
  final long afterExecMillis=System.currentTimeMillis();
  final long afterExecNonDbMillis=afterExecMillis - Util.dbTimeMillis();
  final long execNonDbMillis=afterExecNonDbMillis - afterParseNonDbMillis;
  final long execMillis=(afterExecMillis - afterParseMillis);
  assertTrue("String_Node_Str" + execMillis + "String_Node_Str"+ execNonDbMillis+ "String_Node_Str",execNonDbMillis <= 2000 && execMillis <= 30000);
}