1 /*------------------------------------------------------------------------- 2 * 3 * lsyscache.h 4 * Convenience routines for common queries in the system catalog cache. 5 * 6 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/utils/lsyscache.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 #ifndef LSYSCACHE_H 14 #define LSYSCACHE_H 15 16 #include "access/attnum.h" 17 #include "access/htup.h" 18 #include "nodes/pg_list.h" 19 20 /* avoid including subscripting.h here */ 21 struct SubscriptRoutines; 22 23 /* Result list element for get_op_btree_interpretation */ 24 typedef struct OpBtreeInterpretation 25 { 26 Oid opfamily_id; /* btree opfamily containing operator */ 27 int strategy; /* its strategy number */ 28 Oid oplefttype; /* declared left input datatype */ 29 Oid oprighttype; /* declared right input datatype */ 30 } OpBtreeInterpretation; 31 32 /* I/O function selector for get_type_io_data */ 33 typedef enum IOFuncSelector 34 { 35 IOFunc_input, 36 IOFunc_output, 37 IOFunc_receive, 38 IOFunc_send 39 } IOFuncSelector; 40 41 /* Flag bits for get_attstatsslot */ 42 #define ATTSTATSSLOT_VALUES 0x01 43 #define ATTSTATSSLOT_NUMBERS 0x02 44 45 /* Result struct for get_attstatsslot */ 46 typedef struct AttStatsSlot 47 { 48 /* Always filled: */ 49 Oid staop; /* Actual staop for the found slot */ 50 Oid stacoll; /* Actual collation for the found slot */ 51 /* Filled if ATTSTATSSLOT_VALUES is specified: */ 52 Oid valuetype; /* Actual datatype of the values */ 53 Datum *values; /* slot's "values" array, or NULL if none */ 54 int nvalues; /* length of values[], or 0 */ 55 /* Filled if ATTSTATSSLOT_NUMBERS is specified: */ 56 float4 *numbers; /* slot's "numbers" array, or NULL if none */ 57 int nnumbers; /* length of numbers[], or 0 */ 58 59 /* Remaining fields are private to get_attstatsslot/free_attstatsslot */ 60 void *values_arr; /* palloc'd values array, if any */ 61 void *numbers_arr; /* palloc'd numbers array, if any */ 62 } AttStatsSlot; 63 64 /* Hook for plugins to get control in get_attavgwidth() */ 65 typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum); 66 extern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook; 67 68 extern bool op_in_opfamily(Oid opno, Oid opfamily); 69 extern int get_op_opfamily_strategy(Oid opno, Oid opfamily); 70 extern Oid get_op_opfamily_sortfamily(Oid opno, Oid opfamily); 71 extern void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op, 72 int *strategy, 73 Oid *lefttype, 74 Oid *righttype); 75 extern Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, 76 int16 strategy); 77 extern bool get_ordering_op_properties(Oid opno, 78 Oid *opfamily, Oid *opcintype, int16 *strategy); 79 extern Oid get_equality_op_for_ordering_op(Oid opno, bool *reverse); 80 extern Oid get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type); 81 extern List *get_mergejoin_opfamilies(Oid opno); 82 extern bool get_compatible_hash_operators(Oid opno, 83 Oid *lhs_opno, Oid *rhs_opno); 84 extern bool get_op_hash_functions(Oid opno, 85 RegProcedure *lhs_procno, RegProcedure *rhs_procno); 86 extern List *get_op_btree_interpretation(Oid opno); 87 extern bool equality_ops_are_compatible(Oid opno1, Oid opno2); 88 extern bool comparison_ops_are_compatible(Oid opno1, Oid opno2); 89 extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, 90 int16 procnum); 91 extern char *get_attname(Oid relid, AttrNumber attnum, bool missing_ok); 92 extern AttrNumber get_attnum(Oid relid, const char *attname); 93 extern int get_attstattarget(Oid relid, AttrNumber attnum); 94 extern char get_attgenerated(Oid relid, AttrNumber attnum); 95 extern Oid get_atttype(Oid relid, AttrNumber attnum); 96 extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum, 97 Oid *typid, int32 *typmod, Oid *collid); 98 extern Datum get_attoptions(Oid relid, int16 attnum); 99 extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok); 100 extern char *get_collation_name(Oid colloid); 101 extern bool get_collation_isdeterministic(Oid colloid); 102 extern char *get_constraint_name(Oid conoid); 103 extern Oid get_constraint_index(Oid conoid); 104 extern char *get_language_name(Oid langoid, bool missing_ok); 105 extern Oid get_opclass_family(Oid opclass); 106 extern Oid get_opclass_input_type(Oid opclass); 107 extern bool get_opclass_opfamily_and_input_type(Oid opclass, 108 Oid *opfamily, Oid *opcintype); 109 extern RegProcedure get_opcode(Oid opno); 110 extern char *get_opname(Oid opno); 111 extern Oid get_op_rettype(Oid opno); 112 extern void op_input_types(Oid opno, Oid *lefttype, Oid *righttype); 113 extern bool op_mergejoinable(Oid opno, Oid inputtype); 114 extern bool op_hashjoinable(Oid opno, Oid inputtype); 115 extern bool op_strict(Oid opno); 116 extern char op_volatile(Oid opno); 117 extern Oid get_commutator(Oid opno); 118 extern Oid get_negator(Oid opno); 119 extern RegProcedure get_oprrest(Oid opno); 120 extern RegProcedure get_oprjoin(Oid opno); 121 extern char *get_func_name(Oid funcid); 122 extern Oid get_func_namespace(Oid funcid); 123 extern Oid get_func_rettype(Oid funcid); 124 extern int get_func_nargs(Oid funcid); 125 extern Oid get_func_signature(Oid funcid, Oid **argtypes, int *nargs); 126 extern Oid get_func_variadictype(Oid funcid); 127 extern bool get_func_retset(Oid funcid); 128 extern bool func_strict(Oid funcid); 129 extern char func_volatile(Oid funcid); 130 extern char func_parallel(Oid funcid); 131 extern char get_func_prokind(Oid funcid); 132 extern bool get_func_leakproof(Oid funcid); 133 extern RegProcedure get_func_support(Oid funcid); 134 extern Oid get_relname_relid(const char *relname, Oid relnamespace); 135 extern char *get_rel_name(Oid relid); 136 extern Oid get_rel_namespace(Oid relid); 137 extern Oid get_rel_type_id(Oid relid); 138 extern char get_rel_relkind(Oid relid); 139 extern bool get_rel_relispartition(Oid relid); 140 extern Oid get_rel_tablespace(Oid relid); 141 extern char get_rel_persistence(Oid relid); 142 extern Oid get_transform_fromsql(Oid typid, Oid langid, List *trftypes); 143 extern Oid get_transform_tosql(Oid typid, Oid langid, List *trftypes); 144 extern bool get_typisdefined(Oid typid); 145 extern int16 get_typlen(Oid typid); 146 extern bool get_typbyval(Oid typid); 147 extern void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval); 148 extern void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, 149 char *typalign); 150 extern Oid getTypeIOParam(HeapTuple typeTuple); 151 extern void get_type_io_data(Oid typid, 152 IOFuncSelector which_func, 153 int16 *typlen, 154 bool *typbyval, 155 char *typalign, 156 char *typdelim, 157 Oid *typioparam, 158 Oid *func); 159 extern char get_typstorage(Oid typid); 160 extern Node *get_typdefault(Oid typid); 161 extern char get_typtype(Oid typid); 162 extern bool type_is_rowtype(Oid typid); 163 extern bool type_is_enum(Oid typid); 164 extern bool type_is_range(Oid typid); 165 extern bool type_is_multirange(Oid typid); 166 extern void get_type_category_preferred(Oid typid, 167 char *typcategory, 168 bool *typispreferred); 169 extern Oid get_typ_typrelid(Oid typid); 170 extern Oid get_element_type(Oid typid); 171 extern Oid get_array_type(Oid typid); 172 extern Oid get_promoted_array_type(Oid typid); 173 extern Oid get_base_element_type(Oid typid); 174 extern void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam); 175 extern void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena); 176 extern void getTypeBinaryInputInfo(Oid type, Oid *typReceive, Oid *typIOParam); 177 extern void getTypeBinaryOutputInfo(Oid type, Oid *typSend, bool *typIsVarlena); 178 extern Oid get_typmodin(Oid typid); 179 extern Oid get_typcollation(Oid typid); 180 extern bool type_is_collatable(Oid typid); 181 extern RegProcedure get_typsubscript(Oid typid, Oid *typelemp); 182 extern const struct SubscriptRoutines *getSubscriptingRoutines(Oid typid, 183 Oid *typelemp); 184 extern Oid getBaseType(Oid typid); 185 extern Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod); 186 extern int32 get_typavgwidth(Oid typid, int32 typmod); 187 extern int32 get_attavgwidth(Oid relid, AttrNumber attnum); 188 extern bool get_attstatsslot(AttStatsSlot *sslot, HeapTuple statstuple, 189 int reqkind, Oid reqop, int flags); 190 extern void free_attstatsslot(AttStatsSlot *sslot); 191 extern char *get_namespace_name(Oid nspid); 192 extern char *get_namespace_name_or_temp(Oid nspid); 193 extern Oid get_range_subtype(Oid rangeOid); 194 extern Oid get_range_collation(Oid rangeOid); 195 extern Oid get_range_multirange(Oid rangeOid); 196 extern Oid get_multirange_range(Oid multirangeOid); 197 extern Oid get_index_column_opclass(Oid index_oid, int attno); 198 extern bool get_index_isreplident(Oid index_oid); 199 extern bool get_index_isvalid(Oid index_oid); 200 extern bool get_index_isclustered(Oid index_oid); 201 202 #define type_is_array(typid) (get_element_type(typid) != InvalidOid) 203 /* type_is_array_domain accepts both plain arrays and domains over arrays */ 204 #define type_is_array_domain(typid) (get_base_element_type(typid) != InvalidOid) 205 206 #define TypeIsToastable(typid) (get_typstorage(typid) != TYPSTORAGE_PLAIN) 207 208 #endif /* LSYSCACHE_H */ 209