aboutsummaryrefslogtreecommitdiff
path: root/src/include/catalog/pg_aggregate.h
blob: 96f08d3118cfc3e5e8e6a3f0609b30bca47c7d4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*-------------------------------------------------------------------------
 *
 * pg_aggregate.h
 *	  definition of the system "aggregate" relation (pg_aggregate)
 *	  along with the relation's initial contents.
 *
 *
 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_aggregate.h
 *
 * NOTES
 *	  the genbki.pl script reads this file and generates .bki
 *	  information from the DATA() statements.
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_AGGREGATE_H
#define PG_AGGREGATE_H

#include "catalog/genbki.h"
#include "nodes/pg_list.h"

/* ----------------------------------------------------------------
 *		pg_aggregate definition.
 *
 *		cpp turns this into typedef struct FormData_pg_aggregate
 *
 *	aggfnoid			pg_proc OID of the aggregate itself
 *	aggkind				aggregate kind, see AGGKIND_ categories below
 *	aggnumdirectargs	number of arguments that are "direct" arguments
 *	aggtransfn			transition function
 *	aggfinalfn			final function (0 if none)
 *	aggsortop			associated sort operator (0 if none)
 *	aggtranstype		type of aggregate's transition (state) data
 *	aggtransspace		estimated size of state data (0 for default estimate)
 *	agginitval			initial value for transition state (can be NULL)
 * ----------------------------------------------------------------
 */
#define AggregateRelationId  2600

CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS
{
	regproc		aggfnoid;
	char		aggkind;
	int16		aggnumdirectargs;
	regproc		aggtransfn;
	regproc		aggfinalfn;
	Oid			aggsortop;
	Oid			aggtranstype;
	int32		aggtransspace;

#ifdef CATALOG_VARLEN			/* variable-length fields start here */
	text		agginitval;
#endif
} FormData_pg_aggregate;

/* ----------------
 *		Form_pg_aggregate corresponds to a pointer to a tuple with
 *		the format of pg_aggregate relation.
 * ----------------
 */
typedef FormData_pg_aggregate *Form_pg_aggregate;

/* ----------------
 *		compiler constants for pg_aggregate
 * ----------------
 */

#define Natts_pg_aggregate					9
#define Anum_pg_aggregate_aggfnoid			1
#define Anum_pg_aggregate_aggkind			2
#define Anum_pg_aggregate_aggnumdirectargs	3
#define Anum_pg_aggregate_aggtransfn		4
#define Anum_pg_aggregate_aggfinalfn		5
#define Anum_pg_aggregate_aggsortop			6
#define Anum_pg_aggregate_aggtranstype		7
#define Anum_pg_aggregate_aggtransspace		8
#define Anum_pg_aggregate_agginitval		9

/*
 * Symbolic values for aggkind column.	We distinguish normal aggregates
 * from ordered-set aggregates (which have two sets of arguments, namely
 * direct and aggregated arguments) and from hypothetical-set aggregates
 * (which are a subclass of ordered-set aggregates in which the last
 * direct arguments have to match up in number and datatypes with the
 * aggregated arguments).
 */
#define AGGKIND_NORMAL			'n'
#define AGGKIND_ORDERED_SET		'o'
#define AGGKIND_HYPOTHETICAL	'h'

/* Use this macro to test for "ordered-set agg including hypothetical case" */
#define AGGKIND_IS_ORDERED_SET(kind)  ((kind) != AGGKIND_NORMAL)


/* ----------------
 * initial contents of pg_aggregate
 * ---------------
 */

/* avg */
DATA(insert ( 2100	n 0 int8_avg_accum	numeric_avg		0	2281	128 _null_ ));
DATA(insert ( 2101	n 0 int4_avg_accum	int8_avg		0	1016	0	"{0,0}" ));
DATA(insert ( 2102	n 0 int2_avg_accum	int8_avg		0	1016	0	"{0,0}" ));
DATA(insert ( 2103	n 0 numeric_avg_accum	numeric_avg 0	2281	128 _null_ ));
DATA(insert ( 2104	n 0 float4_accum	float8_avg		0	1022	0	"{0,0,0}" ));
DATA(insert ( 2105	n 0 float8_accum	float8_avg		0	1022	0	"{0,0,0}" ));
DATA(insert ( 2106	n 0 interval_accum	interval_avg	0	1187	0	"{0 second,0 second}" ));

/* sum */
DATA(insert ( 2107	n 0 int8_avg_accum	numeric_sum		0	2281	128 _null_ ));
DATA(insert ( 2108	n 0 int4_sum		-				0	20		0	_null_ ));
DATA(insert ( 2109	n 0 int2_sum		-				0	20		0	_null_ ));
DATA(insert ( 2110	n 0 float4pl		-				0	700		0	_null_ ));
DATA(insert ( 2111	n 0 float8pl		-				0	701		0	_null_ ));
DATA(insert ( 2112	n 0 cash_pl			-				0	790		0	_null_ ));
DATA(insert ( 2113	n 0 interval_pl		-				0	1186	0	_null_ ));
DATA(insert ( 2114	n 0 numeric_avg_accum	numeric_sum 0	2281	128 _null_ ));

/* max */
DATA(insert ( 2115	n 0 int8larger		-				413		20		0	_null_ ));
DATA(insert ( 2116	n 0 int4larger		-				521		23		0	_null_ ));
DATA(insert ( 2117	n 0 int2larger		-				520		21		0	_null_ ));
DATA(insert ( 2118	n 0 oidlarger		-				610		26		0	_null_ ));
DATA(insert ( 2119	n 0 float4larger	-				623		700		0	_null_ ));
DATA(insert ( 2120	n 0 float8larger	-				674		701		0	_null_ ));
DATA(insert ( 2121	n 0 int4larger		-				563		702		0	_null_ ));
DATA(insert ( 2122	n 0 date_larger		-				1097	1082	0	_null_ ));
DATA(insert ( 2123	n 0 time_larger		-				1112	1083	0	_null_ ));
DATA(insert ( 2124	n 0 timetz_larger	-				1554	1266	0	_null_ ));
DATA(insert ( 2125	n 0 cashlarger		-				903		790		0	_null_ ));
DATA(insert ( 2126	n 0 timestamp_larger	-			2064	1114	0	_null_ ));
DATA(insert ( 2127	n 0 timestamptz_larger	-			1324	1184	0	_null_ ));
DATA(insert ( 2128	n 0 interval_larger -				1334	1186	0	_null_ ));
DATA(insert ( 2129	n 0 text_larger		-				666		25		0	_null_ ));
DATA(insert ( 2130	n 0 numeric_larger	-				1756	1700	0	_null_ ));
DATA(insert ( 2050	n 0 array_larger	-				1073	2277	0	_null_ ));
DATA(insert ( 2244	n 0 bpchar_larger	-				1060	1042	0	_null_ ));
DATA(insert ( 2797	n 0 tidlarger		-				2800	27		0	_null_ ));
DATA(insert ( 3526	n 0 enum_larger		-				3519	3500	0	_null_ ));

/* min */
DATA(insert ( 2131	n 0 int8smaller		-				412		20		0	_null_ ));
DATA(insert ( 2132	n 0 int4smaller		-				97		23		0	_null_ ));
DATA(insert ( 2133	n 0 int2smaller		-				95		21		0	_null_ ));
DATA(insert ( 2134	n 0 oidsmaller		-				609		26		0	_null_ ));
DATA(insert ( 2135	n 0 float4smaller	-				622		700		0	_null_ ));
DATA(insert ( 2136	n 0 float8smaller	-				672		701		0	_null_ ));
DATA(insert ( 2137	n 0 int4smaller		-				562		702		0	_null_ ));
DATA(insert ( 2138	n 0 date_smaller	-				1095	1082	0	_null_ ));
DATA(insert ( 2139	n 0 time_smaller	-				1110	1083	0	_null_ ));
DATA(insert ( 2140	n 0 timetz_smaller	-				1552	1266	0	_null_ ));
DATA(insert ( 2141	n 0 cashsmaller		-				902		790		0	_null_ ));
DATA(insert ( 2142	n 0 timestamp_smaller	-			2062	1114	0	_null_ ));
DATA(insert ( 2143	n 0 timestamptz_smaller -			1322	1184	0	_null_ ));
DATA(insert ( 2144	n 0 interval_smaller	-			1332	1186	0	_null_ ));
DATA(insert ( 2145	n 0 text_smaller	-				664		25		0	_null_ ));
DATA(insert ( 2146	n 0 numeric_smaller -				1754	1700	0	_null_ ));
DATA(insert ( 2051	n 0 array_smaller	-				1072	2277	0	_null_ ));
DATA(insert ( 2245	n 0 bpchar_smaller	-				1058	1042	0	_null_ ));
DATA(insert ( 2798	n 0 tidsmaller		-				2799	27		0	_null_ ));
DATA(insert ( 3527	n 0 enum_smaller	-				3518	3500	0	_null_ ));

/* count */
DATA(insert ( 2147	n 0 int8inc_any		-				0		20		0	"0" ));
DATA(insert ( 2803	n 0 int8inc			-				0		20		0	"0" ));

/* var_pop */
DATA(insert ( 2718	n 0 int8_accum	numeric_var_pop 0	2281	128 _null_ ));
DATA(insert ( 2719	n 0 int4_accum	numeric_var_pop 0	2281	128 _null_ ));
DATA(insert ( 2720	n 0 int2_accum	numeric_var_pop 0	2281	128 _null_ ));
DATA(insert ( 2721	n 0 float4_accum	float8_var_pop 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2722	n 0 float8_accum	float8_var_pop 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2723	n 0 numeric_accum	numeric_var_pop 0	2281	128 _null_ ));

/* var_samp */
DATA(insert ( 2641	n 0 int8_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2642	n 0 int4_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2643	n 0 int2_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2644	n 0 float4_accum	float8_var_samp 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2645	n 0 float8_accum	float8_var_samp 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2646	n 0 numeric_accum	numeric_var_samp 0	2281	128 _null_ ));

/* variance: historical Postgres syntax for var_samp */
DATA(insert ( 2148	n 0 int8_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2149	n 0 int4_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2150	n 0 int2_accum	numeric_var_samp	0	2281	128 _null_ ));
DATA(insert ( 2151	n 0 float4_accum	float8_var_samp 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2152	n 0 float8_accum	float8_var_samp 0	1022	0	"{0,0,0}" ));
DATA(insert ( 2153	n 0 numeric_accum	numeric_var_samp 0	2281	128 _null_ ));

/* stddev_pop */
DATA(insert ( 2724	n 0 int8_accum	numeric_stddev_pop		0	2281	128 _null_ ));
DATA(insert ( 2725	n 0 int4_accum	numeric_stddev_pop		0	2281	128 _null_ ));
DATA(insert ( 2726	n 0 int2_accum	numeric_stddev_pop		0	2281	128 _null_ ));
DATA(insert ( 2727	n 0 float4_accum	float8_stddev_pop	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2728	n 0 float8_accum	float8_stddev_pop	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2729	n 0 numeric_accum	numeric_stddev_pop	0	2281	128 _null_ ));

/* stddev_samp */
DATA(insert ( 2712	n 0 int8_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2713	n 0 int4_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2714	n 0 int2_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2715	n 0 float4_accum	float8_stddev_samp	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2716	n 0 float8_accum	float8_stddev_samp	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2717	n 0 numeric_accum	numeric_stddev_samp 0	2281	128 _null_ ));

/* stddev: historical Postgres syntax for stddev_samp */
DATA(insert ( 2154	n 0 int8_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2155	n 0 int4_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2156	n 0 int2_accum	numeric_stddev_samp		0	2281	128 _null_ ));
DATA(insert ( 2157	n 0 float4_accum	float8_stddev_samp	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2158	n 0 float8_accum	float8_stddev_samp	0	1022	0	"{0,0,0}" ));
DATA(insert ( 2159	n 0 numeric_accum	numeric_stddev_samp 0	2281	128 _null_ ));

/* SQL2003 binary regression aggregates */
DATA(insert ( 2818	n 0 int8inc_float8_float8		-				0	20		0	"0" ));
DATA(insert ( 2819	n 0 float8_regr_accum	float8_regr_sxx			0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2820	n 0 float8_regr_accum	float8_regr_syy			0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2821	n 0 float8_regr_accum	float8_regr_sxy			0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2822	n 0 float8_regr_accum	float8_regr_avgx		0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2823	n 0 float8_regr_accum	float8_regr_avgy		0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2824	n 0 float8_regr_accum	float8_regr_r2			0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2825	n 0 float8_regr_accum	float8_regr_slope		0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2826	n 0 float8_regr_accum	float8_regr_intercept	0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2827	n 0 float8_regr_accum	float8_covar_pop		0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2828	n 0 float8_regr_accum	float8_covar_samp		0	1022	0	"{0,0,0,0,0,0}" ));
DATA(insert ( 2829	n 0 float8_regr_accum	float8_corr				0	1022	0	"{0,0,0,0,0,0}" ));

/* boolean-and and boolean-or */
DATA(insert ( 2517	n 0 booland_statefunc	-			58	16		0	_null_ ));
DATA(insert ( 2518	n 0 boolor_statefunc	-			59	16		0	_null_ ));
DATA(insert ( 2519	n 0 booland_statefunc	-			58	16		0	_null_ ));

/* bitwise integer */
DATA(insert ( 2236	n 0 int2and		-					0	21		0	_null_ ));
DATA(insert ( 2237	n 0 int2or		-					0	21		0	_null_ ));
DATA(insert ( 2238	n 0 int4and		-					0	23		0	_null_ ));
DATA(insert ( 2239	n 0 int4or		-					0	23		0	_null_ ));
DATA(insert ( 2240	n 0 int8and		-					0	20		0	_null_ ));
DATA(insert ( 2241	n 0 int8or		-					0	20		0	_null_ ));
DATA(insert ( 2242	n 0 bitand		-					0	1560	0	_null_ ));
DATA(insert ( 2243	n 0 bitor		-					0	1560	0	_null_ ));

/* xml */
DATA(insert ( 2901	n 0 xmlconcat2	-					0	142		0	_null_ ));

/* array */
DATA(insert ( 2335	n 0 array_agg_transfn	array_agg_finalfn	0	2281	0	_null_ ));

/* text */
DATA(insert ( 3538	n 0 string_agg_transfn	string_agg_finalfn	0	2281	0	_null_ ));

/* bytea */
DATA(insert ( 3545	n 0 bytea_string_agg_transfn	bytea_string_agg_finalfn	0	2281	0	_null_ ));

/* json */
DATA(insert ( 3175	n 0 json_agg_transfn	json_agg_finalfn	0	2281	0	_null_ ));

/* ordered-set and hypothetical-set aggregates */
DATA(insert ( 3972	o 1 ordered_set_transition			percentile_disc_final					0	2281	0	_null_ ));
DATA(insert ( 3974	o 1 ordered_set_transition			percentile_cont_float8_final			0	2281	0	_null_ ));
DATA(insert ( 3976	o 1 ordered_set_transition			percentile_cont_interval_final			0	2281	0	_null_ ));
DATA(insert ( 3978	o 1 ordered_set_transition			percentile_disc_multi_final				0	2281	0	_null_ ));
DATA(insert ( 3980	o 1 ordered_set_transition			percentile_cont_float8_multi_final		0	2281	0	_null_ ));
DATA(insert ( 3982	o 1 ordered_set_transition			percentile_cont_interval_multi_final	0	2281	0	_null_ ));
DATA(insert ( 3984	o 0 ordered_set_transition			mode_final								0	2281	0	_null_ ));
DATA(insert ( 3986	h 1 ordered_set_transition_multi	rank_final								0	2281	0	_null_ ));
DATA(insert ( 3988	h 1 ordered_set_transition_multi	percent_rank_final						0	2281	0	_null_ ));
DATA(insert ( 3990	h 1 ordered_set_transition_multi	cume_dist_final							0	2281	0	_null_ ));
DATA(insert ( 3992	h 1 ordered_set_transition_multi	dense_rank_final						0	2281	0	_null_ ));


/*
 * prototypes for functions in pg_aggregate.c
 */
extern Oid AggregateCreate(const char *aggName,
				Oid aggNamespace,
				char aggKind,
				int numArgs,
				int numDirectArgs,
				oidvector *parameterTypes,
				Datum allParameterTypes,
				Datum parameterModes,
				Datum parameterNames,
				List *parameterDefaults,
				Oid variadicArgType,
				List *aggtransfnName,
				List *aggfinalfnName,
				List *aggsortopName,
				Oid aggTransType,
				int32 aggTransSpace,
				const char *agginitval);

#endif   /* PG_AGGREGATE_H */