collate test now failing

Started by Kevin Grittneralmost 11 years ago6 messages
#1Kevin Grittner
kgrittn@ymail.com
1 attachment(s)

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)
  

======================================================================

#2Kevin Grittner
kgrittn@ymail.com
In reply to: Kevin Grittner (#1)
Re: collate test now failing

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

#3Robert Haas
robertmhaas@gmail.com
In reply to: Kevin Grittner (#2)
1 attachment(s)
Re: collate test now failing

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);
+		}
 	}
 
 	/*
#4Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#3)
Re: collate test now failing

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

#5Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#4)
Re: collate test now failing

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

#6Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#5)
Re: collate test now failing

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