diff --git a/src/backend/utils/misc/sampling.c b/src/backend/utils/misc/sampling.c index 9becc63bf82be372f66d2926bae9f899b60fd3ca..c9479ec175e33972e070d7cda7d646b187d494e5 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; +} diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index ce7b28d22c7850de8dd6a623857716f1d3efaa71..4fb91e79cba12024cc3dbf7484bd6db52645cbb6 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -198,4 +198,9 @@ extern void analyze_rel(Oid relid, RangeVar *relation, int options, BufferAccessStrategy bstrategy); extern bool std_typanalyze(VacAttrStats *stats); +/* in utils/misc/sampling.c --- duplicate of declarations in utils/sampling.h */ +extern double anl_random_fract(void); +extern double anl_init_selection_state(int n); +extern double anl_get_next_S(double t, int n, double *stateptr); + #endif /* VACUUM_H */ diff --git a/src/include/utils/sampling.h b/src/include/utils/sampling.h index 4ac208dc3645ae18586d28b34a90254a10990263..476bb002346da8bbbcae7e3ee55b0257b2cd6665 100644 --- a/src/include/utils/sampling.h +++ b/src/include/utils/sampling.h @@ -3,7 +3,7 @@ * sampling.h * definitions for sampling functions * - * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/sampling.h @@ -13,7 +13,8 @@ #ifndef SAMPLING_H #define SAMPLING_H -#include "storage/bufmgr.h" +#include "storage/block.h" /* for typedef BlockNumber */ + /* Random generator for sampling code */ typedef unsigned short SamplerRandomState[3]; @@ -23,6 +24,7 @@ extern void sampler_random_init_state(long seed, extern double sampler_random_fract(SamplerRandomState randstate); /* Block sampling methods */ + /* Data structure for Algorithm S from Knuth 3.4.2 */ typedef struct { @@ -40,7 +42,8 @@ extern void BlockSampler_Init(BlockSampler bs, BlockNumber nblocks, extern bool BlockSampler_HasMore(BlockSampler bs); extern BlockNumber BlockSampler_Next(BlockSampler bs); -/* Reservoid sampling methods */ +/* Reservoir sampling methods */ + typedef struct { double W; @@ -52,4 +55,11 @@ typedef ReservoirStateData *ReservoirState; extern void reservoir_init_selection_state(ReservoirState rs, int n); extern double reservoir_get_next_S(ReservoirState rs, double t, int n); +/* Old API, still in use by assorted FDWs */ +/* For backwards compatibility, these declarations are duplicated in vacuum.h */ + +extern double anl_random_fract(void); +extern double anl_init_selection_state(int n); +extern double anl_get_next_S(double t, int n, double *stateptr); + #endif /* SAMPLING_H */