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' },