1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * amapi.h |
4 | * API for Postgres index access methods. |
5 | * |
6 | * Copyright (c) 2015-2019, PostgreSQL Global Development Group |
7 | * |
8 | * src/include/access/amapi.h |
9 | * |
10 | *------------------------------------------------------------------------- |
11 | */ |
12 | #ifndef AMAPI_H |
13 | #define AMAPI_H |
14 | |
15 | #include "access/genam.h" |
16 | |
17 | /* |
18 | * We don't wish to include planner header files here, since most of an index |
19 | * AM's implementation isn't concerned with those data structures. To allow |
20 | * declaring amcostestimate_function here, use forward struct references. |
21 | */ |
22 | struct PlannerInfo; |
23 | struct IndexPath; |
24 | |
25 | /* Likewise, this file shouldn't depend on execnodes.h. */ |
26 | struct IndexInfo; |
27 | |
28 | |
29 | /* |
30 | * Properties for amproperty API. This list covers properties known to the |
31 | * core code, but an index AM can define its own properties, by matching the |
32 | * string property name. |
33 | */ |
34 | typedef enum IndexAMProperty |
35 | { |
36 | AMPROP_UNKNOWN = 0, /* anything not known to core code */ |
37 | AMPROP_ASC, /* column properties */ |
38 | AMPROP_DESC, |
39 | AMPROP_NULLS_FIRST, |
40 | AMPROP_NULLS_LAST, |
41 | AMPROP_ORDERABLE, |
42 | AMPROP_DISTANCE_ORDERABLE, |
43 | AMPROP_RETURNABLE, |
44 | AMPROP_SEARCH_ARRAY, |
45 | AMPROP_SEARCH_NULLS, |
46 | AMPROP_CLUSTERABLE, /* index properties */ |
47 | AMPROP_INDEX_SCAN, |
48 | AMPROP_BITMAP_SCAN, |
49 | AMPROP_BACKWARD_SCAN, |
50 | AMPROP_CAN_ORDER, /* AM properties */ |
51 | AMPROP_CAN_UNIQUE, |
52 | AMPROP_CAN_MULTI_COL, |
53 | AMPROP_CAN_EXCLUDE, |
54 | AMPROP_CAN_INCLUDE |
55 | } IndexAMProperty; |
56 | |
57 | |
58 | /* |
59 | * Callback function signatures --- see indexam.sgml for more info. |
60 | */ |
61 | |
62 | /* build new index */ |
63 | typedef IndexBuildResult *(*ambuild_function) (Relation heapRelation, |
64 | Relation indexRelation, |
65 | struct IndexInfo *indexInfo); |
66 | |
67 | /* build empty index */ |
68 | typedef void (*ambuildempty_function) (Relation indexRelation); |
69 | |
70 | /* insert this tuple */ |
71 | typedef bool (*aminsert_function) (Relation indexRelation, |
72 | Datum *values, |
73 | bool *isnull, |
74 | ItemPointer heap_tid, |
75 | Relation heapRelation, |
76 | IndexUniqueCheck checkUnique, |
77 | struct IndexInfo *indexInfo); |
78 | |
79 | /* bulk delete */ |
80 | typedef IndexBulkDeleteResult *(*ambulkdelete_function) (IndexVacuumInfo *info, |
81 | IndexBulkDeleteResult *stats, |
82 | IndexBulkDeleteCallback callback, |
83 | void *callback_state); |
84 | |
85 | /* post-VACUUM cleanup */ |
86 | typedef IndexBulkDeleteResult *(*amvacuumcleanup_function) (IndexVacuumInfo *info, |
87 | IndexBulkDeleteResult *stats); |
88 | |
89 | /* can indexscan return IndexTuples? */ |
90 | typedef bool (*amcanreturn_function) (Relation indexRelation, int attno); |
91 | |
92 | /* estimate cost of an indexscan */ |
93 | typedef void (*amcostestimate_function) (struct PlannerInfo *root, |
94 | struct IndexPath *path, |
95 | double loop_count, |
96 | Cost *indexStartupCost, |
97 | Cost *indexTotalCost, |
98 | Selectivity *indexSelectivity, |
99 | double *indexCorrelation, |
100 | double *indexPages); |
101 | |
102 | /* parse index reloptions */ |
103 | typedef bytea *(*amoptions_function) (Datum reloptions, |
104 | bool validate); |
105 | |
106 | /* report AM, index, or index column property */ |
107 | typedef bool (*amproperty_function) (Oid index_oid, int attno, |
108 | IndexAMProperty prop, const char *propname, |
109 | bool *res, bool *isnull); |
110 | |
111 | /* name of phase as used in progress reporting */ |
112 | typedef char *(*ambuildphasename_function) (int64 phasenum); |
113 | |
114 | /* validate definition of an opclass for this AM */ |
115 | typedef bool (*amvalidate_function) (Oid opclassoid); |
116 | |
117 | /* prepare for index scan */ |
118 | typedef IndexScanDesc (*ambeginscan_function) (Relation indexRelation, |
119 | int nkeys, |
120 | int norderbys); |
121 | |
122 | /* (re)start index scan */ |
123 | typedef void (*amrescan_function) (IndexScanDesc scan, |
124 | ScanKey keys, |
125 | int nkeys, |
126 | ScanKey orderbys, |
127 | int norderbys); |
128 | |
129 | /* next valid tuple */ |
130 | typedef bool (*amgettuple_function) (IndexScanDesc scan, |
131 | ScanDirection direction); |
132 | |
133 | /* fetch all valid tuples */ |
134 | typedef int64 (*amgetbitmap_function) (IndexScanDesc scan, |
135 | TIDBitmap *tbm); |
136 | |
137 | /* end index scan */ |
138 | typedef void (*amendscan_function) (IndexScanDesc scan); |
139 | |
140 | /* mark current scan position */ |
141 | typedef void (*ammarkpos_function) (IndexScanDesc scan); |
142 | |
143 | /* restore marked scan position */ |
144 | typedef void (*amrestrpos_function) (IndexScanDesc scan); |
145 | |
146 | /* |
147 | * Callback function signatures - for parallel index scans. |
148 | */ |
149 | |
150 | /* estimate size of parallel scan descriptor */ |
151 | typedef Size (*amestimateparallelscan_function) (void); |
152 | |
153 | /* prepare for parallel index scan */ |
154 | typedef void (*aminitparallelscan_function) (void *target); |
155 | |
156 | /* (re)start parallel index scan */ |
157 | typedef void (*amparallelrescan_function) (IndexScanDesc scan); |
158 | |
159 | /* |
160 | * API struct for an index AM. Note this must be stored in a single palloc'd |
161 | * chunk of memory. |
162 | */ |
163 | typedef struct IndexAmRoutine |
164 | { |
165 | NodeTag type; |
166 | |
167 | /* |
168 | * Total number of strategies (operators) by which we can traverse/search |
169 | * this AM. Zero if AM does not have a fixed set of strategy assignments. |
170 | */ |
171 | uint16 amstrategies; |
172 | /* total number of support functions that this AM uses */ |
173 | uint16 amsupport; |
174 | /* does AM support ORDER BY indexed column's value? */ |
175 | bool amcanorder; |
176 | /* does AM support ORDER BY result of an operator on indexed column? */ |
177 | bool amcanorderbyop; |
178 | /* does AM support backward scanning? */ |
179 | bool amcanbackward; |
180 | /* does AM support UNIQUE indexes? */ |
181 | bool amcanunique; |
182 | /* does AM support multi-column indexes? */ |
183 | bool amcanmulticol; |
184 | /* does AM require scans to have a constraint on the first index column? */ |
185 | bool amoptionalkey; |
186 | /* does AM handle ScalarArrayOpExpr quals? */ |
187 | bool amsearcharray; |
188 | /* does AM handle IS NULL/IS NOT NULL quals? */ |
189 | bool amsearchnulls; |
190 | /* can index storage data type differ from column data type? */ |
191 | bool amstorage; |
192 | /* can an index of this type be clustered on? */ |
193 | bool amclusterable; |
194 | /* does AM handle predicate locks? */ |
195 | bool ampredlocks; |
196 | /* does AM support parallel scan? */ |
197 | bool amcanparallel; |
198 | /* does AM support columns included with clause INCLUDE? */ |
199 | bool amcaninclude; |
200 | /* type of data stored in index, or InvalidOid if variable */ |
201 | Oid amkeytype; |
202 | |
203 | /* |
204 | * If you add new properties to either the above or the below lists, then |
205 | * they should also (usually) be exposed via the property API (see |
206 | * IndexAMProperty at the top of the file, and utils/adt/amutils.c). |
207 | */ |
208 | |
209 | /* interface functions */ |
210 | ambuild_function ambuild; |
211 | ambuildempty_function ambuildempty; |
212 | aminsert_function aminsert; |
213 | ambulkdelete_function ambulkdelete; |
214 | amvacuumcleanup_function amvacuumcleanup; |
215 | amcanreturn_function amcanreturn; /* can be NULL */ |
216 | amcostestimate_function amcostestimate; |
217 | amoptions_function amoptions; |
218 | amproperty_function amproperty; /* can be NULL */ |
219 | ambuildphasename_function ambuildphasename; /* can be NULL */ |
220 | amvalidate_function amvalidate; |
221 | ambeginscan_function ambeginscan; |
222 | amrescan_function amrescan; |
223 | amgettuple_function amgettuple; /* can be NULL */ |
224 | amgetbitmap_function amgetbitmap; /* can be NULL */ |
225 | amendscan_function amendscan; |
226 | ammarkpos_function ammarkpos; /* can be NULL */ |
227 | amrestrpos_function amrestrpos; /* can be NULL */ |
228 | |
229 | /* interface functions to support parallel index scans */ |
230 | amestimateparallelscan_function amestimateparallelscan; /* can be NULL */ |
231 | aminitparallelscan_function aminitparallelscan; /* can be NULL */ |
232 | amparallelrescan_function amparallelrescan; /* can be NULL */ |
233 | } IndexAmRoutine; |
234 | |
235 | |
236 | /* Functions in access/index/amapi.c */ |
237 | extern IndexAmRoutine *GetIndexAmRoutine(Oid amhandler); |
238 | extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror); |
239 | |
240 | #endif /* AMAPI_H */ |
241 | |