code: private String generateParsedSql(ProcessedInput processedInput) {
          String originalSql = processedInput.getOriginalSql();
          StringBuilder actualSql = new StringBuilder();
          List paramNames = processedInput.getSqlParameterNames();
          int lastIndex = 0;
          for (int i = 0; i < paramNames.size(); i++) {
              int[] indexes = processedInput.getSqlParameterBoundaries().get(i);
              int startIndex = indexes[0];
              int endIndex = indexes[1];
              actualSql.append(originalSql.substring(lastIndex, startIndex));
              actualSql.append("?");
              lastIndex = endIndex;
          }
          actualSql.append(originalSql.substring(lastIndex, originalSql.length()));
          return actualSql.toString();
      }
docs: Parse the SQL statement and locate any placeholders or named parameters.
  Named parameters are substituted for a JDBC placeholder and any select list
  is expanded to the required number of placeholders.  Select lists may contain
  an array of objects and in that case the placeholders will be grouped and
  enclosed with parantheses.  This allows for the use of "expression lists" in
  the SQL statement like:<br/>
  select id, name, state from table where (name, age) in (('John', 35), ('Ann', 50))
  <p>The parameter values passed in are used to determine the number of
  placeholder to be used for a select list. Select lists should be limited
  to 100 or fewer elements. A larger number of elements is not guaramteed to
  be supported by the database and is strictly vendor-dependent.
  
  @param processedInput processed Input which stores original SQL and parsed SQL parameters
  @return the SQL statement with substituted parameters