tests still pass when caching unprepared statements
speed up parameter substitution

store the offsets of the bind values, then only index to bind value
locations before joining the array