diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2015-05-18 18:34:37 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2015-05-18 18:34:37 -0400 |
commit | 4db485e75b9672126963ae4052b50f473b30a097 (patch) | |
tree | c82504c5924d228715402e03b3dfbb2a72eed0bb /src/backend/utils/misc/sampling.c | |
parent | f5916bb7b53f8a77c95c00c5b287659958891178 (diff) | |
download | postgresql-4db485e75b9672126963ae4052b50f473b30a097.tar.gz postgresql-4db485e75b9672126963ae4052b50f473b30a097.zip |
Put back a backwards-compatible version of sampling support functions.
Commit 83e176ec18d2a91dbea1d0d1bd94c38dc47cd77c removed the longstanding
support functions for block sampling without any consideration of the
impact this would have on third-party FDWs. The new API is not notably
more functional for FDWs than the old, so forcing them to change doesn't
seem like a good thing. We can provide the old API as a wrapper (more
or less) around the new one for a minimal amount of extra code.
Diffstat (limited to 'src/backend/utils/misc/sampling.c')
-rw-r--r-- | src/backend/utils/misc/sampling.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/backend/utils/misc/sampling.c b/src/backend/utils/misc/sampling.c index 9becc63bf82..c9479ec175e 100644 --- a/src/backend/utils/misc/sampling.c +++ b/src/backend/utils/misc/sampling.c @@ -3,7 +3,7 @@ * sampling.c * Relation block sampling routines. * - * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -239,3 +239,47 @@ sampler_random_fract(SamplerRandomState randstate) { return pg_erand48(randstate); } + + +/* + * Backwards-compatible API for block sampling + * + * This code is now deprecated, but since it's still in use by many FDWs, + * we should keep it for awhile at least. The functionality is the same as + * sampler_random_fract/reservoir_init_selection_state/reservoir_get_next_S, + * except that a common random state is used across all callers. + */ +static ReservoirStateData oldrs; + +double +anl_random_fract(void) +{ + /* initialize if first time through */ + if (oldrs.randstate[0] == 0) + sampler_random_init_state(random(), oldrs.randstate); + + /* and compute a random fraction */ + return sampler_random_fract(oldrs.randstate); +} + +double +anl_init_selection_state(int n) +{ + /* initialize if first time through */ + if (oldrs.randstate[0] == 0) + sampler_random_init_state(random(), oldrs.randstate); + + /* Initial value of W (for use when Algorithm Z is first applied) */ + return exp(-log(sampler_random_fract(oldrs.randstate)) / n); +} + +double +anl_get_next_S(double t, int n, double *stateptr) +{ + double result; + + oldrs.W = *stateptr; + result = reservoir_get_next_S(&oldrs, t, n); + *stateptr = oldrs.W; + return result; +} |