]> granicus.if.org Git - postgresql/commitdiff
Put back a backwards-compatible version of sampling support functions.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 18 May 2015 22:34:37 +0000 (18:34 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 18 May 2015 22:34:37 +0000 (18:34 -0400)
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.

src/backend/utils/misc/sampling.c
src/include/commands/vacuum.h
src/include/utils/sampling.h

index 9becc63bf82be372f66d2926bae9f899b60fd3ca..c9479ec175e33972e070d7cda7d646b187d494e5 100644 (file)
@@ -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;
+}
index ce7b28d22c7850de8dd6a623857716f1d3efaa71..4fb91e79cba12024cc3dbf7484bd6db52645cbb6 100644 (file)
@@ -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 */
index 4ac208dc3645ae18586d28b34a90254a10990263..476bb002346da8bbbcae7e3ee55b0257b2cd6665 100644 (file)
@@ -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 */