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 | |