Re: Strange behavior of the random() function

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: r(dot)zharkov(at)postgrespro(dot)ru
Cc: "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Strange behavior of the random() function
Date: 2018-09-26 03:35:40
Message-ID: 30382.1537932940@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

r(dot)zharkov(at)postgrespro(dot)ru writes:
> Can anybody explain me that strange behavior?

It's a squishiness in the SQL language, if you ask me. Consider this
simplified query:

select random() from generate_series(1, 3) order by random();

Would you expect the output of this query to appear ordered, or not?
There's an argument to be made that the two instances of random() ought
to be executed independently for each row, so that the output would
(probably) seem unordered. But practical usage generally expects that
we unify the two textually-identical expressions, so that the behavior
is the same as

select random() from generate_series(1, 3) order by 1;

> select random() as "rnd", random() as "rnd1", random() as "rnd2"
> from generate_series( 1, 3 )
> order by random();
> All values in any row are the same.

Here, we've unified *all* the appearances of the ORDER BY expression in
the SELECT-list. Maybe that's wrong, but it's hard to make a principled
argument why we shouldn't do it. If only one of them should be unified
with the ORDER BY expression, then which one?

> select random() as "rnd", random() as "rnd1", random() as "rnd2"
> from generate_series( 1, 3 )
> order by random() || 'test';

Here, the ORDER BY expression is not a match to any SELECT-list
expression, so they don't get unified with it.

If you'd like more control over this sort of thing, I'd recommend
using a sub-select, ie

select x,y,z from
(select random() as x, random() as y, random() as z
from generate_series(1,3)) ss
order by x;

which makes it clear what your intention is.

There's some interesting related behaviors: compare the outputs of

select random() as x, random() as y, random() as z
from generate_series(1,3) order by 1;
select random() as x, random() as y, random() as z
from generate_series(1,3) order by 1,2;
select random() as x, random() as y, random() as z
from generate_series(1,3) order by 1,2,3;

I could buy the idea that there's a bug involved in that; but again
the question is exactly which textually identical expressions should
get unified and why.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message jimmy 2018-09-26 05:50:27 Re:Re: how to know whether query data from memory after pg_prewarm
Previous Message r.zharkov 2018-09-26 02:54:56 Strange behavior of the random() function