On Thu, Oct 18, 2018 at 04:57:23PM +0200, Martijn van Duren wrote:

> On 10/18/18 16:51, Martijn van Duren wrote:
> > When reviewing otto@'s diff I found the following, which was also part  
> > of the r1.4 import. I managed to contact michaels and he told me that he
> > couldn't recollect anything other then what was in the commit message
> > and other local changes were most likely not intentional.
> > 
> > I tested this behaviour with FreeBSD, NetBSD, gjoin and with csrg join
> > prior to the current structure and the firs 3 all include a link on join
> > and the latter segfaults if the join field is not available.
> > 
> > POSIX doesn't mention how the code should work if a particular field is
> > not available, so we get no guidance from there.
> > 
> > Personally I think our current behaviour is more logical, most likely
> > because I'm used to SQL joins, but considering no one else does it it
> > might be wise to get back into the fold.
> > 
> > Note that this still is in line with fixing PR-1356 and the other BSDs
> > need to swap the return 1 and return -1 case to make things work on
> > their versions of join.
> 
> And for the kids playing along at home, this works better with the
> test files included:
> $ cat /tmp/z1 
> a
> b d
> $ cat /tmp/z2 
> a
> c d
> > 
> > $ join -j 2 -e empty /tmp/z1 /tmp/z2
> > d b c
> > $ ./obj/join -j 2 -e empty /tmp/z1 /tmp/z2
> > empty a a
> > d b c
> > 
> > thoughts?

I think we want this. Don't forget to update the regress test and keep
an eye open for regressions in real-life usage.

        -Otto


> > 
> > martijn@
> > 
> > Index: join.c
> > ===================================================================
> > RCS file: /cvs/src/usr.bin/join/join.c,v
> > retrieving revision 1.29
> > diff -u -p -r1.29 join.c
> > --- join.c  18 Oct 2018 09:36:48 -0000      1.29
> > +++ join.c  18 Oct 2018 14:43:10 -0000
> > @@ -362,10 +362,10 @@ int
> >  cmp(LINE *lp1, u_long fieldno1, LINE *lp2, u_long fieldno2)
> >  {
> >     if (lp1->fieldcnt <= fieldno1)
> > -           return (-1);
> > -   else if (lp2->fieldcnt <= fieldno2)
> > -           return (1);
> > -   return (strcmp(lp1->fields[fieldno1], lp2->fields[fieldno2]));
> > +           return lp2->fieldcnt <= fieldno2 ? 0 : -1;
> > +   if (lp2->fieldcnt <= fieldno2)
> > +           return 1;
> > +   return strcmp(lp1->fields[fieldno1], lp2->fields[fieldno2]);
> >  }
> >  
> >  void
> > 

Reply via email to