Re: random() (was Re: New GUC to sample log queries)
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Peter Geoghegan <pg@bowt.ie>
Cc: Alvaro Herrera <alvherre@2ndquadrant.com>,
Adrien Nayrat <adrien.nayrat@anayrat.info>,
Thomas Munro <thomas.munro@enterprisedb.com>,
Dmitry Dolgov <9erthalion6@gmail.com>,
Tomas Vondra <tomas.vondra@2ndquadrant.com>,
Vik Fearing <vik.fearing@2ndquadrant.com>,
Robert Haas <robertmhaas@gmail.com>,
Michael Paquier <michael@paquier.xyz>,
David Rowley <david.rowley@2ndquadrant.com>,
Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2018-12-26T19:31:06Z
Lists: pgsql-hackers
Peter Geoghegan <pg@bowt.ie> writes: > On Wed, Dec 26, 2018 at 10:45 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: >> I wonder whether we should establish a project policy to avoid use >> of random() for internal purposes, ie try to get to a point where >> drandom() is the only caller in the backend. A quick grep says >> that there's a dozen or so callers, so this patch certainly isn't >> the only offender ... but should we make an effort to convert them >> all to use, say, pg_erand48()? I think all the existing callers >> could happily share a process-wide random state, so we could make >> a wrapper that's no harder to use than random(). > I've used setseed() to make nbtree's "getting tired" behavior > deterministic for specific test cases I've developed -- the random() > choice of whether to split a page full of duplicates, or continue > right in search of free space becomes predictable. I've used this to > determine whether my nbtree patch's pg_upgrade'd indexes have > precisely the same behavior as v3 indexes on the master branch > (precisely the same in terms of the structure of the final index > following a bulk load). TBH, I'd call it a bug --- maybe even a low-grade security hazard --- that it's possible to affect that from user level. In fact, contemplating that for a bit: it is possible, as things stand in HEAD, for a user to control which of his statements will get logged if the DBA has enabled log_statement_sample_rate. It doesn't take a lot of creativity to think of ways to abuse that. So maybe Coverity had the right idea to start with. There might well be debugging value in affecting internal PRNG usages, but let's please not think it's a good idea that that's trivially reachable from SQL. regards, tom lane
Commits
-
Use pg_strong_random() to select each server process's random seed.
- 4203842a1cd0 12.0 landed
-
Use a separate random seed for SQL random()/setseed() functions.
- 6645ad6bdd81 12.0 landed
-
Marginal performance hacking in erand48.c.
- 6b9bba2df8d4 12.0 landed
-
Fix latent problem with pg_jrand48().
- e09046641114 12.0 landed
- f256995e33d2 10.7 landed
- d58e01f8abe2 11.2 landed
-
Silence compiler warning
- 9dc122585551 12.0 landed
-
Add log_statement_sample_rate parameter
- 88bdbd3f7460 12.0 landed