1 /*------------------------------------------------------------------------- 2 * 3 * pg_index.h 4 * definition of the system "index" relation (pg_index) 5 * along with the relation's initial contents. 6 * 7 * 8 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group 9 * Portions Copyright (c) 1994, Regents of the University of California 10 * 11 * src/include/catalog/pg_index.h 12 * 13 * NOTES 14 * the genbki.pl script reads this file and generates .bki 15 * information from the DATA() statements. 16 * 17 *------------------------------------------------------------------------- 18 */ 19 #ifndef PG_INDEX_H 20 #define PG_INDEX_H 21 22 #include "catalog/genbki.h" 23 24 /* ---------------- 25 * pg_index definition. cpp turns this into 26 * typedef struct FormData_pg_index. 27 * ---------------- 28 */ 29 #define IndexRelationId 2610 30 31 CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO 32 { 33 Oid indexrelid; /* OID of the index */ 34 Oid indrelid; /* OID of the relation it indexes */ 35 int16 indnatts; /* number of columns in index */ 36 bool indisunique; /* is this a unique index? */ 37 bool indisprimary; /* is this index for primary key? */ 38 bool indisexclusion; /* is this index for exclusion constraint? */ 39 bool indimmediate; /* is uniqueness enforced immediately? */ 40 bool indisclustered; /* is this the index last clustered by? */ 41 bool indisvalid; /* is this index valid for use by queries? */ 42 bool indcheckxmin; /* must we wait for xmin to be old? */ 43 bool indisready; /* is this index ready for inserts? */ 44 bool indislive; /* is this index alive at all? */ 45 bool indisreplident; /* is this index the identity for replication? */ 46 47 /* variable-length fields start here, but we allow direct access to indkey */ 48 int2vector indkey; /* column numbers of indexed cols, or 0 */ 49 50 #ifdef CATALOG_VARLEN 51 oidvector indcollation; /* collation identifiers */ 52 oidvector indclass; /* opclass identifiers */ 53 int2vector indoption; /* per-column flags (AM-specific meanings) */ 54 pg_node_tree indexprs; /* expression trees for index attributes that 55 * are not simple column references; one for 56 * each zero entry in indkey[] */ 57 pg_node_tree indpred; /* expression tree for predicate, if a partial 58 * index; else NULL */ 59 #endif 60 } FormData_pg_index; 61 62 /* ---------------- 63 * Form_pg_index corresponds to a pointer to a tuple with 64 * the format of pg_index relation. 65 * ---------------- 66 */ 67 typedef FormData_pg_index *Form_pg_index; 68 69 /* ---------------- 70 * compiler constants for pg_index 71 * ---------------- 72 */ 73 #define Natts_pg_index 19 74 #define Anum_pg_index_indexrelid 1 75 #define Anum_pg_index_indrelid 2 76 #define Anum_pg_index_indnatts 3 77 #define Anum_pg_index_indisunique 4 78 #define Anum_pg_index_indisprimary 5 79 #define Anum_pg_index_indisexclusion 6 80 #define Anum_pg_index_indimmediate 7 81 #define Anum_pg_index_indisclustered 8 82 #define Anum_pg_index_indisvalid 9 83 #define Anum_pg_index_indcheckxmin 10 84 #define Anum_pg_index_indisready 11 85 #define Anum_pg_index_indislive 12 86 #define Anum_pg_index_indisreplident 13 87 #define Anum_pg_index_indkey 14 88 #define Anum_pg_index_indcollation 15 89 #define Anum_pg_index_indclass 16 90 #define Anum_pg_index_indoption 17 91 #define Anum_pg_index_indexprs 18 92 #define Anum_pg_index_indpred 19 93 94 /* 95 * Index AMs that support ordered scans must support these two indoption 96 * bits. Otherwise, the content of the per-column indoption fields is 97 * open for future definition. 98 */ 99 #define INDOPTION_DESC 0x0001 /* values are in reverse order */ 100 #define INDOPTION_NULLS_FIRST 0x0002 /* NULLs are first instead of last */ 101 102 /* 103 * Use of these macros is recommended over direct examination of the state 104 * flag columns where possible; this allows source code compatibility with 105 * the hacky representation used in 9.2. 106 */ 107 #define IndexIsValid(indexForm) ((indexForm)->indisvalid) 108 #define IndexIsReady(indexForm) ((indexForm)->indisready) 109 #define IndexIsLive(indexForm) ((indexForm)->indislive) 110 111 #endif /* PG_INDEX_H */ 112