mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Put back a backwards-compatible version of sampling support functions.
Commit 83e176ec18
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.
This commit is contained in:
@ -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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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 @@
|
|||||||
* 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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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;
|
|||||||
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 */
|
||||||
|
Reference in New Issue
Block a user