On 2018-03-29 16:40:29 -0700, Andres Freund wrote: > Hi, > > On 2018-03-30 10:08:54 +1030, Andrew Dunstan wrote: > > On Fri, Mar 30, 2018 at 5:00 AM, Andres Freund <and...@anarazel.de> wrote: > > > this'll trigger one slot_getsomeattrs(slot, 2) call from within qual > > > evaluation, and then a slot_getsomeattrs(slot, 4) from within the > > > projection code. If you then imagine a tuple where only the first > > > column exists physically, we'd copy b twice, because attno is only going > > > to be one 1. I think we might just want to check tts nvalid in > > > getmissingattrs? > > > OK. so add something like this to the top of slot_getmissingattrs()? > > > > startAttNum = Max(startAttNum, slot->tts_nvalid); > > Yea, I think that should do the trick.
Hm, or if you want to microoptimize ;): if (startAttNum < slot->tts_nvalid) startAttNum = slot->tts_nvalid I think that can use cmov (i.e. no visible branch), which Max() probably can't usefully. Don't think the compiler can figure out that slot->tts_nvalid cannot be smaller than startAttNum. Greetings, Andres Freund