aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2015-05-18 18:34:37 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2015-05-18 18:34:37 -0400
commit4db485e75b9672126963ae4052b50f473b30a097 (patch)
treec82504c5924d228715402e03b3dfbb2a72eed0bb
parentf5916bb7b53f8a77c95c00c5b287659958891178 (diff)
downloadpostgresql-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.
-rw-r--r--src/backend/utils/misc/sampling.c46
-rw-r--r--src/include/commands/vacuum.h5
-rw-r--r--src/include/utils/sampling.h16
3 files changed, 63 insertions, 4 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;
+}
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index ce7b28d22c7..4fb91e79cba 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 4ac208dc364..476bb002346 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 */