collate test now failing
I think this may have just started with:
b529b65d1bf8537ca7fa024760a9782d7c8b66e5
--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Attachments:
regression.diffsapplication/octet-streamDownload
*** /home/kgrittn/pg/master/src/test/regress/expected/collate.out 2015-01-22 10:33:43.820185544 -0600
--- /home/kgrittn/pg/master/src/test/regress/results/collate.out 2015-01-22 10:41:10.540184505 -0600
***************
*** 81,89 ****
SELECT a, b FROM collate_test4 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 81,89 ----
SELECT a, b FROM collate_test4 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 95,130 ****
SELECT a, b FROM collate_test5 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, b FROM collate_test1 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, b FROM collate_test2 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 95,130 ----
SELECT a, b FROM collate_test5 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, b FROM collate_test1 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, b FROM collate_test2 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 132,149 ****
SELECT * FROM collate_test1 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT * FROM collate_test2 ORDER BY b;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 132,149 ----
SELECT * FROM collate_test1 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT * FROM collate_test2 ORDER BY b;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 213,230 ****
SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2;
a | coalesce
---+----------
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2;
a | coalesce
---+----------
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 213,230 ----
SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2;
a | coalesce
---+----------
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2;
a | coalesce
---+----------
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 238,256 ****
SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3;
a | b | greatest
---+-----+----------
- 2 | Abc | CCC
- 4 | ABD | CCC
1 | abc | abc
3 | bbc | bbc
(4 rows)
SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3;
a | b | greatest
---+-----+----------
- 2 | Abc | CCC
- 4 | ABD | CCC
1 | abc | abc
3 | bbc | bbc
(4 rows)
SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
--- 238,256 ----
SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3;
a | b | greatest
---+-----+----------
1 | abc | abc
3 | bbc | bbc
+ 2 | Abc | CCC
+ 4 | ABD | CCC
(4 rows)
SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3;
a | b | greatest
---+-----+----------
1 | abc | abc
3 | bbc | bbc
+ 2 | Abc | CCC
+ 4 | ABD | CCC
(4 rows)
SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
***************
*** 263,270 ****
SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2;
a | nullif
---+--------
- 4 | ABD
2 | Abc
3 | bbc
1 |
(4 rows)
--- 263,270 ----
SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2;
a | nullif
---+--------
2 | Abc
+ 4 | ABD
3 | bbc
1 |
(4 rows)
***************
*** 272,279 ****
SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2;
a | nullif
---+--------
- 4 | ABD
2 | Abc
3 | bbc
1 |
(4 rows)
--- 272,279 ----
SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2;
a | nullif
---+--------
2 | Abc
+ 4 | ABD
3 | bbc
1 |
(4 rows)
***************
*** 288,305 ****
SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2;
a | b
---+------
- 4 | ABD
2 | Abc
1 | abcd
3 | bbc
(4 rows)
SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2;
a | b
---+------
- 4 | ABD
2 | Abc
1 | abcd
3 | bbc
(4 rows)
--- 288,305 ----
SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2;
a | b
---+------
2 | Abc
1 | abcd
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2;
a | b
---+------
2 | Abc
1 | abcd
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 307,333 ****
SELECT a, b::testdomain FROM collate_test1 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, b::testdomain FROM collate_test2 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 307,333 ----
SELECT a, b::testdomain FROM collate_test1 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, b::testdomain FROM collate_test2 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 387,398 ****
SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2;
a | b
---+-----
- 4 | ABD
- 4 | ABD
2 | Abc
2 | Abc
1 | abc
1 | abc
3 | bbc
3 | bbc
(8 rows)
--- 387,398 ----
SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2;
a | b
---+-----
2 | Abc
2 | Abc
1 | abc
1 | abc
+ 4 | ABD
+ 4 | ABD
3 | bbc
3 | bbc
(8 rows)
***************
*** 400,408 ****
SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 400,408 ----
SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 416,423 ****
SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
3 | bbc
(3 rows)
--- 416,423 ----
SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2;
a | b
---+-----
2 | Abc
+ 4 | ABD
3 | bbc
(3 rows)
***************
*** 445,453 ****
SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 445,453 ----
SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 506,523 ****
SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2;
a | b
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 506,523 ----
SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2;
a | b
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
***************
*** 525,542 ****
SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1;
unnest
--------
- ABD
Abc
abc
bbc
(4 rows)
SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1;
unnest
--------
- ABD
Abc
abc
bbc
(4 rows)
--- 525,542 ----
SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1;
unnest
--------
Abc
abc
+ ABD
bbc
(4 rows)
SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1;
unnest
--------
Abc
abc
+ ABD
bbc
(4 rows)
***************
*** 545,562 ****
SELECT a, dup(b) FROM collate_test1 ORDER BY 2;
a | dup
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
SELECT a, dup(b) FROM collate_test2 ORDER BY 2;
a | dup
---+-----
- 4 | ABD
2 | Abc
1 | abc
3 | bbc
(4 rows)
--- 545,562 ----
SELECT a, dup(b) FROM collate_test1 ORDER BY 2;
a | dup
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
SELECT a, dup(b) FROM collate_test2 ORDER BY 2;
a | dup
---+-----
2 | Abc
1 | abc
+ 4 | ABD
3 | bbc
(4 rows)
======================================================================
Kevin Grittner <kgrittn@ymail.com> wrote:
I think this may have just started with:
b529b65d1bf8537ca7fa024760a9782d7c8b66e5
Confirmed that I get a clean check on the prior commit.
ubuntu 14.04 LTS
--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 22, 2015 at 11:50 AM, Kevin Grittner <kgrittn@ymail.com> wrote:
Kevin Grittner <kgrittn@ymail.com> wrote:
I think this may have just started with:
b529b65d1bf8537ca7fa024760a9782d7c8b66e5
Confirmed that I get a clean check on the prior commit.
Can you check whether this fixes it?
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
Attachments:
no-strxfrm-for-c.patchbinary/octet-stream; name=no-strxfrm-for-c.patchDownload
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index dba650c..9b036e8 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -63,6 +63,7 @@ typedef struct
char *buf2; /* 2nd string, or abbreviation strxfrm() buf */
int buflen1;
int buflen2;
+ bool collate_c;
hyperLogLogState abbr_card; /* Abbreviated key cardinality state */
hyperLogLogState full_card; /* Full key cardinality state */
#ifdef HAVE_LOCALE_T
@@ -1744,7 +1745,7 @@ static void
btsortsupport_worker(SortSupport ssup, Oid collid)
{
bool abbreviate = ssup->abbreviate;
- bool locale_aware = false;
+ bool collate_c = false;
TextSortSupport *tss;
#ifdef HAVE_LOCALE_T
@@ -1769,7 +1770,10 @@ btsortsupport_worker(SortSupport ssup, Oid collid)
* bttextcmp() via the fmgr trampoline.
*/
if (lc_collate_is_c(collid))
+ {
ssup->comparator = bttextfastcmp_c;
+ collate_c = true;
+ }
#ifdef WIN32
else if (GetDatabaseEncoding() == PG_UTF8)
return;
@@ -1777,7 +1781,6 @@ btsortsupport_worker(SortSupport ssup, Oid collid)
else
{
ssup->comparator = bttextfastcmp_locale;
- locale_aware = true;
/*
* We need a collation-sensitive comparison. To make things faster,
@@ -1828,7 +1831,7 @@ btsortsupport_worker(SortSupport ssup, Oid collid)
* will make use of the temporary buffers we initialize here for scratch
* space, and the abbreviation case requires additional state.
*/
- if (abbreviate || locale_aware)
+ if (abbreviate || !collate_c)
{
tss = palloc(sizeof(TextSortSupport));
tss->buf1 = palloc(TEXTBUFLEN);
@@ -1838,6 +1841,7 @@ btsortsupport_worker(SortSupport ssup, Oid collid)
#ifdef HAVE_LOCALE_T
tss->locale = locale;
#endif
+ tss->collate_c = collate_c;
ssup->ssup_extra = tss;
/*
@@ -2011,45 +2015,58 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
memset(pres, 0, sizeof(Datum));
len = VARSIZE_ANY_EXHDR(authoritative);
- /* By convention, we use buffer 1 to store and NUL-terminate text */
- if (len >= tss->buflen1)
+ /*
+ * If we're using the C collation, use memcmp(), rather than strxfrm(),
+ * to abbreviated keys. The full comparator for the C locale is always
+ * memcmp(), and we can't risk having this give a different answer.
+ * Besides, this should be faster, too.
+ */
+ if (tss->collate_c)
+ memcpy(pres, VARDATA_ANY(authoritative), Min(len, sizeof(Datum)));
+ else
{
- pfree(tss->buf1);
- tss->buflen1 = Max(len + 1, Min(tss->buflen1 * 2, MaxAllocSize));
- tss->buf1 = palloc(tss->buflen1);
- }
+ /*
+ * We're not using the C collation, so fall back on strxfrm.
+ */
- /* Just like strcoll(), strxfrm() expects a NUL-terminated string */
- memcpy(tss->buf1, VARDATA_ANY(authoritative), len);
- tss->buf1[len] = '\0';
+ /* By convention, we use buffer 1 to store and NUL-terminate text */
+ if (len >= tss->buflen1)
+ {
+ pfree(tss->buf1);
+ tss->buflen1 = Max(len + 1, Min(tss->buflen1 * 2, MaxAllocSize));
+ tss->buf1 = palloc(tss->buflen1);
+ }
- /* Don't leak memory here */
- if (PointerGetDatum(authoritative) != original)
- pfree(authoritative);
+ /* Just like strcoll(), strxfrm() expects a NUL-terminated string */
+ memcpy(tss->buf1, VARDATA_ANY(authoritative), len);
+ tss->buf1[len] = '\0';
-retry:
+ /* Don't leak memory here */
+ if (PointerGetDatum(authoritative) != original)
+ pfree(authoritative);
- /*
- * There is no special handling of the C locale here, unlike with
- * varstr_cmp(). strxfrm() is used indifferently.
- */
+ for (;;)
+ {
#ifdef HAVE_LOCALE_T
- if (tss->locale)
- bsize = strxfrm_l(tss->buf2, tss->buf1, tss->buflen2, tss->locale);
- else
+ if (tss->locale)
+ bsize = strxfrm_l(tss->buf2, tss->buf1,
+ tss->buflen2, tss->locale);
+ else
#endif
- bsize = strxfrm(tss->buf2, tss->buf1, tss->buflen2);
+ bsize = strxfrm(tss->buf2, tss->buf1, tss->buflen2);
- if (bsize >= tss->buflen2)
- {
- /*
- * The C standard states that the contents of the buffer is now
- * unspecified. Grow buffer, and retry.
- */
- pfree(tss->buf2);
- tss->buflen2 = Max(bsize + 1, Min(tss->buflen2 * 2, MaxAllocSize));
- tss->buf2 = palloc(tss->buflen2);
- goto retry;
+ if (bsize < tss->buflen2)
+ break;
+
+ /*
+ * The C standard states that the contents of the buffer is now
+ * unspecified. Grow buffer, and retry.
+ */
+ pfree(tss->buf2);
+ tss->buflen2 = Max(bsize + 1,
+ Min(tss->buflen2 * 2, MaxAllocSize));
+ tss->buf2 = palloc(tss->buflen2);
+ }
}
/*
On Thu, Jan 22, 2015 at 11:53 AM, Robert Haas <robertmhaas@gmail.com> wrote:
On Thu, Jan 22, 2015 at 11:50 AM, Kevin Grittner <kgrittn@ymail.com> wrote:
Kevin Grittner <kgrittn@ymail.com> wrote:
I think this may have just started with:
b529b65d1bf8537ca7fa024760a9782d7c8b66e5
Confirmed that I get a clean check on the prior commit.
Can you check whether this fixes it?
Kevin says (via IM) that it does, but with a compiler warning. Fixed
that and pushed.
Back to watching the buildfarm returns roll in...
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 22, 2015 at 12:04:14PM -0500, Robert Haas wrote:
On Thu, Jan 22, 2015 at 11:53 AM, Robert Haas <robertmhaas@gmail.com> wrote:
On Thu, Jan 22, 2015 at 11:50 AM, Kevin Grittner <kgrittn@ymail.com> wrote:
Kevin Grittner <kgrittn@ymail.com> wrote:
I think this may have just started with:
b529b65d1bf8537ca7fa024760a9782d7c8b66e5
Confirmed that I get a clean check on the prior commit.
Can you check whether this fixes it?
Kevin says (via IM) that it does, but with a compiler warning. Fixed
that and pushed.Back to watching the buildfarm returns roll in...
Does this explain the Windows failures too?
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ Everyone has their own god. +
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 22, 2015 at 12:07 PM, Bruce Momjian <bruce@momjian.us> wrote:
Back to watching the buildfarm returns roll in...
Does this explain the Windows failures too?
The Windows machines have mostly been failing since the original
abbreviated keys patch went in. See the message I just posted on the
"Windows buildfarm animals are still not happy with abbreviated keys
patch" thread for a fuller analysis.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers