提交 4db485e7 编写于 作者: T Tom Lane

Put back a backwards-compatible version of sampling support functions.

Commit 83e176ec 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.
上级 f5916bb7
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* sampling.c * sampling.c
* Relation block sampling routines. * 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 * Portions Copyright (c) 1994, Regents of the University of California
* *
* *
...@@ -239,3 +239,47 @@ sampler_random_fract(SamplerRandomState randstate) ...@@ -239,3 +239,47 @@ sampler_random_fract(SamplerRandomState randstate)
{ {
return pg_erand48(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;
}
...@@ -198,4 +198,9 @@ extern void analyze_rel(Oid relid, RangeVar *relation, int options, ...@@ -198,4 +198,9 @@ extern void analyze_rel(Oid relid, RangeVar *relation, int options,
BufferAccessStrategy bstrategy); BufferAccessStrategy bstrategy);
extern bool std_typanalyze(VacAttrStats *stats); 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 */ #endif /* VACUUM_H */
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* sampling.h * sampling.h
* definitions for sampling functions * 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 * Portions Copyright (c) 1994, Regents of the University of California
* *
* src/include/utils/sampling.h * src/include/utils/sampling.h
...@@ -13,7 +13,8 @@ ...@@ -13,7 +13,8 @@
#ifndef SAMPLING_H #ifndef SAMPLING_H
#define SAMPLING_H #define SAMPLING_H
#include "storage/bufmgr.h" #include "storage/block.h" /* for typedef BlockNumber */
/* Random generator for sampling code */ /* Random generator for sampling code */
typedef unsigned short SamplerRandomState[3]; typedef unsigned short SamplerRandomState[3];
...@@ -23,6 +24,7 @@ extern void sampler_random_init_state(long seed, ...@@ -23,6 +24,7 @@ extern void sampler_random_init_state(long seed,
extern double sampler_random_fract(SamplerRandomState randstate); extern double sampler_random_fract(SamplerRandomState randstate);
/* Block sampling methods */ /* Block sampling methods */
/* Data structure for Algorithm S from Knuth 3.4.2 */ /* Data structure for Algorithm S from Knuth 3.4.2 */
typedef struct typedef struct
{ {
...@@ -40,7 +42,8 @@ extern void BlockSampler_Init(BlockSampler bs, BlockNumber nblocks, ...@@ -40,7 +42,8 @@ extern void BlockSampler_Init(BlockSampler bs, BlockNumber nblocks,
extern bool BlockSampler_HasMore(BlockSampler bs); extern bool BlockSampler_HasMore(BlockSampler bs);
extern BlockNumber BlockSampler_Next(BlockSampler bs); extern BlockNumber BlockSampler_Next(BlockSampler bs);
/* Reservoid sampling methods */ /* Reservoir sampling methods */
typedef struct typedef struct
{ {
double W; double W;
...@@ -52,4 +55,11 @@ typedef ReservoirStateData *ReservoirState; ...@@ -52,4 +55,11 @@ typedef ReservoirStateData *ReservoirState;
extern void reservoir_init_selection_state(ReservoirState rs, int n); extern void reservoir_init_selection_state(ReservoirState rs, int n);
extern double reservoir_get_next_S(ReservoirState rs, double t, 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 */ #endif /* SAMPLING_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册