Re: [BUGS] BUG #14737: Wrong PL/pgSQL behaviour - Mailing list pgsql-bugs
| From | Frank Gard |
|---|---|
| Subject | Re: [BUGS] BUG #14737: Wrong PL/pgSQL behaviour |
| Date | |
| Msg-id | 19713a56-5ac0-4749-de0e-0a3ebb546b73@familie-gard.de Whole thread Raw |
| In response to | Re: [BUGS] BUG #14737: Wrong PL/pgSQL behaviour ("David G. Johnston" <david.g.johnston@gmail.com>) |
| Responses |
Re: [BUGS] BUG #14737: Wrong PL/pgSQL behaviour
|
| List | pgsql-bugs |
Hi David,
thanks for your instant reply. Unfortunately, I disagree your rating that
this behaviour is not a bug.
The problem here is not that RANDOM() has different values for each row.
This is exactly the expected behaviour. But if I do a numerical FOR loop
iterating the range from 1 to p_anzahl, and every time I do an UPDATE
which increments a "counter", then after the loop, the counter should
equal to p_anzahl (and nothing else).
My function simulates throwing the dice for p_anzahl times, counting how
often each of the dots you have as the result, and returns the distribution
of the results (… times 1 dot, … times 2 dots, and so on) as a table.
In addition, the result should not differ at all between the two variants of
the function. What makes, semantically, the difference? There's none at all!
For your convenience, here I add the diff between the two variants:
--- variant1.sql 2017-07-07 22:40:44.308024705 +0200
+++ variant2.sql 2017-07-07 22:40:36.975977660 +0200
@@ -13,6 +13,7 @@ SELECT * FROM ttb_histogramm ORDER BY wert ; v_ergebnis tp_histogramm;
+ v_zufall INTEGER;BEGIN EXECUTE c_drop; EXECUTE c_create;
@@ -20,11 +21,12 @@ INSERT INTO ttb_histogramm( wert, anzahl ) VALUES ( v_wert, 0 ); END LOOP; FOR
v_anzahlIN 1 .. p_anzahl LOOP
+ v_zufall := p_von + FLOOR( ( 1 + p_bis - p_von ) * RANDOM() ); UPDATE ttb_histogramm SET
anzahl = anzahl + 1 WHERE
- wert = p_von + FLOOR( ( 1 + p_bis - p_von ) * RANDOM() )
+ wert = v_zufall ; END LOOP; FOR r_histogramm IN c_histogramm LOOP
Thanks a lot,
Frank.
Am 07.07.2017 um 18:28 schrieb David G. Johnston:
> On Fri, Jul 7, 2017 at 9:10 AM, <frank.von.postgresql.org@familie-gard.de
<mailto:frank.von.postgresql.org@familie-gard.de>>wrote:
>
> Bug reference: 14737
> Logged by: Frank Gard
> Email address: frank.von.postgresql.org@familie-gard.de <mailto:frank.von.postgresql.org@familie-gard.de>
> PostgreSQL version: 9.6.3
> Operating system: Debian GNU/Linux
>
>
> Not a bug - RANDOM() is a volatile function so it gets evaluated once per row.
>
> UPDATE ttb_histogramm
> SET
> anzahl = anzahl + 1
> WHERE
> wert = p_von + FLOOR( ( 1 + p_bis - p_von ) * RANDOM() )
>
>
> Unfortunately this is not the case. When calling it
> multiple times, it returns numbers smaller and greater, and always different
> values for each call. Very strange (to me)!!!
>
>
> Which is the symptom one will see if, for every row, the value of random is different.
>
>
> When I change my function a little bit, writing the random number into an
> INTEGER variable, and using this variable within my UPDATE statement,
> everything works fine:
>
>
> Then this is what you should do.
>
> David J.
>
pgsql-bugs by date: