mirror of
https://github.com/postgres/postgres.git
synced 2025-11-18 02:02:55 +03:00
The "random" regression test uses a function called oidrand(), which
takes two parameters, an OID x and an integer y, and returns "true" with probability 1/y (the OID argument is ignored). This can be useful -- for example, it can be used to select a random sampling of the rows in a table (which is what the "random" regression test uses it for). This patch removes that function, because it was old and messy. The old function had the following problems: - it was undocumented - it was poorly named - it was designed to workaround an optimizer bug that no longer exists (the OID argument is to ensure that the optimizer won't optimize away calls to the function; AFAIK marking the function as 'volatile' suffices nowadays) - it used a different random-number generation technique than the other PSRNG-related functions in the backend do (it called random() like they do, but it had its own logic for setting a set and deciding when to reseed the RNG). Ok, this patch removes oidrand(), oidsrand(), and userfntest(), and improves the SGML docs a little bit (un-commenting the setseed() documentation). Neil Conway
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.27 2002/09/04 20:31:28 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.28 2003/02/13 05:24:02 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -43,75 +43,6 @@ nonnullvalue(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_BOOL(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* oidrand (oid o, int4 X)-
|
||||
* Takes in an oid and a int4 X, and will return 'true' about 1/X of
|
||||
* the time. If X == 0, this will always return true.
|
||||
* Useful for doing random sampling or subsetting.
|
||||
*
|
||||
* Example use:
|
||||
* select * from TEMP where oidrand(TEMP.oid, 10)
|
||||
* will return about 1/10 of the tuples in TEMP
|
||||
*
|
||||
* NOTE: the OID input is not used at all. It is there just because of
|
||||
* an old optimizer bug: a qual expression containing no variables was
|
||||
* mistakenly assumed to be a constant. Pretending to access the row's OID
|
||||
* prevented the optimizer from treating the oidrand() result as constant.
|
||||
*/
|
||||
|
||||
static bool random_initialized = false;
|
||||
|
||||
Datum
|
||||
oidrand(PG_FUNCTION_ARGS)
|
||||
{
|
||||
#ifdef NOT_USED
|
||||
Oid o = PG_GETARG_OID(0);
|
||||
#endif
|
||||
int32 X = PG_GETARG_INT32(1);
|
||||
bool result;
|
||||
|
||||
if (X == 0)
|
||||
PG_RETURN_BOOL(true);
|
||||
|
||||
/*
|
||||
* We do this because the cancel key is actually a random, so we don't
|
||||
* want them to be able to request random numbers using our postmaster
|
||||
* seeded value.
|
||||
*/
|
||||
if (!random_initialized)
|
||||
{
|
||||
srandom((unsigned int) time(NULL));
|
||||
random_initialized = true;
|
||||
}
|
||||
|
||||
result = (random() % X == 0);
|
||||
PG_RETURN_BOOL(result);
|
||||
}
|
||||
|
||||
/*
|
||||
oidsrand(int32 X) -
|
||||
seeds the random number generator
|
||||
always returns true
|
||||
*/
|
||||
Datum
|
||||
oidsrand(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 X = PG_GETARG_INT32(0);
|
||||
|
||||
srandom((unsigned int) X);
|
||||
random_initialized = true;
|
||||
PG_RETURN_BOOL(true);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
userfntest(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 i = PG_GETARG_INT32(0);
|
||||
|
||||
PG_RETURN_INT32(i);
|
||||
}
|
||||
|
||||
/*
|
||||
* current_database()
|
||||
* Expose the current database to the user
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: catversion.h,v 1.175 2003/02/03 21:15:44 tgl Exp $
|
||||
* $Id: catversion.h,v 1.176 2003/02/13 05:24:02 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 200302031
|
||||
#define CATALOG_VERSION_NO 200302131
|
||||
|
||||
#endif
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: pg_proc.h,v 1.282 2003/01/28 22:13:36 tgl Exp $
|
||||
* $Id: pg_proc.h,v 1.283 2003/02/13 05:24:02 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* The script catalog/genbki.sh reads this file and generates .bki
|
||||
@@ -944,12 +944,6 @@ DESCR("greater-than");
|
||||
/* OIDS 700 - 799 */
|
||||
DATA(insert OID = 710 ( getpgusername PGNSP PGUID 12 f f t f s 0 19 "" current_user - _null_ ));
|
||||
DESCR("deprecated -- use current_user");
|
||||
DATA(insert OID = 711 ( userfntest PGNSP PGUID 12 f f t f i 1 23 "23" userfntest - _null_ ));
|
||||
DESCR("");
|
||||
DATA(insert OID = 713 ( oidrand PGNSP PGUID 12 f f t f v 2 16 "26 23" oidrand - _null_ ));
|
||||
DESCR("random");
|
||||
DATA(insert OID = 715 ( oidsrand PGNSP PGUID 12 f f t f v 1 16 "23" oidsrand - _null_ ));
|
||||
DESCR("seed random number generator");
|
||||
DATA(insert OID = 716 ( oidlt PGNSP PGUID 12 f f t f i 2 16 "26 26" oidlt - _null_ ));
|
||||
DESCR("less-than");
|
||||
DATA(insert OID = 717 ( oidle PGNSP PGUID 12 f f t f i 2 16 "26 26" oidle - _null_ ));
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: builtins.h,v 1.207 2003/02/06 20:25:33 tgl Exp $
|
||||
* $Id: builtins.h,v 1.208 2003/02/13 05:24:04 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -315,9 +315,6 @@ extern Datum float84ge(PG_FUNCTION_ARGS);
|
||||
/* misc.c */
|
||||
extern Datum nullvalue(PG_FUNCTION_ARGS);
|
||||
extern Datum nonnullvalue(PG_FUNCTION_ARGS);
|
||||
extern Datum oidrand(PG_FUNCTION_ARGS);
|
||||
extern Datum oidsrand(PG_FUNCTION_ARGS);
|
||||
extern Datum userfntest(PG_FUNCTION_ARGS);
|
||||
extern Datum current_database(PG_FUNCTION_ARGS);
|
||||
|
||||
/* not_in.c */
|
||||
|
||||
@@ -15,11 +15,11 @@ SELECT count(*) FROM onek;
|
||||
-- have a regression test which can pass/fail
|
||||
-- - thomas 1998-08-17
|
||||
SELECT count(*) AS random INTO RANDOM_TBL
|
||||
FROM onek WHERE oidrand(onek.oid, 10);
|
||||
FROM onek WHERE random() < 1.0/10;
|
||||
-- select again, the count should be different
|
||||
INSERT INTO RANDOM_TBL (random)
|
||||
SELECT count(*)
|
||||
FROM onek WHERE oidrand(onek.oid, 10);
|
||||
FROM onek WHERE random() < 1.0/10;
|
||||
-- now test the results for randomness in the correct range
|
||||
SELECT random, count(random) FROM RANDOM_TBL
|
||||
GROUP BY random HAVING count(random) > 1;
|
||||
|
||||
@@ -12,12 +12,12 @@ SELECT count(*) FROM onek;
|
||||
-- have a regression test which can pass/fail
|
||||
-- - thomas 1998-08-17
|
||||
SELECT count(*) AS random INTO RANDOM_TBL
|
||||
FROM onek WHERE oidrand(onek.oid, 10);
|
||||
FROM onek WHERE random() < 1.0/10;
|
||||
|
||||
-- select again, the count should be different
|
||||
INSERT INTO RANDOM_TBL (random)
|
||||
SELECT count(*)
|
||||
FROM onek WHERE oidrand(onek.oid, 10);
|
||||
FROM onek WHERE random() < 1.0/10;
|
||||
|
||||
-- now test the results for randomness in the correct range
|
||||
SELECT random, count(random) FROM RANDOM_TBL
|
||||
|
||||
Reference in New Issue
Block a user