Today, while in the middle of some tangentially related changes, I was able to confirm that the simpler NLJ method of building the output tuple via cheap getNValue calls is more appropriate than the NLIJ's eval calls -- the evals ARE always just doing an over-elaborate getNValue. I was also able to work up a planner-based solution to the inner/outer tuple_idx issue you found. I think I may get this change submitted to a branch in the next day or so -- I've just got a few test regressions to patch.