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 */
32CATALOG(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 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 */
109typedef 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
143extern 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 finalfnExtraArgs,
164 bool mfinalfnExtraArgs,
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