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?
> 
> 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