mirror of
https://github.com/postgres/postgres.git
synced 2025-10-24 01:29:19 +03:00
Add SQL-accessible functions for inspecting index AM properties.
Per discussion, we should provide such functions to replace the lost ability to discover AM properties by inspecting pg_am (cf commit65c5fcd35). The added functionality is also meant to displace any code that was looking directly at pg_index.indoption, since we'd rather not believe that the bit meanings in that field are part of any client API contract. As future-proofing, define the SQL API to not assume that properties that are currently AM-wide or index-wide will remain so unless they logically must be; instead, expose them only when inquiring about a specific index or even specific index column. Also provide the ability for an index AM to override the behavior. In passing, document pg_am.amtype, overlooked in commit473b93287. Andrew Gierth, with kibitzing by me and others Discussion: <87mvl5on7n.fsf@news-spur.riddles.org.uk>
This commit is contained in:
@@ -26,6 +26,34 @@ struct IndexPath;
|
||||
struct IndexInfo;
|
||||
|
||||
|
||||
/*
|
||||
* Properties for amproperty API. This list covers properties known to the
|
||||
* core code, but an index AM can define its own properties, by matching the
|
||||
* string property name.
|
||||
*/
|
||||
typedef enum IndexAMProperty
|
||||
{
|
||||
AMPROP_UNKNOWN = 0, /* anything not known to core code */
|
||||
AMPROP_ASC, /* column properties */
|
||||
AMPROP_DESC,
|
||||
AMPROP_NULLS_FIRST,
|
||||
AMPROP_NULLS_LAST,
|
||||
AMPROP_ORDERABLE,
|
||||
AMPROP_DISTANCE_ORDERABLE,
|
||||
AMPROP_RETURNABLE,
|
||||
AMPROP_SEARCH_ARRAY,
|
||||
AMPROP_SEARCH_NULLS,
|
||||
AMPROP_CLUSTERABLE, /* index properties */
|
||||
AMPROP_INDEX_SCAN,
|
||||
AMPROP_BITMAP_SCAN,
|
||||
AMPROP_BACKWARD_SCAN,
|
||||
AMPROP_CAN_ORDER, /* AM properties */
|
||||
AMPROP_CAN_UNIQUE,
|
||||
AMPROP_CAN_MULTI_COL,
|
||||
AMPROP_CAN_EXCLUDE
|
||||
} IndexAMProperty;
|
||||
|
||||
|
||||
/*
|
||||
* Callback function signatures --- see indexam.sgml for more info.
|
||||
*/
|
||||
@@ -72,6 +100,11 @@ typedef void (*amcostestimate_function) (struct PlannerInfo *root,
|
||||
typedef bytea *(*amoptions_function) (Datum reloptions,
|
||||
bool validate);
|
||||
|
||||
/* report AM, index, or index column property */
|
||||
typedef bool (*amproperty_function) (Oid index_oid, int attno,
|
||||
IndexAMProperty prop, const char *propname,
|
||||
bool *res, bool *isnull);
|
||||
|
||||
/* validate definition of an opclass for this AM */
|
||||
typedef bool (*amvalidate_function) (Oid opclassoid);
|
||||
|
||||
@@ -154,6 +187,7 @@ typedef struct IndexAmRoutine
|
||||
amcanreturn_function amcanreturn; /* can be NULL */
|
||||
amcostestimate_function amcostestimate;
|
||||
amoptions_function amoptions;
|
||||
amproperty_function amproperty; /* can be NULL */
|
||||
amvalidate_function amvalidate;
|
||||
ambeginscan_function ambeginscan;
|
||||
amrescan_function amrescan;
|
||||
@@ -167,7 +201,7 @@ typedef struct IndexAmRoutine
|
||||
|
||||
/* Functions in access/index/amapi.c */
|
||||
extern IndexAmRoutine *GetIndexAmRoutine(Oid amhandler);
|
||||
extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid);
|
||||
extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror);
|
||||
|
||||
extern Datum amvalidate(PG_FUNCTION_ARGS);
|
||||
|
||||
|
||||
@@ -492,6 +492,9 @@ extern bool gistvalidate(Oid opclassoid);
|
||||
#define GIST_DEFAULT_FILLFACTOR 90
|
||||
|
||||
extern bytea *gistoptions(Datum reloptions, bool validate);
|
||||
extern bool gistproperty(Oid index_oid, int attno,
|
||||
IndexAMProperty prop, const char *propname,
|
||||
bool *res, bool *isnull);
|
||||
extern bool gistfitpage(IndexTuple *itvec, int len);
|
||||
extern bool gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete, Size freespace);
|
||||
extern void gistcheckpage(Relation rel, Buffer buf);
|
||||
|
||||
@@ -748,6 +748,9 @@ extern void _bt_end_vacuum_callback(int code, Datum arg);
|
||||
extern Size BTreeShmemSize(void);
|
||||
extern void BTreeShmemInit(void);
|
||||
extern bytea *btoptions(Datum reloptions, bool validate);
|
||||
extern bool btproperty(Oid index_oid, int attno,
|
||||
IndexAMProperty prop, const char *propname,
|
||||
bool *res, bool *isnull);
|
||||
|
||||
/*
|
||||
* prototypes for functions in nbtvalidate.c
|
||||
|
||||
Reference in New Issue
Block a user