| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * pg_aggregate.h |
| 4 | * definition of the "aggregate" system catalog (pg_aggregate) |
| 5 | * |
| 6 | * |
| 7 | * Portions Copyright (c) 1996-2019, 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) |
| 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 BKI_DEFAULT(f); |
| 69 | |
| 70 | /* true to pass extra dummy arguments to aggmfinalfn */ |
| 71 | bool 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 | bool replace, |
| 146 | char aggKind, |
| 147 | int numArgs, |
| 148 | int numDirectArgs, |
| 149 | oidvector *parameterTypes, |
| 150 | Datum allParameterTypes, |
| 151 | Datum parameterModes, |
| 152 | Datum parameterNames, |
| 153 | List *parameterDefaults, |
| 154 | Oid variadicArgType, |
| 155 | List *aggtransfnName, |
| 156 | List *aggfinalfnName, |
| 157 | List *aggcombinefnName, |
| 158 | List *aggserialfnName, |
| 159 | List *aggdeserialfnName, |
| 160 | List *aggmtransfnName, |
| 161 | List *aggminvtransfnName, |
| 162 | List *aggmfinalfnName, |
| 163 | bool , |
| 164 | bool , |
| 165 | char finalfnModify, |
| 166 | char mfinalfnModify, |
| 167 | List *aggsortopName, |
| 168 | Oid aggTransType, |
| 169 | int32 aggTransSpace, |
| 170 | Oid aggmTransType, |
| 171 | int32 aggmTransSpace, |
| 172 | const char *agginitval, |
| 173 | const char *aggminitval, |
| 174 | char proparallel); |
| 175 | |
| 176 | #endif /* PG_AGGREGATE_H */ |
| 177 | |