On 10/06/2015 04:49 PM, Robert Haas wrote:
> On Sun, Oct 4, 2015 at 11:52 AM, Andrew Dunstan <andrew@dunslane.net> wrote:
>> Isn't this arguably a Fedora regression? What did they change in F23 to make
>> it fail? I note that F23 is still in Beta.
> Maybe, but it's pretty unfriendly for us to complain about a library
> issue, if it is one, by failing an Assert(). People with
> non-assert-enabled builds will just get wrong answers. Yuck.
>
> Thinking about how this could happen, I believe that one possibility
> is that there are two strings A and B and a locale L such that
> strcoll_l(A, B, L) and memcmp(strxfrm(A, L), strxfrm(B, L)) disagree
> (that is, the results are of different sign, or one is zero and the
> other is not).
>
> I don't have an environment handy to reproduce this, but it would be
> nifty if someone could figure out exactly what strings are failing and
> then provide the strcoll result and the strxfrm blobs for those
> strings.
Well, it's failing like this:
TRAP: FailedAssertion("!(compareResult < 0)", File: "nodeMergejoin.c", Line: 942) 2015-10-04 20:03:42.894 UTC
[56118614.53cf:2]LOG: server process (PID 21681) was terminated by signal 6: Aborted 2015-10-04 20:03:42.894 UTC
[56118614.53cf:3]DETAIL: Failed process was running: SELECT p1.oid, p1.proname, p2.oid, p2.proname FROM
pg_procAS p1, pg_proc AS p2 WHERE p1.oid < p2.oid AND p1.prosrc = p2.prosrc AND
p1.prolang = 12 AND p2.prolang = 12 AND (p1.proisagg = false OR p2.proisagg = false) AND
(p1.prolang!= p2.prolang OR p1.proisagg != p2.proisagg OR p1.prosecdef != p2.prosecdef
OR p1.proleakproof != p2.proleakproof OR p1.proisstrict != p2.proisstrict OR
p1.proretset != p2.proretset OR p1.provolatile != p2.provolatile OR p1.pronargs !=
p2.pronargs);
So I think the right way would be to do something like this:
for p1 in select * from pg_proc loop for p2 in select * from pg_proc loop raise notice 'p1: %, %,
p2:% %', p1.proname, p1.prosrc, p2,proname, p2,prosrc; perform p1.prosrc = p2.prosrc; end loop;
endloop;
Then the last notice raised should show us the offending strings at
least. Does that make sense?
Alternatively one could try to get it with a debugger.
cheers
andrew