| 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 | |