cleanup.cleanup(this, stmt, rs);
cleanup.cleanup(this, null, rs);
    protected <Result> Result internalExecute(final QueryPreperator prep,                                              final QueryResultMunger<Result> munger,                                              final QueryPostMungeCleanup cleanup)    {        final ReWrittenStatement rewritten = rewriter.rewrite(sql, getParameters());        PreparedStatement stmt = null;        ResultSet rs = null;        try        {            try            {                stmt = connection.prepareStatement(rewritten.getSql());            }            catch (SQLException e)            {                throw new UnableToCreateStatementException(e);            }            try            {                rewritten.bind(getParameters(), stmt);            }            catch (SQLException e)            {                throw new UnableToExecuteStatementException("Unable to bindBinaryStream parameters to query", e);            }            try            {                prep.prepare(stmt);            }            catch (SQLException e)            {                throw new UnableToExecuteStatementException("Unable to configure JDBC statement to 1", e);            }            try            {                stmt.execute();            }            catch (SQLException e)            {                throw new UnableToExecuteStatementException(e);            }            try            {                final Pair<Result, ResultSet> r = munger.munge(stmt);                rs = r.getSecond();                return r.getFirst();            }            catch (SQLException e)            {                throw new ResultSetException("Exception thrown while attempting to traverse the result set", e);            }        }        finally        {            cleanup.cleanup(this, stmt, rs);        }    }