Subject: Re: bug#6643: [PATCH] sort: fix a bug with sort -u and xmemcoll0, and tune keycompare

From: Paul Eggert <[email-masked]>
Date: Thu, 15 Jul 2010 18:23:11 -0700

On 07/15/10 17:46, Pádraig Brady wrote:
> I'll add a few basic tests I think to run under $mb_locale

Thanks.  Jim also reminded me that I should add at least one test for
this bug, so I just pushed the one enclosed below.  The test is
locale-dependent and is not guaranteed to catch the bug on every host,
but it did catch the bug in my RHEL 5 build host and that's good
enough.

>> This patch also tunes keycompare slightly.  I should have
>> broken it up into a different patch, but it sort of snuck in.
> 
> I didn't do that because then you're just doing what xmemcoll()
> is doing anyway.  I.E. the other xmemcoll0() is more cache
> efficient because it doesn't need to write anything in the
> normal case for each comparison.

It's still a win in terms of number of memory access, no? as it avoids
useless saves and restores of the junk byte after the lines.  Also,
with my pedantic hat on, it avoids access to uninitialized storage
(that junk byte) and thus avoids undefined behavior (though this isn't
likely to be a problem on any practical non-debugging environment).

Anywhere, here's the further patch.

>From 5ab0257f7df3658ee1ff01172b2b2ed307432155 Mon Sep 17 00:00:00 2001
From: Paul R. Eggert <[email-masked]>
Date: Thu, 15 Jul 2010 18:13:08 -0700
Subject: [PATCH] sort: add a test case for the sort -u bug

* tests/Makefile.am (TESTS): Add misc/sort-unique.
* tests/misc/sort-unique: New file.
---
 tests/Makefile.am      |    1 +
 tests/misc/sort-unique |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 0 deletions(-)
 create mode 100755 tests/misc/sort-unique

diff --git a/tests/Makefile.am b/tests/Makefile.am
index fccd000..4aa93bf 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -234,6 +234,7 @@ TESTS =						\
   misc/sort-merge-fdlimit			\
   misc/sort-month				\
   misc/sort-rand				\
+  misc/sort-unique				\
   misc/sort-version				\
   misc/split-a					\
   misc/split-fail				\
diff --git a/tests/misc/sort-unique b/tests/misc/sort-unique
new file mode 100755
index 0000000..e186d34
--- /dev/null
+++ b/tests/misc/sort-unique
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Test 'sort -u'.
+
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+if test "$VERBOSE" = yes; then
+  set -x
+  sort --version
+fi
+
+. $srcdir/test-lib.sh
+
+cat > in <<\EOF
+1
+2
+1
+3
+EOF
+
+cat > exp <<\EOF
+1
+2
+3
+EOF
+
+for LOC in C "$LOCALE_FR" "$LOCALE_FR_UTF8"; do
+  test -z "$LOC" && continue
+
+  LC_ALL=$LOC sort -u in > out || { fail=1; break; }
+  compare exp out || { fail=1; break; }
+done
+
+Exit $fail
-- 
1.7.1