1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * tsmapi.h |
4 | * API for tablesample methods |
5 | * |
6 | * Copyright (c) 2015-2019, PostgreSQL Global Development Group |
7 | * |
8 | * src/include/access/tsmapi.h |
9 | * |
10 | *------------------------------------------------------------------------- |
11 | */ |
12 | #ifndef TSMAPI_H |
13 | #define TSMAPI_H |
14 | |
15 | #include "nodes/execnodes.h" |
16 | #include "nodes/pathnodes.h" |
17 | |
18 | |
19 | /* |
20 | * Callback function signatures --- see tablesample-method.sgml for more info. |
21 | */ |
22 | |
23 | typedef void (*SampleScanGetSampleSize_function) (PlannerInfo *root, |
24 | RelOptInfo *baserel, |
25 | List *paramexprs, |
26 | BlockNumber *pages, |
27 | double *tuples); |
28 | |
29 | typedef void (*InitSampleScan_function) (SampleScanState *node, |
30 | int eflags); |
31 | |
32 | typedef void (*BeginSampleScan_function) (SampleScanState *node, |
33 | Datum *params, |
34 | int nparams, |
35 | uint32 seed); |
36 | |
37 | typedef BlockNumber (*NextSampleBlock_function) (SampleScanState *node, |
38 | BlockNumber nblocks); |
39 | |
40 | typedef OffsetNumber (*NextSampleTuple_function) (SampleScanState *node, |
41 | BlockNumber blockno, |
42 | OffsetNumber maxoffset); |
43 | |
44 | typedef void (*EndSampleScan_function) (SampleScanState *node); |
45 | |
46 | /* |
47 | * TsmRoutine is the struct returned by a tablesample method's handler |
48 | * function. It provides pointers to the callback functions needed by the |
49 | * planner and executor, as well as additional information about the method. |
50 | * |
51 | * More function pointers are likely to be added in the future. |
52 | * Therefore it's recommended that the handler initialize the struct with |
53 | * makeNode(TsmRoutine) so that all fields are set to NULL. This will |
54 | * ensure that no fields are accidentally left undefined. |
55 | */ |
56 | typedef struct TsmRoutine |
57 | { |
58 | NodeTag type; |
59 | |
60 | /* List of datatype OIDs for the arguments of the TABLESAMPLE clause */ |
61 | List *parameterTypes; |
62 | |
63 | /* Can method produce repeatable samples across, or even within, queries? */ |
64 | bool repeatable_across_queries; |
65 | bool repeatable_across_scans; |
66 | |
67 | /* Functions for planning a SampleScan on a physical table */ |
68 | SampleScanGetSampleSize_function SampleScanGetSampleSize; |
69 | |
70 | /* Functions for executing a SampleScan on a physical table */ |
71 | InitSampleScan_function InitSampleScan; /* can be NULL */ |
72 | BeginSampleScan_function BeginSampleScan; |
73 | NextSampleBlock_function NextSampleBlock; /* can be NULL */ |
74 | NextSampleTuple_function NextSampleTuple; |
75 | EndSampleScan_function EndSampleScan; /* can be NULL */ |
76 | } TsmRoutine; |
77 | |
78 | |
79 | /* Functions in access/tablesample/tablesample.c */ |
80 | extern TsmRoutine *GetTsmRoutine(Oid tsmhandler); |
81 | |
82 | #endif /* TSMAPI_H */ |
83 | |