1 /*-------------------------------------------------------------------------
2  *
3  * pg_aggregate.h
4  *	  definition of the "aggregate" system catalog (pg_aggregate)
5  *
6  *
7  * Portions Copyright (c) 1996-2020, 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		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 									 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