1 /*------------------------------------------------------------------------- 2 * 3 * pg_aggregate.h 4 * definition of the "aggregate" system catalog (pg_aggregate) 5 * 6 * 7 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/catalog/pg_aggregate.h 11 * 12 * NOTES 13 * The Catalog.pm module reads this file and derives schema 14 * information. 15 * 16 *------------------------------------------------------------------------- 17 */ 18 #ifndef PG_AGGREGATE_H 19 #define PG_AGGREGATE_H 20 21 #include "catalog/genbki.h" 22 #include "catalog/pg_aggregate_d.h" 23 24 #include "catalog/objectaddress.h" 25 #include "nodes/pg_list.h" 26 27 /* ---------------------------------------------------------------- 28 * pg_aggregate definition. 29 * cpp turns this into typedef struct FormData_pg_aggregate 30 * ---------------------------------------------------------------- 31 */ 32 CATALOG(pg_aggregate,2600,AggregateRelationId) BKI_WITHOUT_OIDS 33 { 34 /* pg_proc OID of the aggregate itself */ 35 regproc aggfnoid BKI_LOOKUP(pg_proc); 36 37 /* aggregate kind, see AGGKIND_ categories below */ 38 char aggkind BKI_DEFAULT(n); 39 40 /* number of arguments that are "direct" arguments */ 41 int16 aggnumdirectargs BKI_DEFAULT(0); 42 43 /* transition function */ 44 regproc aggtransfn BKI_LOOKUP(pg_proc); 45 46 /* final function (0 if none) */ 47 regproc aggfinalfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 48 49 /* combine function (0 if none) */ 50 regproc aggcombinefn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 51 52 /* function to convert transtype to bytea (0 if none) */ 53 regproc aggserialfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 54 55 /* function to convert bytea to transtype (0 if none) */ 56 regproc aggdeserialfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 57 58 /* forward function for moving-aggregate mode (0 if none) */ 59 regproc aggmtransfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 60 61 /* inverse function for moving-aggregate mode (0 if none) */ 62 regproc aggminvtransfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 63 64 /* final function for moving-aggregate mode (0 if none) */ 65 regproc aggmfinalfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc); 66 67 /* true to pass extra dummy arguments to aggfinalfn */ 68 bool aggfinalextra BKI_DEFAULT(f); 69 70 /* true to pass extra dummy arguments to aggmfinalfn */ 71 bool aggmfinalextra BKI_DEFAULT(f); 72 73 /* tells whether aggfinalfn modifies transition state */ 74 char aggfinalmodify BKI_DEFAULT(r); 75 76 /* tells whether aggmfinalfn modifies transition state */ 77 char aggmfinalmodify BKI_DEFAULT(r); 78 79 /* associated sort operator (0 if none) */ 80 Oid aggsortop BKI_DEFAULT(0) BKI_LOOKUP(pg_operator); 81 82 /* type of aggregate's transition (state) data */ 83 Oid aggtranstype BKI_LOOKUP(pg_type); 84 85 /* estimated size of state data (0 for default estimate) */ 86 int32 aggtransspace BKI_DEFAULT(0); 87 88 /* type of moving-aggregate state data (0 if none) */ 89 Oid aggmtranstype BKI_DEFAULT(0) BKI_LOOKUP(pg_type); 90 91 /* estimated size of moving-agg state (0 for default est) */ 92 int32 aggmtransspace BKI_DEFAULT(0); 93 94 #ifdef CATALOG_VARLEN /* variable-length fields start here */ 95 96 /* initial value for transition state (can be NULL) */ 97 text agginitval BKI_DEFAULT(_null_); 98 99 /* initial value for moving-agg state (can be NULL) */ 100 text aggminitval BKI_DEFAULT(_null_); 101 #endif 102 } FormData_pg_aggregate; 103 104 /* ---------------- 105 * Form_pg_aggregate corresponds to a pointer to a tuple with 106 * the format of pg_aggregate relation. 107 * ---------------- 108 */ 109 typedef FormData_pg_aggregate *Form_pg_aggregate; 110 111 #ifdef EXPOSE_TO_CLIENT_CODE 112 113 /* 114 * Symbolic values for aggkind column. We distinguish normal aggregates 115 * from ordered-set aggregates (which have two sets of arguments, namely 116 * direct and aggregated arguments) and from hypothetical-set aggregates 117 * (which are a subclass of ordered-set aggregates in which the last 118 * direct arguments have to match up in number and datatypes with the 119 * aggregated arguments). 120 */ 121 #define AGGKIND_NORMAL 'n' 122 #define AGGKIND_ORDERED_SET 'o' 123 #define AGGKIND_HYPOTHETICAL 'h' 124 125 /* Use this macro to test for "ordered-set agg including hypothetical case" */ 126 #define AGGKIND_IS_ORDERED_SET(kind) ((kind) != AGGKIND_NORMAL) 127 128 /* 129 * Symbolic values for aggfinalmodify and aggmfinalmodify columns. 130 * Preferably, finalfns do not modify the transition state value at all, 131 * but in some cases that would cost too much performance. We distinguish 132 * "pure read only" and "trashes it arbitrarily" cases, as well as the 133 * intermediate case where multiple finalfn calls are allowed but the 134 * transfn cannot be applied anymore after the first finalfn call. 135 */ 136 #define AGGMODIFY_READ_ONLY 'r' 137 #define AGGMODIFY_SHAREABLE 's' 138 #define AGGMODIFY_READ_WRITE 'w' 139 140 #endif /* EXPOSE_TO_CLIENT_CODE */ 141 142 143 extern ObjectAddress AggregateCreate(const char *aggName, 144 Oid aggNamespace, 145 char aggKind, 146 int numArgs, 147 int numDirectArgs, 148 oidvector *parameterTypes, 149 Datum allParameterTypes, 150 Datum parameterModes, 151 Datum parameterNames, 152 List *parameterDefaults, 153 Oid variadicArgType, 154 List *aggtransfnName, 155 List *aggfinalfnName, 156 List *aggcombinefnName, 157 List *aggserialfnName, 158 List *aggdeserialfnName, 159 List *aggmtransfnName, 160 List *aggminvtransfnName, 161 List *aggmfinalfnName, 162 bool finalfnExtraArgs, 163 bool mfinalfnExtraArgs, 164 char finalfnModify, 165 char mfinalfnModify, 166 List *aggsortopName, 167 Oid aggTransType, 168 int32 aggTransSpace, 169 Oid aggmTransType, 170 int32 aggmTransSpace, 171 const char *agginitval, 172 const char *aggminitval, 173 char proparallel); 174 175 #endif /* PG_AGGREGATE_H */ 176