On 1/13/18, Peter Eisentraut <peter.eisentr...@2ndquadrant.com> wrote:

> I'm afraid a key value system would invite writing the attributes in
> random order and create a mess over time.

A developer can certainly write them in random order, and it will
still work. However, in patch 0002 I have a script to enforce a
standard appearance. Of course, for it to work, you have to run it. I
describe it, if rather tersely, in the README changes in patch 0008.
Since several people have raised this concern, I will go into a bit
more depth here. Perhaps I should reuse some of this language for the
README to improve it.

src/include/catalog/rewrite_dat.pl knows where to find the schema of
each catalog, namely the pg_*.h header, accessed via ParseHeader() in
Catalog.pm. It writes key/value pairs in the order found in the
schema:

{ key_1 => 'value_1', key_2 => 'value_2', ..., key_n => 'value_n' }

The script also has an array of four hard-coded metadata fields: oid,
oid_symbol, descr, and shdescr. If any of these are present, they will
go on their own line first, in the order given:

{ oid => 9999, oid_symbol => 'FOO_OID', descr => 'comment on foo',
  key_1 => 'value_1', key_2 => 'value_2', ..., key_n => 'value_n' }

> I don't think I like this.  I know pg_proc.h is a pain to manage, but at
> least right now it's approachable programmatically.  I recently proposed
> to patch to replace the columns proisagg and proiswindow with a combined
> column prokind.  I could easily write a small Perl script to make that
> change in pg_proc.h, because the format is easy to parse and has one
> line per entry.  With this new format, that approach would no longer
> work, and I don't know what would replace it.

I've attached four diffs/patches to walk through how you would replace
the columns proisagg and proiswindow with a combined column prokind.

Patch 01: Add new prokind column to pg_proc.h, with a default of 'n'.
In many cases, this is all you would have to do, as far as
bootstrapping is concerned.

Diff 02: This is a one-off script diffed against rewrite_dat.pl. In
rewrite_dat.pl, I have a section with this comment, and this is where
I put the one-off code:

# Note: This is also a convenient place to do one-off
# bulk-editing.

(I haven't documented this with explicit examples, so I'll have to remedy that)

You would run it like this:

cd src/include/catalog
perl -I ../../backend/catalog/  rewrite_dat_with_prokind.pl  pg_proc.dat

While reading pg_proc.dat, the default value for prokind is added
automatically. We inspect proisagg and proiswindow, and change prokind
accordingly. pg_proc.dat now has all three columns, prokind, proisagg,
and proiswindow.

Patch 03: Remove old columns from pg_proc.h

Now we run the standard rewrite:

perl -I ../../backend/catalog/ rewrite_dat.pl pg_proc.dat

Any values not found in the schema will simply not be written to
pg_proc.dat, so the old columns are now gone.

The result is found in patch 04.
--

Note: You could theoretically also load the source data into tables,
do the updates with SQL, and dump back out again. I made some progress
with this method, but it's not complete. I think the load and dump
steps add too much complexity for most use cases, but it's a
possibility.


-John Naylor
--- rewrite_dat.pl      2018-01-13 13:32:42.528046389 +0700
+++ rewrite_dat_with_prokind.pl 2018-01-13 16:07:49.124401213 +0700
@@ -132,6 +132,19 @@
                        # these operations in the order given.
                        # Note: This is also a convenient place to do one-off
                        # bulk-editing.
+
+                       # One-off to migrate to prokind
+                       # Default has already been filled in by now, so now add 
other
+                       # values as appropriate
+                       if ($values{proisagg} eq 't')
+                       {
+                               $values{prokind} = 'a';
+                       }
+                       elsif ($values{proiswindow} eq 't')
+                       {
+                               $values{prokind} = 'w';
+                       }
+
                        if (!$expand_tuples)
                        {
                                strip_default_values(\%values, $schema, 
$catname);
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 7b77eea..0f2990f 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -60,6 +60,9 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
 	/* is it a window function? */
 	bool		proiswindow BKI_DEFAULT(f);
 
+	/* kind of function: n = normal, a = agg, w = window */
+	char		prokind BKI_DEFAULT(n);
+
 	/* security definer */
 	bool		prosecdef BKI_DEFAULT(f);
 
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index be8f822..b76dd72 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -57,12 +57,6 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
 	/* kind of function: n = normal, a = agg, w = window */
 	char		prokind BKI_DEFAULT(n);
 
-	/* is it an aggregate? */
-	bool		proisagg BKI_DEFAULT(f);
-
-	/* is it a window function? */
-	bool		proiswindow BKI_DEFAULT(f);
-
 	/* security definer */
 	bool		prosecdef BKI_DEFAULT(f);
 
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index ebef2bc..fd4ff11 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -1046,13 +1046,13 @@
 { oid => '2334', descr => 'aggregate final function',
   n => 'array_agg_finalfn', v => 'i', p => 's', rt => 'anyarray', at => 'internal anynonarray' },
 { oid => '2335', descr => 'concatenate aggregate input into an array',
-  n => 'array_agg', proisagg => 't', v => 'i', p => 's', rt => 'anyarray', at => 'anynonarray', s => 'aggregate_dummy' },
+  n => 'array_agg', prokind => 'a', v => 'i', p => 's', rt => 'anyarray', at => 'anynonarray', s => 'aggregate_dummy' },
 { oid => '4051', descr => 'aggregate transition function',
   n => 'array_agg_array_transfn', v => 'i', p => 's', rt => 'internal', at => 'internal anyarray' },
 { oid => '4052', descr => 'aggregate final function',
   n => 'array_agg_array_finalfn', v => 'i', p => 's', rt => 'anyarray', at => 'internal anyarray' },
 { oid => '4053', descr => 'concatenate aggregate input into an array',
-  n => 'array_agg', proisagg => 't', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
+  n => 'array_agg', prokind => 'a', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
 { oid => '3218', descr => 'bucket number of operand given a sorted array of bucket lower bounds',
   n => 'width_bucket', is => 't', v => 'i', p => 's', rt => 'int4', at => 'anyelement anyarray', s => 'width_bucket_array' },
 { oid => '3816', descr => 'array typanalyze',
@@ -3103,13 +3103,13 @@
 { oid => '3536', descr => 'aggregate final function',
   n => 'string_agg_finalfn', v => 'i', p => 's', rt => 'text', at => 'internal' },
 { oid => '3538', descr => 'concatenate aggregate input into a string',
-  n => 'string_agg', proisagg => 't', v => 'i', p => 's', rt => 'text', at => 'text text', s => 'aggregate_dummy' },
+  n => 'string_agg', prokind => 'a', v => 'i', p => 's', rt => 'text', at => 'text text', s => 'aggregate_dummy' },
 { oid => '3543', descr => 'aggregate transition function',
   n => 'bytea_string_agg_transfn', v => 'i', p => 's', rt => 'internal', at => 'internal bytea bytea' },
 { oid => '3544', descr => 'aggregate final function',
   n => 'bytea_string_agg_finalfn', v => 'i', p => 's', rt => 'bytea', at => 'internal' },
 { oid => '3545', descr => 'concatenate aggregate input into a bytea',
-  n => 'string_agg', proisagg => 't', v => 'i', p => 's', rt => 'bytea', at => 'bytea bytea', s => 'aggregate_dummy' },
+  n => 'string_agg', prokind => 'a', v => 'i', p => 's', rt => 'bytea', at => 'bytea bytea', s => 'aggregate_dummy' },
 
 # To ASCII conversion
 { oid => '1845', descr => 'encode text from DB encoding to ASCII text',
@@ -3815,229 +3815,229 @@
 # Aggregates (moved here from pg_aggregate for 7.3)
 
 { oid => '2100', descr => 'the average (arithmetic mean) as numeric of all bigint values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2101', descr => 'the average (arithmetic mean) as numeric of all integer values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2102', descr => 'the average (arithmetic mean) as numeric of all smallint values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2103', descr => 'the average (arithmetic mean) as numeric of all numeric values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 { oid => '2104', descr => 'the average (arithmetic mean) as float8 of all float4 values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2105', descr => 'the average (arithmetic mean) as float8 of all float8 values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2106', descr => 'the average (arithmetic mean) as interval of all interval values',
-  n => 'avg', proisagg => 't', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
+  n => 'avg', prokind => 'a', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
 
 { oid => '2107', descr => 'sum as numeric across all bigint input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2108', descr => 'sum as bigint across all integer input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int4', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2109', descr => 'sum as bigint across all smallint input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int2', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2110', descr => 'sum as float4 across all float4 input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2111', descr => 'sum as float8 across all float8 input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2112', descr => 'sum as money across all money input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
 { oid => '2113', descr => 'sum as interval across all interval input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
 { oid => '2114', descr => 'sum as numeric across all numeric input values',
-  n => 'sum', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'sum', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2115', descr => 'maximum value of all bigint input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2116', descr => 'maximum value of all integer input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2117', descr => 'maximum value of all smallint input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2118', descr => 'maximum value of all oid input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'oid', at => 'oid', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'oid', at => 'oid', s => 'aggregate_dummy' },
 { oid => '2119', descr => 'maximum value of all float4 input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2120', descr => 'maximum value of all float8 input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2121', descr => 'maximum value of all abstime input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'abstime', at => 'abstime', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'abstime', at => 'abstime', s => 'aggregate_dummy' },
 { oid => '2122', descr => 'maximum value of all date input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'date', at => 'date', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'date', at => 'date', s => 'aggregate_dummy' },
 { oid => '2123', descr => 'maximum value of all time input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'time', at => 'time', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'time', at => 'time', s => 'aggregate_dummy' },
 { oid => '2124', descr => 'maximum value of all time with time zone input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'timetz', at => 'timetz', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'timetz', at => 'timetz', s => 'aggregate_dummy' },
 { oid => '2125', descr => 'maximum value of all money input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
 { oid => '2126', descr => 'maximum value of all timestamp input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'timestamp', at => 'timestamp', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'timestamp', at => 'timestamp', s => 'aggregate_dummy' },
 { oid => '2127', descr => 'maximum value of all timestamp with time zone input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'timestamptz', at => 'timestamptz', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'timestamptz', at => 'timestamptz', s => 'aggregate_dummy' },
 { oid => '2128', descr => 'maximum value of all interval input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
 { oid => '2129', descr => 'maximum value of all text input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'text', at => 'text', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'text', at => 'text', s => 'aggregate_dummy' },
 { oid => '2130', descr => 'maximum value of all numeric input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 { oid => '2050', descr => 'maximum value of all anyarray input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
 { oid => '2244', descr => 'maximum value of all bpchar input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'bpchar', at => 'bpchar', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'bpchar', at => 'bpchar', s => 'aggregate_dummy' },
 { oid => '2797', descr => 'maximum value of all tid input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'tid', at => 'tid', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'tid', at => 'tid', s => 'aggregate_dummy' },
 { oid => '3564', descr => 'maximum value of all inet input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'inet', at => 'inet', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'inet', at => 'inet', s => 'aggregate_dummy' },
 
 { oid => '2131', descr => 'minimum value of all bigint input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2132', descr => 'minimum value of all integer input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2133', descr => 'minimum value of all smallint input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2134', descr => 'minimum value of all oid input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'oid', at => 'oid', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'oid', at => 'oid', s => 'aggregate_dummy' },
 { oid => '2135', descr => 'minimum value of all float4 input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'float4', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2136', descr => 'minimum value of all float8 input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2137', descr => 'minimum value of all abstime input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'abstime', at => 'abstime', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'abstime', at => 'abstime', s => 'aggregate_dummy' },
 { oid => '2138', descr => 'minimum value of all date input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'date', at => 'date', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'date', at => 'date', s => 'aggregate_dummy' },
 { oid => '2139', descr => 'minimum value of all time input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'time', at => 'time', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'time', at => 'time', s => 'aggregate_dummy' },
 { oid => '2140', descr => 'minimum value of all time with time zone input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'timetz', at => 'timetz', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'timetz', at => 'timetz', s => 'aggregate_dummy' },
 { oid => '2141', descr => 'minimum value of all money input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'money', at => 'money', s => 'aggregate_dummy' },
 { oid => '2142', descr => 'minimum value of all timestamp input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'timestamp', at => 'timestamp', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'timestamp', at => 'timestamp', s => 'aggregate_dummy' },
 { oid => '2143', descr => 'minimum value of all timestamp with time zone input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'timestamptz', at => 'timestamptz', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'timestamptz', at => 'timestamptz', s => 'aggregate_dummy' },
 { oid => '2144', descr => 'minimum value of all interval input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'interval', at => 'interval', s => 'aggregate_dummy' },
 { oid => '2145', descr => 'minimum value of all text values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'text', at => 'text', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'text', at => 'text', s => 'aggregate_dummy' },
 { oid => '2146', descr => 'minimum value of all numeric input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 { oid => '2051', descr => 'minimum value of all anyarray input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'anyarray', at => 'anyarray', s => 'aggregate_dummy' },
 { oid => '2245', descr => 'minimum value of all bpchar input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'bpchar', at => 'bpchar', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'bpchar', at => 'bpchar', s => 'aggregate_dummy' },
 { oid => '2798', descr => 'minimum value of all tid input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'tid', at => 'tid', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'tid', at => 'tid', s => 'aggregate_dummy' },
 { oid => '3565', descr => 'minimum value of all inet input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'inet', at => 'inet', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'inet', at => 'inet', s => 'aggregate_dummy' },
 
 # count has two forms: count(any) and count(*)
 { oid => '2147', descr => 'number of input rows for which the input expression is not null',
-  n => 'count', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'any', s => 'aggregate_dummy' },
+  n => 'count', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'any', s => 'aggregate_dummy' },
 { oid => '2803', descr => 'number of input rows',
-  n => 'count', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => '', s => 'aggregate_dummy' },
+  n => 'count', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => '', s => 'aggregate_dummy' },
 
 { oid => '2718', descr => 'population variance of bigint input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2719', descr => 'population variance of integer input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2720', descr => 'population variance of smallint input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2721', descr => 'population variance of float4 input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2722', descr => 'population variance of float8 input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2723', descr => 'population variance of numeric input values (square of the population standard deviation)',
-  n => 'var_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'var_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2641', descr => 'sample variance of bigint input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2642', descr => 'sample variance of integer input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2643', descr => 'sample variance of smallint input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2644', descr => 'sample variance of float4 input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 
 { oid => '2645', descr => 'sample variance of float8 input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2646', descr => 'sample variance of numeric input values (square of the sample standard deviation)',
-  n => 'var_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'var_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2148', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2149', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2150', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2151', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2152', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2153', descr => 'historical alias for var_samp',
-  n => 'variance', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'variance', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2724', descr => 'population standard deviation of bigint input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2725', descr => 'population standard deviation of integer input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2726', descr => 'population standard deviation of smallint input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2727', descr => 'population standard deviation of float4 input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2728', descr => 'population standard deviation of float8 input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2729', descr => 'population standard deviation of numeric input values',
-  n => 'stddev_pop', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'stddev_pop', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2712', descr => 'sample standard deviation of bigint input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2713', descr => 'sample standard deviation of integer input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2714', descr => 'sample standard deviation of smallint input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2715', descr => 'sample standard deviation of float4 input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2716', descr => 'sample standard deviation of float8 input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2717', descr => 'sample standard deviation of numeric input values',
-  n => 'stddev_samp', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'stddev_samp', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2154', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2155', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2156', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2157', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float4', s => 'aggregate_dummy' },
 { oid => '2158', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8', s => 'aggregate_dummy' },
 { oid => '2159', descr => 'historical alias for stddev_samp',
-  n => 'stddev', proisagg => 't', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
+  n => 'stddev', prokind => 'a', v => 'i', p => 's', rt => 'numeric', at => 'numeric', s => 'aggregate_dummy' },
 
 { oid => '2818', descr => 'number of input rows in which both expressions are not null',
-  n => 'regr_count', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_count', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2819', descr => 'sum of squares of the independent variable (sum(X^2) - sum(X)^2/N)',
-  n => 'regr_sxx', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_sxx', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2820', descr => 'sum of squares of the dependent variable (sum(Y^2) - sum(Y)^2/N)',
-  n => 'regr_syy', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_syy', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2821', descr => 'sum of products of independent times dependent variable (sum(X*Y) - sum(X) * sum(Y)/N)',
-  n => 'regr_sxy', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_sxy', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2822', descr => 'average of the independent variable (sum(X)/N)',
-  n => 'regr_avgx', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_avgx', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2823', descr => 'average of the dependent variable (sum(Y)/N)',
-  n => 'regr_avgy', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_avgy', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2824', descr => 'square of the correlation coefficient',
-  n => 'regr_r2', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_r2', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2825', descr => 'slope of the least-squares-fit linear equation determined by the (X, Y) pairs',
-  n => 'regr_slope', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_slope', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2826', descr => 'y-intercept of the least-squares-fit linear equation determined by the (X, Y) pairs',
-  n => 'regr_intercept', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'regr_intercept', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 
 { oid => '2827', descr => 'population covariance',
-  n => 'covar_pop', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'covar_pop', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2828', descr => 'sample covariance',
-  n => 'covar_samp', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'covar_samp', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '2829', descr => 'correlation coefficient',
-  n => 'corr', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'corr', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 
 { oid => '2160',
   n => 'text_pattern_lt', is => 't', v => 'i', p => 's', rt => 'bool', at => 'text text' },
@@ -4756,31 +4756,31 @@
 { oid => '3499', descr => 'aggregate final function',
   n => 'bool_anytrue', is => 't', v => 'i', p => 's', rt => 'bool', at => 'internal' },
 { oid => '2517', descr => 'boolean-and aggregate',
-  n => 'bool_and', proisagg => 't', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
+  n => 'bool_and', prokind => 'a', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
 
 # ANY, SOME? These names conflict with subquery operators. See doc.
 { oid => '2518', descr => 'boolean-or aggregate',
-  n => 'bool_or', proisagg => 't', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
+  n => 'bool_or', prokind => 'a', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
 { oid => '2519', descr => 'boolean-and aggregate',
-  n => 'every', proisagg => 't', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
+  n => 'every', prokind => 'a', v => 'i', p => 's', rt => 'bool', at => 'bool', s => 'aggregate_dummy' },
 
 # bitwise integer aggregates
 { oid => '2236', descr => 'bitwise-and smallint aggregate',
-  n => 'bit_and', proisagg => 't', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
+  n => 'bit_and', prokind => 'a', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2237', descr => 'bitwise-or smallint aggregate',
-  n => 'bit_or', proisagg => 't', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
+  n => 'bit_or', prokind => 'a', v => 'i', p => 's', rt => 'int2', at => 'int2', s => 'aggregate_dummy' },
 { oid => '2238', descr => 'bitwise-and integer aggregate',
-  n => 'bit_and', proisagg => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
+  n => 'bit_and', prokind => 'a', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2239', descr => 'bitwise-or integer aggregate',
-  n => 'bit_or', proisagg => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
+  n => 'bit_or', prokind => 'a', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'aggregate_dummy' },
 { oid => '2240', descr => 'bitwise-and bigint aggregate',
-  n => 'bit_and', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
+  n => 'bit_and', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2241', descr => 'bitwise-or bigint aggregate',
-  n => 'bit_or', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
+  n => 'bit_or', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'int8', s => 'aggregate_dummy' },
 { oid => '2242', descr => 'bitwise-and bit aggregate',
-  n => 'bit_and', proisagg => 't', v => 'i', p => 's', rt => 'bit', at => 'bit', s => 'aggregate_dummy' },
+  n => 'bit_and', prokind => 'a', v => 'i', p => 's', rt => 'bit', at => 'bit', s => 'aggregate_dummy' },
 { oid => '2243', descr => 'bitwise-or bit aggregate',
-  n => 'bit_or', proisagg => 't', v => 'i', p => 's', rt => 'bit', at => 'bit', s => 'aggregate_dummy' },
+  n => 'bit_or', prokind => 'a', v => 'i', p => 's', rt => 'bit', at => 'bit', s => 'aggregate_dummy' },
 
 # formerly-missing interval + datetime operators
 { oid => '2546',
@@ -4968,7 +4968,7 @@
 { oid => '2900', descr => 'aggregate transition function',
   n => 'xmlconcat2', v => 'i', p => 's', rt => 'xml', at => 'xml xml' },
 { oid => '2901', descr => 'concatenate XML values',
-  n => 'xmlagg', proisagg => 't', v => 'i', p => 's', rt => 'xml', at => 'xml', s => 'aggregate_dummy' },
+  n => 'xmlagg', prokind => 'a', v => 'i', p => 's', rt => 'xml', at => 'xml', s => 'aggregate_dummy' },
 { oid => '2922', descr => 'serialize an XML value to a character string',
   n => 'text', is => 't', v => 'i', p => 's', rt => 'text', at => 'xml', s => 'xmltotext' },
 
@@ -5044,13 +5044,13 @@
 { oid => '3174', descr => 'json aggregate final function',
   n => 'json_agg_finalfn', v => 'i', p => 's', rt => 'json', at => 'internal' },
 { oid => '3175', descr => 'aggregate input into json',
-  n => 'json_agg', proisagg => 't', v => 's', p => 's', rt => 'json', at => 'anyelement', s => 'aggregate_dummy' },
+  n => 'json_agg', prokind => 'a', v => 's', p => 's', rt => 'json', at => 'anyelement', s => 'aggregate_dummy' },
 { oid => '3180', descr => 'json object aggregate transition function',
   n => 'json_object_agg_transfn', v => 's', p => 's', rt => 'internal', at => 'internal any any' },
 { oid => '3196', descr => 'json object aggregate final function',
   n => 'json_object_agg_finalfn', v => 'i', p => 's', rt => 'json', at => 'internal' },
 { oid => '3197', descr => 'aggregate input into a json object',
-  n => 'json_object_agg', proisagg => 't', v => 's', p => 's', rt => 'json', at => 'any any', s => 'aggregate_dummy' },
+  n => 'json_object_agg', prokind => 'a', v => 's', p => 's', rt => 'json', at => 'any any', s => 'aggregate_dummy' },
 { oid => '3198', descr => 'build a json array from any inputs',
   n => 'json_build_array', provariadic => '2276', v => 's', p => 's', rt => 'json', at => 'any', proallargtypes => '{any}', proargmodes => '{v}' },
 { oid => '3199', descr => 'build an empty json array',
@@ -5195,9 +5195,9 @@
 { oid => '3525', descr => 'larger of two',
   n => 'enum_larger', is => 't', v => 'i', p => 's', rt => 'anyenum', at => 'anyenum anyenum' },
 { oid => '3526', descr => 'maximum value of all enum input values',
-  n => 'max', proisagg => 't', v => 'i', p => 's', rt => 'anyenum', at => 'anyenum', s => 'aggregate_dummy' },
+  n => 'max', prokind => 'a', v => 'i', p => 's', rt => 'anyenum', at => 'anyenum', s => 'aggregate_dummy' },
 { oid => '3527', descr => 'minimum value of all enum input values',
-  n => 'min', proisagg => 't', v => 'i', p => 's', rt => 'anyenum', at => 'anyenum', s => 'aggregate_dummy' },
+  n => 'min', prokind => 'a', v => 'i', p => 's', rt => 'anyenum', at => 'anyenum', s => 'aggregate_dummy' },
 { oid => '3528', descr => 'first value of the input enum type',
   n => 'enum_first', v => 's', p => 's', rt => 'anyenum', at => 'anyenum' },
 { oid => '3529', descr => 'last value of the input enum type',
@@ -5550,13 +5550,13 @@
 { oid => '3266', descr => 'jsonb aggregate final function',
   n => 'jsonb_agg_finalfn', v => 's', p => 's', rt => 'jsonb', at => 'internal' },
 { oid => '3267', descr => 'aggregate input into jsonb',
-  n => 'jsonb_agg', proisagg => 't', v => 's', p => 's', rt => 'jsonb', at => 'anyelement', s => 'aggregate_dummy' },
+  n => 'jsonb_agg', prokind => 'a', v => 's', p => 's', rt => 'jsonb', at => 'anyelement', s => 'aggregate_dummy' },
 { oid => '3268', descr => 'jsonb object aggregate transition function',
   n => 'jsonb_object_agg_transfn', v => 's', p => 's', rt => 'internal', at => 'internal any any' },
 { oid => '3269', descr => 'jsonb object aggregate final function',
   n => 'jsonb_object_agg_finalfn', v => 's', p => 's', rt => 'jsonb', at => 'internal' },
 { oid => '3270', descr => 'aggregate inputs into jsonb object',
-  n => 'jsonb_object_agg', proisagg => 't', v => 'i', p => 's', rt => 'jsonb', at => 'any any', s => 'aggregate_dummy' },
+  n => 'jsonb_object_agg', prokind => 'a', v => 'i', p => 's', rt => 'jsonb', at => 'any any', s => 'aggregate_dummy' },
 { oid => '3271', descr => 'build a jsonb array from any inputs',
   n => 'jsonb_build_array', provariadic => '2276', v => 's', p => 's', rt => 'jsonb', at => 'any', proallargtypes => '{any}', proargmodes => '{v}' },
 { oid => '3272', descr => 'build an empty jsonb array',
@@ -5735,35 +5735,35 @@
 
 # SQL-spec window functions
 { oid => '3100', descr => 'row number within partition',
-  n => 'row_number', proiswindow => 't', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_row_number' },
+  n => 'row_number', prokind => 'w', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_row_number' },
 { oid => '3101', descr => 'integer rank with gaps',
-  n => 'rank', proiswindow => 't', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_rank' },
+  n => 'rank', prokind => 'w', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_rank' },
 { oid => '3102', descr => 'integer rank without gaps',
-  n => 'dense_rank', proiswindow => 't', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_dense_rank' },
+  n => 'dense_rank', prokind => 'w', v => 'i', p => 's', rt => 'int8', at => '', s => 'window_dense_rank' },
 { oid => '3103', descr => 'fractional rank within partition',
-  n => 'percent_rank', proiswindow => 't', v => 'i', p => 's', rt => 'float8', at => '', s => 'window_percent_rank' },
+  n => 'percent_rank', prokind => 'w', v => 'i', p => 's', rt => 'float8', at => '', s => 'window_percent_rank' },
 { oid => '3104', descr => 'fractional row number within partition',
-  n => 'cume_dist', proiswindow => 't', v => 'i', p => 's', rt => 'float8', at => '', s => 'window_cume_dist' },
+  n => 'cume_dist', prokind => 'w', v => 'i', p => 's', rt => 'float8', at => '', s => 'window_cume_dist' },
 { oid => '3105', descr => 'split rows into N groups',
-  n => 'ntile', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'window_ntile' },
+  n => 'ntile', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'int4', at => 'int4', s => 'window_ntile' },
 { oid => '3106', descr => 'fetch the preceding row value',
-  n => 'lag', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_lag' },
+  n => 'lag', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_lag' },
 { oid => '3107', descr => 'fetch the Nth preceding row value',
-  n => 'lag', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_lag_with_offset' },
+  n => 'lag', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_lag_with_offset' },
 { oid => '3108', descr => 'fetch the Nth preceding row value with default',
-  n => 'lag', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4 anyelement', s => 'window_lag_with_offset_and_default' },
+  n => 'lag', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4 anyelement', s => 'window_lag_with_offset_and_default' },
 { oid => '3109', descr => 'fetch the following row value',
-  n => 'lead', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_lead' },
+  n => 'lead', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_lead' },
 { oid => '3110', descr => 'fetch the Nth following row value',
-  n => 'lead', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_lead_with_offset' },
+  n => 'lead', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_lead_with_offset' },
 { oid => '3111', descr => 'fetch the Nth following row value with default',
-  n => 'lead', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4 anyelement', s => 'window_lead_with_offset_and_default' },
+  n => 'lead', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4 anyelement', s => 'window_lead_with_offset_and_default' },
 { oid => '3112', descr => 'fetch the first row value',
-  n => 'first_value', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_first_value' },
+  n => 'first_value', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_first_value' },
 { oid => '3113', descr => 'fetch the last row value',
-  n => 'last_value', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_last_value' },
+  n => 'last_value', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'window_last_value' },
 { oid => '3114', descr => 'fetch the Nth row value',
-  n => 'nth_value', proiswindow => 't', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_nth_value' },
+  n => 'nth_value', prokind => 'w', is => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement int4', s => 'window_nth_value' },
 
 # functions for range types
 { oid => '3832', descr => 'I/O',
@@ -6010,49 +6010,49 @@
 
 # inverse distribution aggregates (and their support functions)
 { oid => '3972', descr => 'discrete percentile',
-  n => 'percentile_disc', proisagg => 't', v => 'i', p => 's', rt => 'anyelement', at => 'float8 anyelement', s => 'aggregate_dummy' },
+  n => 'percentile_disc', prokind => 'a', v => 'i', p => 's', rt => 'anyelement', at => 'float8 anyelement', s => 'aggregate_dummy' },
 { oid => '3973', descr => 'aggregate final function',
   n => 'percentile_disc_final', v => 'i', p => 's', rt => 'anyelement', at => 'internal float8 anyelement' },
 { oid => '3974', descr => 'continuous distribution percentile',
-  n => 'percentile_cont', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
+  n => 'percentile_cont', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'float8 float8', s => 'aggregate_dummy' },
 { oid => '3975', descr => 'aggregate final function',
   n => 'percentile_cont_float8_final', v => 'i', p => 's', rt => 'float8', at => 'internal float8' },
 { oid => '3976', descr => 'continuous distribution percentile',
-  n => 'percentile_cont', proisagg => 't', v => 'i', p => 's', rt => 'interval', at => 'float8 interval', s => 'aggregate_dummy' },
+  n => 'percentile_cont', prokind => 'a', v => 'i', p => 's', rt => 'interval', at => 'float8 interval', s => 'aggregate_dummy' },
 { oid => '3977', descr => 'aggregate final function',
   n => 'percentile_cont_interval_final', v => 'i', p => 's', rt => 'interval', at => 'internal float8' },
 { oid => '3978', descr => 'multiple discrete percentiles',
-  n => 'percentile_disc', proisagg => 't', v => 'i', p => 's', rt => 'anyarray', at => '_float8 anyelement', s => 'aggregate_dummy' },
+  n => 'percentile_disc', prokind => 'a', v => 'i', p => 's', rt => 'anyarray', at => '_float8 anyelement', s => 'aggregate_dummy' },
 { oid => '3979', descr => 'aggregate final function',
   n => 'percentile_disc_multi_final', v => 'i', p => 's', rt => 'anyarray', at => 'internal _float8 anyelement' },
 { oid => '3980', descr => 'multiple continuous percentiles',
-  n => 'percentile_cont', proisagg => 't', v => 'i', p => 's', rt => '_float8', at => '_float8 float8', s => 'aggregate_dummy' },
+  n => 'percentile_cont', prokind => 'a', v => 'i', p => 's', rt => '_float8', at => '_float8 float8', s => 'aggregate_dummy' },
 { oid => '3981', descr => 'aggregate final function',
   n => 'percentile_cont_float8_multi_final', v => 'i', p => 's', rt => '_float8', at => 'internal _float8' },
 { oid => '3982', descr => 'multiple continuous percentiles',
-  n => 'percentile_cont', proisagg => 't', v => 'i', p => 's', rt => '_interval', at => '_float8 interval', s => 'aggregate_dummy' },
+  n => 'percentile_cont', prokind => 'a', v => 'i', p => 's', rt => '_interval', at => '_float8 interval', s => 'aggregate_dummy' },
 { oid => '3983', descr => 'aggregate final function',
   n => 'percentile_cont_interval_multi_final', v => 'i', p => 's', rt => '_interval', at => 'internal _float8' },
 { oid => '3984', descr => 'most common value',
-  n => 'mode', proisagg => 't', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'aggregate_dummy' },
+  n => 'mode', prokind => 'a', v => 'i', p => 's', rt => 'anyelement', at => 'anyelement', s => 'aggregate_dummy' },
 { oid => '3985', descr => 'aggregate final function',
   n => 'mode_final', v => 'i', p => 's', rt => 'anyelement', at => 'internal anyelement' },
 
 # hypothetical-set aggregates (and their support functions)
 { oid => '3986', descr => 'rank of hypothetical row',
-  n => 'rank', provariadic => '2276', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
+  n => 'rank', provariadic => '2276', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
 { oid => '3987', descr => 'aggregate final function',
   n => 'rank_final', provariadic => '2276', v => 'i', p => 's', rt => 'int8', at => 'internal any', proallargtypes => '{internal,any}', proargmodes => '{i,v}', s => 'hypothetical_rank_final' },
 { oid => '3988', descr => 'fractional rank of hypothetical row',
-  n => 'percent_rank', provariadic => '2276', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
+  n => 'percent_rank', provariadic => '2276', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
 { oid => '3989', descr => 'aggregate final function',
   n => 'percent_rank_final', provariadic => '2276', v => 'i', p => 's', rt => 'float8', at => 'internal any', proallargtypes => '{internal,any}', proargmodes => '{i,v}', s => 'hypothetical_percent_rank_final' },
 { oid => '3990', descr => 'cumulative distribution of hypothetical row',
-  n => 'cume_dist', provariadic => '2276', proisagg => 't', v => 'i', p => 's', rt => 'float8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
+  n => 'cume_dist', provariadic => '2276', prokind => 'a', v => 'i', p => 's', rt => 'float8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
 { oid => '3991', descr => 'aggregate final function',
   n => 'cume_dist_final', provariadic => '2276', v => 'i', p => 's', rt => 'float8', at => 'internal any', proallargtypes => '{internal,any}', proargmodes => '{i,v}', s => 'hypothetical_cume_dist_final' },
 { oid => '3992', descr => 'rank of hypothetical row without gaps',
-  n => 'dense_rank', provariadic => '2276', proisagg => 't', v => 'i', p => 's', rt => 'int8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
+  n => 'dense_rank', provariadic => '2276', prokind => 'a', v => 'i', p => 's', rt => 'int8', at => 'any', proallargtypes => '{any}', proargmodes => '{v}', s => 'aggregate_dummy' },
 { oid => '3993', descr => 'aggregate final function',
   n => 'dense_rank_final', provariadic => '2276', v => 'i', p => 's', rt => 'int8', at => 'internal any', proallargtypes => '{internal,any}', proargmodes => '{i,v}', s => 'hypothetical_dense_rank_final' },
 

Reply via email to