BRIN minmax-multi indexes

Adds BRIN opclasses similar to the existing minmax, except that instead
of summarizing the page range into a single [min,max] range, the summary
consists of multiple ranges and/or points, allowing gaps. This allows
more efficient handling of data with poor correlation to physical
location within the table and/or outlier values, for which the regular
minmax opclassed tend to work poorly.

It's possible to specify the number of values kept for each page range,
either as a single point or an interval boundary.

  CREATE TABLE t (a int);
  CREATE INDEX ON t
   USING brin (a int4_minmax_multi_ops(values_per_range=16));

When building the summary, the values are combined into intervals with
the goal to minimize the "covering" (sum of interval lengths), using a
support procedure computing distance between two values.

Bump catversion, due to various catalog changes.

Author: Tomas Vondra <tomas.vondra@postgresql.org>
Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Reviewed-by: Sokolov Yura <y.sokolov@postgrespro.ru>
Reviewed-by: John Naylor <john.naylor@enterprisedb.com>
Discussion: https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com
Discussion: https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com
This commit is contained in:
Tomas Vondra 2021-03-26 13:54:29 +01:00
parent 77b88cd1bb
commit ab596105b5
19 changed files with 5286 additions and 26 deletions

View File

@ -116,7 +116,10 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
in the indexed column within the range. The <firstterm>inclusion</firstterm>
operator classes store a value which includes the values in the indexed
column within the range. The <firstterm>bloom</firstterm> operator
classes build a Bloom filter for all values in the range.
classes build a Bloom filter for all values in the range. The
<firstterm>minmax-multi</firstterm> operator classes store multiple
minimum and maximum values, representing values appearing in the indexed
column within the range.
</para>
<table id="brin-builtin-opclasses-table">
@ -211,6 +214,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (date,date)</literal></entry></row>
<row><entry><literal>&gt;= (date,date)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>date_minmax_multi_ops</literal></entry>
<entry><literal>= (date,date)</literal></entry>
</row>
<row><entry><literal>&lt; (date,date)</literal></entry></row>
<row><entry><literal>&lt;= (date,date)</literal></entry></row>
<row><entry><literal>&gt; (date,date)</literal></entry></row>
<row><entry><literal>&gt;= (date,date)</literal></entry></row>
<row>
<entry valign="middle"><literal>float4_bloom_ops</literal></entry>
<entry><literal>= (float4,float4)</literal></entry>
@ -225,6 +237,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (float4,float4)</literal></entry></row>
<row><entry><literal>&gt;= (float4,float4)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>float4_minmax_multi_ops</literal></entry>
<entry><literal>= (float4,float4)</literal></entry>
</row>
<row><entry><literal>&lt; (float4,float4)</literal></entry></row>
<row><entry><literal>&gt; (float4,float4)</literal></entry></row>
<row><entry><literal>&lt;= (float4,float4)</literal></entry></row>
<row><entry><literal>&gt;= (float4,float4)</literal></entry></row>
<row>
<entry valign="middle"><literal>float8_bloom_ops</literal></entry>
<entry><literal>= (float8,float8)</literal></entry>
@ -239,6 +260,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (float8,float8)</literal></entry></row>
<row><entry><literal>&gt;= (float8,float8)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>float8_minmax_multi_ops</literal></entry>
<entry><literal>= (float8,float8)</literal></entry>
</row>
<row><entry><literal>&lt; (float8,float8)</literal></entry></row>
<row><entry><literal>&lt;= (float8,float8)</literal></entry></row>
<row><entry><literal>&gt; (float8,float8)</literal></entry></row>
<row><entry><literal>&gt;= (float8,float8)</literal></entry></row>
<row>
<entry valign="middle" morerows="5"><literal>inet_inclusion_ops</literal></entry>
<entry><literal>&lt;&lt; (inet,inet)</literal></entry>
@ -263,6 +293,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (inet,inet)</literal></entry></row>
<row><entry><literal>&gt;= (inet,inet)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>inet_minmax_multi_ops</literal></entry>
<entry><literal>= (inet,inet)</literal></entry>
</row>
<row><entry><literal>&lt; (inet,inet)</literal></entry></row>
<row><entry><literal>&lt;= (inet,inet)</literal></entry></row>
<row><entry><literal>&gt; (inet,inet)</literal></entry></row>
<row><entry><literal>&gt;= (inet,inet)</literal></entry></row>
<row>
<entry valign="middle"><literal>int2_bloom_ops</literal></entry>
<entry><literal>= (int2,int2)</literal></entry>
@ -277,6 +316,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (int2,int2)</literal></entry></row>
<row><entry><literal>&gt;= (int2,int2)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>int2_minmax_multi_ops</literal></entry>
<entry><literal>= (int2,int2)</literal></entry>
</row>
<row><entry><literal>&lt; (int2,int2)</literal></entry></row>
<row><entry><literal>&gt; (int2,int2)</literal></entry></row>
<row><entry><literal>&lt;= (int2,int2)</literal></entry></row>
<row><entry><literal>&gt;= (int2,int2)</literal></entry></row>
<row>
<entry valign="middle"><literal>int4_bloom_ops</literal></entry>
<entry><literal>= (int4,int4)</literal></entry>
@ -291,6 +339,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (int4,int4)</literal></entry></row>
<row><entry><literal>&gt;= (int4,int4)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>int4_minmax_multi_ops</literal></entry>
<entry><literal>= (int4,int4)</literal></entry>
</row>
<row><entry><literal>&lt; (int4,int4)</literal></entry></row>
<row><entry><literal>&gt; (int4,int4)</literal></entry></row>
<row><entry><literal>&lt;= (int4,int4)</literal></entry></row>
<row><entry><literal>&gt;= (int4,int4)</literal></entry></row>
<row>
<entry valign="middle"><literal>int8_bloom_ops</literal></entry>
<entry><literal>= (bigint,bigint)</literal></entry>
@ -305,6 +362,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (bigint,bigint)</literal></entry></row>
<row><entry><literal>&gt;= (bigint,bigint)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>int8_minmax_multi_ops</literal></entry>
<entry><literal>= (bigint,bigint)</literal></entry>
</row>
<row><entry><literal>&lt; (bigint,bigint)</literal></entry></row>
<row><entry><literal>&gt; (bigint,bigint)</literal></entry></row>
<row><entry><literal>&lt;= (bigint,bigint)</literal></entry></row>
<row><entry><literal>&gt;= (bigint,bigint)</literal></entry></row>
<row>
<entry valign="middle"><literal>interval_bloom_ops</literal></entry>
<entry><literal>= (interval,interval)</literal></entry>
@ -319,6 +385,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (interval,interval)</literal></entry></row>
<row><entry><literal>&gt;= (interval,interval)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>interval_minmax_multi_ops</literal></entry>
<entry><literal>= (interval,interval)</literal></entry>
</row>
<row><entry><literal>&lt; (interval,interval)</literal></entry></row>
<row><entry><literal>&lt;= (interval,interval)</literal></entry></row>
<row><entry><literal>&gt; (interval,interval)</literal></entry></row>
<row><entry><literal>&gt;= (interval,interval)</literal></entry></row>
<row>
<entry valign="middle"><literal>macaddr_bloom_ops</literal></entry>
<entry><literal>= (macaddr,macaddr)</literal></entry>
@ -333,6 +408,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (macaddr,macaddr)</literal></entry></row>
<row><entry><literal>&gt;= (macaddr,macaddr)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>macaddr_minmax_multi_ops</literal></entry>
<entry><literal>= (macaddr,macaddr)</literal></entry>
</row>
<row><entry><literal>&lt; (macaddr,macaddr)</literal></entry></row>
<row><entry><literal>&lt;= (macaddr,macaddr)</literal></entry></row>
<row><entry><literal>&gt; (macaddr,macaddr)</literal></entry></row>
<row><entry><literal>&gt;= (macaddr,macaddr)</literal></entry></row>
<row>
<entry valign="middle"><literal>macaddr8_bloom_ops</literal></entry>
<entry><literal>= (macaddr8,macaddr8)</literal></entry>
@ -347,6 +431,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (macaddr8,macaddr8)</literal></entry></row>
<row><entry><literal>&gt;= (macaddr8,macaddr8)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>macaddr8_minmax_multi_ops</literal></entry>
<entry><literal>= (macaddr8,macaddr8)</literal></entry>
</row>
<row><entry><literal>&lt; (macaddr8,macaddr8)</literal></entry></row>
<row><entry><literal>&lt;= (macaddr8,macaddr8)</literal></entry></row>
<row><entry><literal>&gt; (macaddr8,macaddr8)</literal></entry></row>
<row><entry><literal>&gt;= (macaddr8,macaddr8)</literal></entry></row>
<row>
<entry valign="middle"><literal>name_bloom_ops</literal></entry>
<entry><literal>= (name,name)</literal></entry>
@ -375,6 +468,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (numeric,numeric)</literal></entry></row>
<row><entry><literal>&gt;= (numeric,numeric)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>numeric_minmax_multi_ops</literal></entry>
<entry><literal>= (numeric,numeric)</literal></entry>
</row>
<row><entry><literal>&lt; (numeric,numeric)</literal></entry></row>
<row><entry><literal>&lt;= (numeric,numeric)</literal></entry></row>
<row><entry><literal>&gt; (numeric,numeric)</literal></entry></row>
<row><entry><literal>&gt;= (numeric,numeric)</literal></entry></row>
<row>
<entry valign="middle"><literal>oid_bloom_ops</literal></entry>
<entry><literal>= (oid,oid)</literal></entry>
@ -389,6 +491,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (oid,oid)</literal></entry></row>
<row><entry><literal>&gt;= (oid,oid)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>oid_minmax_multi_ops</literal></entry>
<entry><literal>= (oid,oid)</literal></entry>
</row>
<row><entry><literal>&lt; (oid,oid)</literal></entry></row>
<row><entry><literal>&gt; (oid,oid)</literal></entry></row>
<row><entry><literal>&lt;= (oid,oid)</literal></entry></row>
<row><entry><literal>&gt;= (oid,oid)</literal></entry></row>
<row>
<entry valign="middle"><literal>pg_lsn_bloom_ops</literal></entry>
<entry><literal>= (pg_lsn,pg_lsn)</literal></entry>
@ -403,6 +514,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (pg_lsn,pg_lsn)</literal></entry></row>
<row><entry><literal>&gt;= (pg_lsn,pg_lsn)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>pg_lsn_minmax_multi_ops</literal></entry>
<entry><literal>= (pg_lsn,pg_lsn)</literal></entry>
</row>
<row><entry><literal>&lt; (pg_lsn,pg_lsn)</literal></entry></row>
<row><entry><literal>&gt; (pg_lsn,pg_lsn)</literal></entry></row>
<row><entry><literal>&lt;= (pg_lsn,pg_lsn)</literal></entry></row>
<row><entry><literal>&gt;= (pg_lsn,pg_lsn)</literal></entry></row>
<row>
<entry valign="middle" morerows="13"><literal>range_inclusion_ops</literal></entry>
<entry><literal>= (anyrange,anyrange)</literal></entry>
@ -449,6 +569,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (tid,tid)</literal></entry></row>
<row><entry><literal>&gt;= (tid,tid)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>tid_minmax_multi_ops</literal></entry>
<entry><literal>= (tid,tid)</literal></entry>
</row>
<row><entry><literal>&lt; (tid,tid)</literal></entry></row>
<row><entry><literal>&gt; (tid,tid)</literal></entry></row>
<row><entry><literal>&lt;= (tid,tid)</literal></entry></row>
<row><entry><literal>&gt;= (tid,tid)</literal></entry></row>
<row>
<entry valign="middle"><literal>timestamp_bloom_ops</literal></entry>
<entry><literal>= (timestamp,timestamp)</literal></entry>
@ -463,6 +592,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (timestamp,timestamp)</literal></entry></row>
<row><entry><literal>&gt;= (timestamp,timestamp)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>timestamp_minmax_multi_ops</literal></entry>
<entry><literal>= (timestamp,timestamp)</literal></entry>
</row>
<row><entry><literal>&lt; (timestamp,timestamp)</literal></entry></row>
<row><entry><literal>&lt;= (timestamp,timestamp)</literal></entry></row>
<row><entry><literal>&gt; (timestamp,timestamp)</literal></entry></row>
<row><entry><literal>&gt;= (timestamp,timestamp)</literal></entry></row>
<row>
<entry valign="middle"><literal>timestamptz_bloom_ops</literal></entry>
<entry><literal>= (timestamptz,timestamptz)</literal></entry>
@ -477,6 +615,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (timestamptz,timestamptz)</literal></entry></row>
<row><entry><literal>&gt;= (timestamptz,timestamptz)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>timestamptz_minmax_multi_ops</literal></entry>
<entry><literal>= (timestamptz,timestamptz)</literal></entry>
</row>
<row><entry><literal>&lt; (timestamptz,timestamptz)</literal></entry></row>
<row><entry><literal>&lt;= (timestamptz,timestamptz)</literal></entry></row>
<row><entry><literal>&gt; (timestamptz,timestamptz)</literal></entry></row>
<row><entry><literal>&gt;= (timestamptz,timestamptz)</literal></entry></row>
<row>
<entry valign="middle"><literal>time_bloom_ops</literal></entry>
<entry><literal>= (time,time)</literal></entry>
@ -491,6 +638,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (time,time)</literal></entry></row>
<row><entry><literal>&gt;= (time,time)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>time_minmax_multi_ops</literal></entry>
<entry><literal>= (time,time)</literal></entry>
</row>
<row><entry><literal>&lt; (time,time)</literal></entry></row>
<row><entry><literal>&lt;= (time,time)</literal></entry></row>
<row><entry><literal>&gt; (time,time)</literal></entry></row>
<row><entry><literal>&gt;= (time,time)</literal></entry></row>
<row>
<entry valign="middle"><literal>timetz_bloom_ops</literal></entry>
<entry><literal>= (timetz,timetz)</literal></entry>
@ -505,6 +661,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&gt; (timetz,timetz)</literal></entry></row>
<row><entry><literal>&gt;= (timetz,timetz)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>timetz_minmax_multi_ops</literal></entry>
<entry><literal>= (timetz,timetz)</literal></entry>
</row>
<row><entry><literal>&lt; (timetz,timetz)</literal></entry></row>
<row><entry><literal>&lt;= (timetz,timetz)</literal></entry></row>
<row><entry><literal>&gt; (timetz,timetz)</literal></entry></row>
<row><entry><literal>&gt;= (timetz,timetz)</literal></entry></row>
<row>
<entry valign="middle"><literal>uuid_bloom_ops</literal></entry>
<entry><literal>= (uuid,uuid)</literal></entry>
@ -519,6 +684,15 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<row><entry><literal>&lt;= (uuid,uuid)</literal></entry></row>
<row><entry><literal>&gt;= (uuid,uuid)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>uuid_minmax_multi_ops</literal></entry>
<entry><literal>= (uuid,uuid)</literal></entry>
</row>
<row><entry><literal>&lt; (uuid,uuid)</literal></entry></row>
<row><entry><literal>&gt; (uuid,uuid)</literal></entry></row>
<row><entry><literal>&lt;= (uuid,uuid)</literal></entry></row>
<row><entry><literal>&gt;= (uuid,uuid)</literal></entry></row>
<row>
<entry valign="middle" morerows="4"><literal>varbit_minmax_ops</literal></entry>
<entry><literal>= (varbit,varbit)</literal></entry>
@ -537,8 +711,8 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
<para>
Some of the built-in operator classes allow specifying parameters affecting
behavior of the operator class. Each operator class has its own set of
allowed parameters. Only the <literal>bloom</literal> operator class
allows specifying parameters:
allowed parameters. Only the <literal>bloom</literal> and <literal>minmax-multi</literal>
operator classes allow specifying parameters:
</para>
<para>
@ -577,6 +751,25 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
</varlistentry>
</variablelist>
<para>
<acronym>minmax-multi</acronym> operator classes accept these parameters:
</para>
<variablelist>
<varlistentry>
<term><literal>values_per_range</literal></term>
<listitem>
<para>
Defines the maximum number of values stored by <acronym>BRIN</acronym>
minmax indexes to summarize a block range. Each value may represent
either a point, or a boundary of an interval. Values must be between
8 and 256, and the default value is 32.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
@ -715,13 +908,14 @@ typedef struct BrinOpcInfo
</varlistentry>
</variablelist>
The core distribution includes support for two types of operator classes:
minmax and inclusion. Operator class definitions using them are shipped for
in-core data types as appropriate. Additional operator classes can be
defined by the user for other data types using equivalent definitions,
without having to write any source code; appropriate catalog entries being
declared is enough. Note that assumptions about the semantics of operator
strategies are embedded in the support functions' source code.
The core distribution includes support for four types of operator classes:
minmax, minmax-multi, inclusion and bloom. Operator class definitions
using them are shipped for in-core data types as appropriate. Additional
operator classes can be defined by the user for other data types using
equivalent definitions, without having to write any source code;
appropriate catalog entries being declared is enough. Note that
assumptions about the semantics of operator strategies are embedded in the
support functions' source code.
</para>
<para>
@ -1018,6 +1212,72 @@ typedef struct BrinOpcInfo
and return a hash of the value.
</para>
<para>
The minmax-multi operator class is also intended for data types implementing
a totally ordered sets, and may be seen as a simple extension of the minmax
operator class. While minmax operator class summarizes values from each block
range into a single contiguous interval, minmax-multi allows summarization
into multiple smaller intervals to improve handling of outlier values.
It is possible to use the minmax-multi support procedures alongside the
corresponding operators, as shown in
<xref linkend="brin-extensibility-minmax-multi-table"/>.
All operator class members (procedures and operators) are mandatory.
</para>
<table id="brin-extensibility-minmax-multi-table">
<title>Procedure and Support Numbers for minmax-multi Operator Classes</title>
<tgroup cols="2">
<thead>
<row>
<entry>Operator class member</entry>
<entry>Object</entry>
</row>
</thead>
<tbody>
<row>
<entry>Support Procedure 1</entry>
<entry>internal function <function>brin_minmax_multi_opcinfo()</function></entry>
</row>
<row>
<entry>Support Procedure 2</entry>
<entry>internal function <function>brin_minmax_multi_add_value()</function></entry>
</row>
<row>
<entry>Support Procedure 3</entry>
<entry>internal function <function>brin_minmax_multi_consistent()</function></entry>
</row>
<row>
<entry>Support Procedure 4</entry>
<entry>internal function <function>brin_minmax_multi_union()</function></entry>
</row>
<row>
<entry>Support Procedure 11</entry>
<entry>function to compute distance between two values (length of a range)</entry>
</row>
<row>
<entry>Operator Strategy 1</entry>
<entry>operator less-than</entry>
</row>
<row>
<entry>Operator Strategy 2</entry>
<entry>operator less-than-or-equal-to</entry>
</row>
<row>
<entry>Operator Strategy 3</entry>
<entry>operator equal-to</entry>
</row>
<row>
<entry>Operator Strategy 4</entry>
<entry>operator greater-than-or-equal-to</entry>
</row>
<row>
<entry>Operator Strategy 5</entry>
<entry>operator greater-than</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Both minmax and inclusion operator classes support cross-data-type
operators, though with these the dependencies become more complicated.

View File

@ -17,6 +17,7 @@ OBJS = \
brin_bloom.o \
brin_inclusion.o \
brin_minmax.o \
brin_minmax_multi.o \
brin_pageops.o \
brin_revmap.o \
brin_tuple.o \

File diff suppressed because it is too large Load Diff

View File

@ -159,6 +159,14 @@ brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple,
if (tuple->bt_columns[keyno].bv_hasnulls)
anynulls = true;
/* If needed, serialize the values before forming the on-disk tuple. */
if (tuple->bt_columns[keyno].bv_serialize)
{
tuple->bt_columns[keyno].bv_serialize(brdesc,
tuple->bt_columns[keyno].bv_mem_value,
tuple->bt_columns[keyno].bv_values);
}
/*
* Now obtain the values of each stored datum. Note that some values
* might be toasted, and we cannot rely on the original heap values
@ -512,6 +520,11 @@ brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
dtuple->bt_columns[i].bv_allnulls = true;
dtuple->bt_columns[i].bv_hasnulls = false;
dtuple->bt_columns[i].bv_values = (Datum *) currdatum;
dtuple->bt_columns[i].bv_mem_value = PointerGetDatum(NULL);
dtuple->bt_columns[i].bv_serialize = NULL;
dtuple->bt_columns[i].bv_context = dtuple->bt_context;
currdatum += sizeof(Datum) * brdesc->bd_info[i]->oi_nstored;
}
@ -591,6 +604,10 @@ brin_deform_tuple(BrinDesc *brdesc, BrinTuple *tuple, BrinMemTuple *dMemtuple)
dtup->bt_columns[keyno].bv_hasnulls = hasnulls[keyno];
dtup->bt_columns[keyno].bv_allnulls = false;
dtup->bt_columns[keyno].bv_mem_value = PointerGetDatum(NULL);
dtup->bt_columns[keyno].bv_serialize = NULL;
dtup->bt_columns[keyno].bv_context = dtup->bt_context;
}
MemoryContextSwitchTo(oldcxt);

View File

@ -14,6 +14,11 @@
#include "access/brin_internal.h"
#include "access/tupdesc.h"
/*
* The BRIN opclasses may register serialization callback, in case the on-disk
* and in-memory representations differ (e.g. for performance reasons).
*/
typedef void (*brin_serialize_callback_type) (BrinDesc *bdesc, Datum src, Datum *dst);
/*
* A BRIN index stores one index tuple per page range. Each index tuple
@ -27,6 +32,9 @@ typedef struct BrinValues
bool bv_hasnulls; /* are there any nulls in the page range? */
bool bv_allnulls; /* are all values nulls in the page range? */
Datum *bv_values; /* current accumulated values */
Datum bv_mem_value; /* expanded accumulated values */
MemoryContext bv_context;
brin_serialize_callback_type bv_serialize;
} BrinValues;
/*

View File

@ -161,18 +161,18 @@ FullTransactionIdAdvance(FullTransactionId *dest)
* development purposes (such as in-progress patches and forks);
* they should not appear in released versions.
*
* OIDs 10000-11999 are reserved for assignment by genbki.pl, for use
* OIDs 10000-12999 are reserved for assignment by genbki.pl, for use
* when the .dat files in src/include/catalog/ do not specify an OID
* for a catalog entry that requires one.
*
* OIDS 12000-16383 are reserved for assignment during initdb
* using the OID generator. (We start the generator at 12000.)
* OIDS 13000-16383 are reserved for assignment during initdb
* using the OID generator. (We start the generator at 13000.)
*
* OIDs beginning at 16384 are assigned from the OID generator
* during normal multiuser operation. (We force the generator up to
* 16384 as soon as we are in normal operation.)
*
* The choices of 8000, 10000 and 12000 are completely arbitrary, and can be
* The choices of 8000, 10000 and 13000 are completely arbitrary, and can be
* moved if we run low on OIDs in any category. Changing the macros below,
* and updating relevant documentation (see bki.sgml and RELEASE_CHANGES),
* should be sufficient to do this. Moving the 16384 boundary between
@ -186,7 +186,7 @@ FullTransactionIdAdvance(FullTransactionId *dest)
* ----------
*/
#define FirstGenbkiObjectId 10000
#define FirstBootstrapObjectId 12000
#define FirstBootstrapObjectId 13000
#define FirstNormalObjectId 16384
/*

View File

@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 202103263
#define CATALOG_VERSION_NO 202103264
#endif

View File

@ -2009,6 +2009,152 @@
amoprighttype => 'int8', amopstrategy => '5', amopopr => '>(int4,int8)',
amopmethod => 'brin' },
# minmax multi integer
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int8', amopstrategy => '1', amopopr => '<(int8,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int8', amopstrategy => '2', amopopr => '<=(int8,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int8', amopstrategy => '3', amopopr => '=(int8,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int8', amopstrategy => '4', amopopr => '>=(int8,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int8', amopstrategy => '5', amopopr => '>(int8,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int2', amopstrategy => '1', amopopr => '<(int8,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int2', amopstrategy => '2', amopopr => '<=(int8,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int2', amopstrategy => '3', amopopr => '=(int8,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int2', amopstrategy => '4', amopopr => '>=(int8,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int2', amopstrategy => '5', amopopr => '>(int8,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int4', amopstrategy => '1', amopopr => '<(int8,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int4', amopstrategy => '2', amopopr => '<=(int8,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int4', amopstrategy => '3', amopopr => '=(int8,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int4', amopstrategy => '4', amopopr => '>=(int8,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int8',
amoprighttype => 'int4', amopstrategy => '5', amopopr => '>(int8,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int2', amopstrategy => '1', amopopr => '<(int2,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int2', amopstrategy => '2', amopopr => '<=(int2,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int2', amopstrategy => '3', amopopr => '=(int2,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int2', amopstrategy => '4', amopopr => '>=(int2,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int2', amopstrategy => '5', amopopr => '>(int2,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int8', amopstrategy => '1', amopopr => '<(int2,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int8', amopstrategy => '2', amopopr => '<=(int2,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int8', amopstrategy => '3', amopopr => '=(int2,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int8', amopstrategy => '4', amopopr => '>=(int2,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int8', amopstrategy => '5', amopopr => '>(int2,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int4', amopstrategy => '1', amopopr => '<(int2,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int4', amopstrategy => '2', amopopr => '<=(int2,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int4', amopstrategy => '3', amopopr => '=(int2,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int4', amopstrategy => '4', amopopr => '>=(int2,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int2',
amoprighttype => 'int4', amopstrategy => '5', amopopr => '>(int2,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int4', amopstrategy => '1', amopopr => '<(int4,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int4', amopstrategy => '2', amopopr => '<=(int4,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int4', amopstrategy => '3', amopopr => '=(int4,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int4', amopstrategy => '4', amopopr => '>=(int4,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int4', amopstrategy => '5', amopopr => '>(int4,int4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int2', amopstrategy => '1', amopopr => '<(int4,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int2', amopstrategy => '2', amopopr => '<=(int4,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int2', amopstrategy => '3', amopopr => '=(int4,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int2', amopstrategy => '4', amopopr => '>=(int4,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int2', amopstrategy => '5', amopopr => '>(int4,int2)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int8', amopstrategy => '1', amopopr => '<(int4,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int8', amopstrategy => '2', amopopr => '<=(int4,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int8', amopstrategy => '3', amopopr => '=(int4,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int8', amopstrategy => '4', amopopr => '>=(int4,int8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/integer_minmax_multi_ops', amoplefttype => 'int4',
amoprighttype => 'int8', amopstrategy => '5', amopopr => '>(int4,int8)',
amopmethod => 'brin' },
# bloom integer
{ amopfamily => 'brin/integer_bloom_ops', amoplefttype => 'int8',
@ -2062,6 +2208,23 @@
amoprighttype => 'oid', amopstrategy => '5', amopopr => '>(oid,oid)',
amopmethod => 'brin' },
# minmax multi oid
{ amopfamily => 'brin/oid_minmax_multi_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '1', amopopr => '<(oid,oid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/oid_minmax_multi_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '2', amopopr => '<=(oid,oid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/oid_minmax_multi_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '3', amopopr => '=(oid,oid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/oid_minmax_multi_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '4', amopopr => '>=(oid,oid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/oid_minmax_multi_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '5', amopopr => '>(oid,oid)',
amopmethod => 'brin' },
# bloom oid
{ amopfamily => 'brin/oid_bloom_ops', amoplefttype => 'oid',
amoprighttype => 'oid', amopstrategy => '1', amopopr => '=(oid,oid)',
@ -2088,6 +2251,22 @@
{ amopfamily => 'brin/tid_bloom_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '1', amopopr => '=(tid,tid)',
amopmethod => 'brin' },
# minmax multi tid
{ amopfamily => 'brin/tid_minmax_multi_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '1', amopopr => '<(tid,tid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/tid_minmax_multi_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '2', amopopr => '<=(tid,tid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/tid_minmax_multi_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '3', amopopr => '=(tid,tid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/tid_minmax_multi_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '4', amopopr => '>=(tid,tid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/tid_minmax_multi_ops', amoplefttype => 'tid',
amoprighttype => 'tid', amopstrategy => '5', amopopr => '>(tid,tid)',
amopmethod => 'brin' },
# minmax float (float4, float8)
@ -2155,6 +2334,72 @@
amoprighttype => 'float8', amopstrategy => '5', amopopr => '>(float8,float8)',
amopmethod => 'brin' },
# minmax multi float (float4, float8)
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '1', amopopr => '<(float4,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '2',
amopopr => '<=(float4,float4)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '3', amopopr => '=(float4,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '4',
amopopr => '>=(float4,float4)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '5', amopopr => '>(float4,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float8', amopstrategy => '1', amopopr => '<(float4,float8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float8', amopstrategy => '2',
amopopr => '<=(float4,float8)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float8', amopstrategy => '3', amopopr => '=(float4,float8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float8', amopstrategy => '4',
amopopr => '>=(float4,float8)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float4',
amoprighttype => 'float8', amopstrategy => '5', amopopr => '>(float4,float8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float4', amopstrategy => '1', amopopr => '<(float8,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float4', amopstrategy => '2',
amopopr => '<=(float8,float4)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float4', amopstrategy => '3', amopopr => '=(float8,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float4', amopstrategy => '4',
amopopr => '>=(float8,float4)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float4', amopstrategy => '5', amopopr => '>(float8,float4)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float8', amopstrategy => '1', amopopr => '<(float8,float8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float8', amopstrategy => '2',
amopopr => '<=(float8,float8)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float8', amopstrategy => '3', amopopr => '=(float8,float8)',
amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float8', amopstrategy => '4',
amopopr => '>=(float8,float8)', amopmethod => 'brin' },
{ amopfamily => 'brin/float_minmax_multi_ops', amoplefttype => 'float8',
amoprighttype => 'float8', amopstrategy => '5', amopopr => '>(float8,float8)',
amopmethod => 'brin' },
# bloom float
{ amopfamily => 'brin/float_bloom_ops', amoplefttype => 'float4',
amoprighttype => 'float4', amopstrategy => '1', amopopr => '=(float4,float4)',
@ -2180,6 +2425,23 @@
amoprighttype => 'macaddr', amopstrategy => '5',
amopopr => '>(macaddr,macaddr)', amopmethod => 'brin' },
# minmax multi macaddr
{ amopfamily => 'brin/macaddr_minmax_multi_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '1',
amopopr => '<(macaddr,macaddr)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr_minmax_multi_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '2',
amopopr => '<=(macaddr,macaddr)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr_minmax_multi_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '3',
amopopr => '=(macaddr,macaddr)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr_minmax_multi_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '4',
amopopr => '>=(macaddr,macaddr)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr_minmax_multi_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '5',
amopopr => '>(macaddr,macaddr)', amopmethod => 'brin' },
# bloom macaddr
{ amopfamily => 'brin/macaddr_bloom_ops', amoplefttype => 'macaddr',
amoprighttype => 'macaddr', amopstrategy => '1',
@ -2202,6 +2464,23 @@
amoprighttype => 'macaddr8', amopstrategy => '5',
amopopr => '>(macaddr8,macaddr8)', amopmethod => 'brin' },
# minmax multi macaddr8
{ amopfamily => 'brin/macaddr8_minmax_multi_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '1',
amopopr => '<(macaddr8,macaddr8)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr8_minmax_multi_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '2',
amopopr => '<=(macaddr8,macaddr8)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr8_minmax_multi_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '3',
amopopr => '=(macaddr8,macaddr8)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr8_minmax_multi_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '4',
amopopr => '>=(macaddr8,macaddr8)', amopmethod => 'brin' },
{ amopfamily => 'brin/macaddr8_minmax_multi_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '5',
amopopr => '>(macaddr8,macaddr8)', amopmethod => 'brin' },
# bloom macaddr8
{ amopfamily => 'brin/macaddr8_bloom_ops', amoplefttype => 'macaddr8',
amoprighttype => 'macaddr8', amopstrategy => '1',
@ -2224,6 +2503,23 @@
amoprighttype => 'inet', amopstrategy => '5', amopopr => '>(inet,inet)',
amopmethod => 'brin' },
# minmax multi inet
{ amopfamily => 'brin/network_minmax_multi_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '1', amopopr => '<(inet,inet)',
amopmethod => 'brin' },
{ amopfamily => 'brin/network_minmax_multi_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '2', amopopr => '<=(inet,inet)',
amopmethod => 'brin' },
{ amopfamily => 'brin/network_minmax_multi_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '3', amopopr => '=(inet,inet)',
amopmethod => 'brin' },
{ amopfamily => 'brin/network_minmax_multi_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '4', amopopr => '>=(inet,inet)',
amopmethod => 'brin' },
{ amopfamily => 'brin/network_minmax_multi_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '5', amopopr => '>(inet,inet)',
amopmethod => 'brin' },
# bloom inet
{ amopfamily => 'brin/network_bloom_ops', amoplefttype => 'inet',
amoprighttype => 'inet', amopstrategy => '1', amopopr => '=(inet,inet)',
@ -2288,6 +2584,23 @@
amoprighttype => 'time', amopstrategy => '5', amopopr => '>(time,time)',
amopmethod => 'brin' },
# minmax multi time without time zone
{ amopfamily => 'brin/time_minmax_multi_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '1', amopopr => '<(time,time)',
amopmethod => 'brin' },
{ amopfamily => 'brin/time_minmax_multi_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '2', amopopr => '<=(time,time)',
amopmethod => 'brin' },
{ amopfamily => 'brin/time_minmax_multi_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '3', amopopr => '=(time,time)',
amopmethod => 'brin' },
{ amopfamily => 'brin/time_minmax_multi_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '4', amopopr => '>=(time,time)',
amopmethod => 'brin' },
{ amopfamily => 'brin/time_minmax_multi_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '5', amopopr => '>(time,time)',
amopmethod => 'brin' },
# bloom time without time zone
{ amopfamily => 'brin/time_bloom_ops', amoplefttype => 'time',
amoprighttype => 'time', amopstrategy => '1', amopopr => '=(time,time)',
@ -2439,6 +2752,152 @@
amoprighttype => 'timestamptz', amopstrategy => '5',
amopopr => '>(timestamptz,timestamptz)', amopmethod => 'brin' },
# minmax multi datetime (date, timestamp, timestamptz)
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamp', amopstrategy => '1',
amopopr => '<(timestamp,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamp', amopstrategy => '2',
amopopr => '<=(timestamp,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamp', amopstrategy => '3',
amopopr => '=(timestamp,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamp', amopstrategy => '4',
amopopr => '>=(timestamp,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamp', amopstrategy => '5',
amopopr => '>(timestamp,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'date', amopstrategy => '1', amopopr => '<(timestamp,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'date', amopstrategy => '2', amopopr => '<=(timestamp,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'date', amopstrategy => '3', amopopr => '=(timestamp,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'date', amopstrategy => '4', amopopr => '>=(timestamp,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'date', amopstrategy => '5', amopopr => '>(timestamp,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamptz', amopstrategy => '1',
amopopr => '<(timestamp,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamptz', amopstrategy => '2',
amopopr => '<=(timestamp,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamptz', amopstrategy => '3',
amopopr => '=(timestamp,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamptz', amopstrategy => '4',
amopopr => '>=(timestamp,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamp',
amoprighttype => 'timestamptz', amopstrategy => '5',
amopopr => '>(timestamp,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'date', amopstrategy => '1', amopopr => '<(date,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'date', amopstrategy => '2', amopopr => '<=(date,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'date', amopstrategy => '3', amopopr => '=(date,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'date', amopstrategy => '4', amopopr => '>=(date,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'date', amopstrategy => '5', amopopr => '>(date,date)',
amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamp', amopstrategy => '1',
amopopr => '<(date,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamp', amopstrategy => '2',
amopopr => '<=(date,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamp', amopstrategy => '3',
amopopr => '=(date,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamp', amopstrategy => '4',
amopopr => '>=(date,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamp', amopstrategy => '5',
amopopr => '>(date,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamptz', amopstrategy => '1',
amopopr => '<(date,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamptz', amopstrategy => '2',
amopopr => '<=(date,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamptz', amopstrategy => '3',
amopopr => '=(date,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamptz', amopstrategy => '4',
amopopr => '>=(date,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'date',
amoprighttype => 'timestamptz', amopstrategy => '5',
amopopr => '>(date,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'date', amopstrategy => '1',
amopopr => '<(timestamptz,date)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'date', amopstrategy => '2',
amopopr => '<=(timestamptz,date)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'date', amopstrategy => '3',
amopopr => '=(timestamptz,date)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'date', amopstrategy => '4',
amopopr => '>=(timestamptz,date)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'date', amopstrategy => '5',
amopopr => '>(timestamptz,date)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamp', amopstrategy => '1',
amopopr => '<(timestamptz,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamp', amopstrategy => '2',
amopopr => '<=(timestamptz,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamp', amopstrategy => '3',
amopopr => '=(timestamptz,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamp', amopstrategy => '4',
amopopr => '>=(timestamptz,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamp', amopstrategy => '5',
amopopr => '>(timestamptz,timestamp)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamptz', amopstrategy => '1',
amopopr => '<(timestamptz,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamptz', amopstrategy => '2',
amopopr => '<=(timestamptz,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamptz', amopstrategy => '3',
amopopr => '=(timestamptz,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamptz', amopstrategy => '4',
amopopr => '>=(timestamptz,timestamptz)', amopmethod => 'brin' },
{ amopfamily => 'brin/datetime_minmax_multi_ops', amoplefttype => 'timestamptz',
amoprighttype => 'timestamptz', amopstrategy => '5',
amopopr => '>(timestamptz,timestamptz)', amopmethod => 'brin' },
# bloom datetime (date, timestamp, timestamptz)
{ amopfamily => 'brin/datetime_bloom_ops', amoplefttype => 'timestamp',
@ -2470,6 +2929,23 @@
amoprighttype => 'interval', amopstrategy => '5',
amopopr => '>(interval,interval)', amopmethod => 'brin' },
# minmax multi interval
{ amopfamily => 'brin/interval_minmax_multi_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '1',
amopopr => '<(interval,interval)', amopmethod => 'brin' },
{ amopfamily => 'brin/interval_minmax_multi_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '2',
amopopr => '<=(interval,interval)', amopmethod => 'brin' },
{ amopfamily => 'brin/interval_minmax_multi_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '3',
amopopr => '=(interval,interval)', amopmethod => 'brin' },
{ amopfamily => 'brin/interval_minmax_multi_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '4',
amopopr => '>=(interval,interval)', amopmethod => 'brin' },
{ amopfamily => 'brin/interval_minmax_multi_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '5',
amopopr => '>(interval,interval)', amopmethod => 'brin' },
# bloom interval
{ amopfamily => 'brin/interval_bloom_ops', amoplefttype => 'interval',
amoprighttype => 'interval', amopstrategy => '1',
@ -2492,6 +2968,23 @@
amoprighttype => 'timetz', amopstrategy => '5', amopopr => '>(timetz,timetz)',
amopmethod => 'brin' },
# minmax multi time with time zone
{ amopfamily => 'brin/timetz_minmax_multi_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '1', amopopr => '<(timetz,timetz)',
amopmethod => 'brin' },
{ amopfamily => 'brin/timetz_minmax_multi_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '2',
amopopr => '<=(timetz,timetz)', amopmethod => 'brin' },
{ amopfamily => 'brin/timetz_minmax_multi_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '3', amopopr => '=(timetz,timetz)',
amopmethod => 'brin' },
{ amopfamily => 'brin/timetz_minmax_multi_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '4',
amopopr => '>=(timetz,timetz)', amopmethod => 'brin' },
{ amopfamily => 'brin/timetz_minmax_multi_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '5', amopopr => '>(timetz,timetz)',
amopmethod => 'brin' },
# bloom time with time zone
{ amopfamily => 'brin/timetz_bloom_ops', amoplefttype => 'timetz',
amoprighttype => 'timetz', amopstrategy => '1', amopopr => '=(timetz,timetz)',
@ -2548,6 +3041,23 @@
amoprighttype => 'numeric', amopstrategy => '5',
amopopr => '>(numeric,numeric)', amopmethod => 'brin' },
# minmax multi numeric
{ amopfamily => 'brin/numeric_minmax_multi_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '1',
amopopr => '<(numeric,numeric)', amopmethod => 'brin' },
{ amopfamily => 'brin/numeric_minmax_multi_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '2',
amopopr => '<=(numeric,numeric)', amopmethod => 'brin' },
{ amopfamily => 'brin/numeric_minmax_multi_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '3',
amopopr => '=(numeric,numeric)', amopmethod => 'brin' },
{ amopfamily => 'brin/numeric_minmax_multi_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '4',
amopopr => '>=(numeric,numeric)', amopmethod => 'brin' },
{ amopfamily => 'brin/numeric_minmax_multi_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '5',
amopopr => '>(numeric,numeric)', amopmethod => 'brin' },
# bloom numeric
{ amopfamily => 'brin/numeric_bloom_ops', amoplefttype => 'numeric',
amoprighttype => 'numeric', amopstrategy => '1',
@ -2570,6 +3080,23 @@
amoprighttype => 'uuid', amopstrategy => '5', amopopr => '>(uuid,uuid)',
amopmethod => 'brin' },
# minmax multi uuid
{ amopfamily => 'brin/uuid_minmax_multi_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '1', amopopr => '<(uuid,uuid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/uuid_minmax_multi_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '2', amopopr => '<=(uuid,uuid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/uuid_minmax_multi_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '3', amopopr => '=(uuid,uuid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/uuid_minmax_multi_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '4', amopopr => '>=(uuid,uuid)',
amopmethod => 'brin' },
{ amopfamily => 'brin/uuid_minmax_multi_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '5', amopopr => '>(uuid,uuid)',
amopmethod => 'brin' },
# bloom uuid
{ amopfamily => 'brin/uuid_bloom_ops', amoplefttype => 'uuid',
amoprighttype => 'uuid', amopstrategy => '1', amopopr => '=(uuid,uuid)',
@ -2636,6 +3163,23 @@
amoprighttype => 'pg_lsn', amopstrategy => '5', amopopr => '>(pg_lsn,pg_lsn)',
amopmethod => 'brin' },
# minmax multi pg_lsn
{ amopfamily => 'brin/pg_lsn_minmax_multi_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '1', amopopr => '<(pg_lsn,pg_lsn)',
amopmethod => 'brin' },
{ amopfamily => 'brin/pg_lsn_minmax_multi_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '2',
amopopr => '<=(pg_lsn,pg_lsn)', amopmethod => 'brin' },
{ amopfamily => 'brin/pg_lsn_minmax_multi_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '3', amopopr => '=(pg_lsn,pg_lsn)',
amopmethod => 'brin' },
{ amopfamily => 'brin/pg_lsn_minmax_multi_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '4',
amopopr => '>=(pg_lsn,pg_lsn)', amopmethod => 'brin' },
{ amopfamily => 'brin/pg_lsn_minmax_multi_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '5', amopopr => '>(pg_lsn,pg_lsn)',
amopmethod => 'brin' },
# bloom pg_lsn
{ amopfamily => 'brin/pg_lsn_bloom_ops', amoplefttype => 'pg_lsn',
amoprighttype => 'pg_lsn', amopstrategy => '1', amopopr => '=(pg_lsn,pg_lsn)',

View File

@ -922,6 +922,58 @@
{ amprocfamily => 'brin/integer_minmax_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi integer: int2, int4, int8
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int2',
amprocrighttype => 'int2', amprocnum => '11', amproc => 'brin_minmax_multi_distance_int2' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int4',
amprocrighttype => 'int4', amprocnum => '11', amproc => 'brin_minmax_multi_distance_int4' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/integer_minmax_multi_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '11', amproc => 'brin_minmax_multi_distance_int8' },
# bloom integer: int2, int4, int8
{ amprocfamily => 'brin/integer_bloom_ops', amproclefttype => 'int8',
amprocrighttype => 'int8', amprocnum => '1',
@ -1017,6 +1069,23 @@
{ amprocfamily => 'brin/oid_minmax_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi oid
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '1', amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/oid_minmax_multi_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '11', amproc => 'brin_minmax_multi_distance_int4' },
# bloom oid
{ amprocfamily => 'brin/oid_bloom_ops', amproclefttype => 'oid',
amprocrighttype => 'oid', amprocnum => '1', amproc => 'brin_bloom_opcinfo' },
@ -1063,6 +1132,23 @@
{ amprocfamily => 'brin/tid_bloom_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '11', amproc => 'hashtid' },
# minmax multi tid
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '1', amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/tid_minmax_multi_ops', amproclefttype => 'tid',
amprocrighttype => 'tid', amprocnum => '11', amproc => 'brin_minmax_multi_distance_tid' },
# minmax float
{ amprocfamily => 'brin/float_minmax_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '1',
@ -1090,6 +1176,45 @@
amprocrighttype => 'float8', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi float
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_float4' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/float_minmax_multi_ops', amproclefttype => 'float8',
amprocrighttype => 'float8', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_float8' },
# bloom float
{ amprocfamily => 'brin/float_bloom_ops', amproclefttype => 'float4',
amprocrighttype => 'float4', amprocnum => '1',
@ -1143,6 +1268,26 @@
amprocrighttype => 'macaddr', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi macaddr
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/macaddr_minmax_multi_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_macaddr' },
# bloom macaddr
{ amprocfamily => 'brin/macaddr_bloom_ops', amproclefttype => 'macaddr',
amprocrighttype => 'macaddr', amprocnum => '1',
@ -1177,6 +1322,26 @@
amprocrighttype => 'macaddr8', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi macaddr8
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/macaddr8_minmax_multi_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_macaddr8' },
# bloom macaddr8
{ amprocfamily => 'brin/macaddr8_bloom_ops', amproclefttype => 'macaddr8',
amprocrighttype => 'macaddr8', amprocnum => '1',
@ -1210,6 +1375,26 @@
{ amprocfamily => 'brin/network_minmax_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi inet
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/network_minmax_multi_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_inet' },
# bloom inet
{ amprocfamily => 'brin/network_bloom_ops', amproclefttype => 'inet',
amprocrighttype => 'inet', amprocnum => '1',
@ -1295,6 +1480,25 @@
{ amprocfamily => 'brin/time_minmax_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi time without time zone
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '4', amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/time_minmax_multi_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_time' },
# bloom time without time zone
{ amprocfamily => 'brin/time_bloom_ops', amproclefttype => 'time',
amprocrighttype => 'time', amprocnum => '1',
@ -1352,6 +1556,64 @@
{ amprocfamily => 'brin/datetime_minmax_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi datetime (date, timestamp, timestamptz)
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_timestamp' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'timestamptz',
amprocrighttype => 'timestamptz', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_timestamp' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/datetime_minmax_multi_ops', amproclefttype => 'date',
amprocrighttype => 'date', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_date' },
# bloom datetime (date, timestamp, timestamptz)
{ amprocfamily => 'brin/datetime_bloom_ops', amproclefttype => 'timestamp',
amprocrighttype => 'timestamp', amprocnum => '1',
@ -1422,6 +1684,26 @@
amprocrighttype => 'interval', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi interval
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/interval_minmax_multi_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_interval' },
# bloom interval
{ amprocfamily => 'brin/interval_bloom_ops', amproclefttype => 'interval',
amprocrighttype => 'interval', amprocnum => '1',
@ -1456,6 +1738,26 @@
amprocrighttype => 'timetz', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi time with time zone
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/timetz_minmax_multi_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_timetz' },
# bloom time with time zone
{ amprocfamily => 'brin/timetz_bloom_ops', amproclefttype => 'timetz',
amprocrighttype => 'timetz', amprocnum => '1',
@ -1516,6 +1818,26 @@
amprocrighttype => 'numeric', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi numeric
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/numeric_minmax_multi_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_numeric' },
# bloom numeric
{ amprocfamily => 'brin/numeric_bloom_ops', amproclefttype => 'numeric',
amprocrighttype => 'numeric', amprocnum => '1',
@ -1549,6 +1871,26 @@
{ amprocfamily => 'brin/uuid_minmax_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '4', amproc => 'brin_minmax_union' },
# minmax multi uuid
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/uuid_minmax_multi_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_uuid' },
# bloom uuid
{ amprocfamily => 'brin/uuid_bloom_ops', amproclefttype => 'uuid',
amprocrighttype => 'uuid', amprocnum => '1',
@ -1604,6 +1946,26 @@
amprocrighttype => 'pg_lsn', amprocnum => '4',
amproc => 'brin_minmax_union' },
# minmax multi pg_lsn
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '1',
amproc => 'brin_minmax_multi_opcinfo' },
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '2',
amproc => 'brin_minmax_multi_add_value' },
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '3',
amproc => 'brin_minmax_multi_consistent' },
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '4',
amproc => 'brin_minmax_multi_union' },
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '5',
amproc => 'brin_minmax_multi_options' },
{ amprocfamily => 'brin/pg_lsn_minmax_multi_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '11',
amproc => 'brin_minmax_multi_distance_pg_lsn' },
# bloom pg_lsn
{ amprocfamily => 'brin/pg_lsn_bloom_ops', amproclefttype => 'pg_lsn',
amprocrighttype => 'pg_lsn', amprocnum => '1',

View File

@ -284,18 +284,27 @@
{ opcmethod => 'brin', opcname => 'int8_minmax_ops',
opcfamily => 'brin/integer_minmax_ops', opcintype => 'int8',
opckeytype => 'int8' },
{ opcmethod => 'brin', opcname => 'int8_minmax_multi_ops',
opcfamily => 'brin/integer_minmax_multi_ops', opcintype => 'int8',
opckeytype => 'int8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'int8_bloom_ops',
opcfamily => 'brin/integer_bloom_ops', opcintype => 'int8',
opckeytype => 'int8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'int2_minmax_ops',
opcfamily => 'brin/integer_minmax_ops', opcintype => 'int2',
opckeytype => 'int2' },
{ opcmethod => 'brin', opcname => 'int2_minmax_multi_ops',
opcfamily => 'brin/integer_minmax_multi_ops', opcintype => 'int2',
opckeytype => 'int2', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'int2_bloom_ops',
opcfamily => 'brin/integer_bloom_ops', opcintype => 'int2',
opckeytype => 'int2', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'int4_minmax_ops',
opcfamily => 'brin/integer_minmax_ops', opcintype => 'int4',
opckeytype => 'int4' },
{ opcmethod => 'brin', opcname => 'int4_minmax_multi_ops',
opcfamily => 'brin/integer_minmax_multi_ops', opcintype => 'int4',
opckeytype => 'int4', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'int4_bloom_ops',
opcfamily => 'brin/integer_bloom_ops', opcintype => 'int4',
opckeytype => 'int4', opcdefault => 'f' },
@ -307,6 +316,9 @@
opckeytype => 'text', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'oid_minmax_ops',
opcfamily => 'brin/oid_minmax_ops', opcintype => 'oid', opckeytype => 'oid' },
{ opcmethod => 'brin', opcname => 'oid_minmax_multi_ops',
opcfamily => 'brin/oid_minmax_multi_ops', opcintype => 'oid',
opckeytype => 'oid', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'oid_bloom_ops',
opcfamily => 'brin/oid_bloom_ops', opcintype => 'oid',
opckeytype => 'oid', opcdefault => 'f' },
@ -315,33 +327,51 @@
{ opcmethod => 'brin', opcname => 'tid_bloom_ops',
opcfamily => 'brin/tid_bloom_ops', opcintype => 'tid', opckeytype => 'tid',
opcdefault => 'f'},
{ opcmethod => 'brin', opcname => 'tid_minmax_multi_ops',
opcfamily => 'brin/tid_minmax_multi_ops', opcintype => 'tid',
opckeytype => 'tid', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'float4_minmax_ops',
opcfamily => 'brin/float_minmax_ops', opcintype => 'float4',
opckeytype => 'float4' },
{ opcmethod => 'brin', opcname => 'float4_minmax_multi_ops',
opcfamily => 'brin/float_minmax_multi_ops', opcintype => 'float4',
opckeytype => 'float4', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'float4_bloom_ops',
opcfamily => 'brin/float_bloom_ops', opcintype => 'float4',
opckeytype => 'float4', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'float8_minmax_ops',
opcfamily => 'brin/float_minmax_ops', opcintype => 'float8',
opckeytype => 'float8' },
{ opcmethod => 'brin', opcname => 'float8_minmax_multi_ops',
opcfamily => 'brin/float_minmax_multi_ops', opcintype => 'float8',
opckeytype => 'float8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'float8_bloom_ops',
opcfamily => 'brin/float_bloom_ops', opcintype => 'float8',
opckeytype => 'float8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'macaddr_minmax_ops',
opcfamily => 'brin/macaddr_minmax_ops', opcintype => 'macaddr',
opckeytype => 'macaddr' },
{ opcmethod => 'brin', opcname => 'macaddr_minmax_multi_ops',
opcfamily => 'brin/macaddr_minmax_multi_ops', opcintype => 'macaddr',
opckeytype => 'macaddr', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'macaddr_bloom_ops',
opcfamily => 'brin/macaddr_bloom_ops', opcintype => 'macaddr',
opckeytype => 'macaddr', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'macaddr8_minmax_ops',
opcfamily => 'brin/macaddr8_minmax_ops', opcintype => 'macaddr8',
opckeytype => 'macaddr8' },
{ opcmethod => 'brin', opcname => 'macaddr8_minmax_multi_ops',
opcfamily => 'brin/macaddr8_minmax_multi_ops', opcintype => 'macaddr8',
opckeytype => 'macaddr8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'macaddr8_bloom_ops',
opcfamily => 'brin/macaddr8_bloom_ops', opcintype => 'macaddr8',
opckeytype => 'macaddr8', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'inet_minmax_ops',
opcfamily => 'brin/network_minmax_ops', opcintype => 'inet',
opcdefault => 'f', opckeytype => 'inet' },
{ opcmethod => 'brin', opcname => 'inet_minmax_multi_ops',
opcfamily => 'brin/network_minmax_multi_ops', opcintype => 'inet',
opcdefault => 'f', opckeytype => 'inet', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'inet_bloom_ops',
opcfamily => 'brin/network_bloom_ops', opcintype => 'inet',
opcdefault => 'f', opckeytype => 'inet', opcdefault => 'f' },
@ -357,36 +387,54 @@
{ opcmethod => 'brin', opcname => 'time_minmax_ops',
opcfamily => 'brin/time_minmax_ops', opcintype => 'time',
opckeytype => 'time' },
{ opcmethod => 'brin', opcname => 'time_minmax_multi_ops',
opcfamily => 'brin/time_minmax_multi_ops', opcintype => 'time',
opckeytype => 'time', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'time_bloom_ops',
opcfamily => 'brin/time_bloom_ops', opcintype => 'time',
opckeytype => 'time', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'date_minmax_ops',
opcfamily => 'brin/datetime_minmax_ops', opcintype => 'date',
opckeytype => 'date' },
{ opcmethod => 'brin', opcname => 'date_minmax_multi_ops',
opcfamily => 'brin/datetime_minmax_multi_ops', opcintype => 'date',
opckeytype => 'date', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'date_bloom_ops',
opcfamily => 'brin/datetime_bloom_ops', opcintype => 'date',
opckeytype => 'date', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timestamp_minmax_ops',
opcfamily => 'brin/datetime_minmax_ops', opcintype => 'timestamp',
opckeytype => 'timestamp' },
{ opcmethod => 'brin', opcname => 'timestamp_minmax_multi_ops',
opcfamily => 'brin/datetime_minmax_multi_ops', opcintype => 'timestamp',
opckeytype => 'timestamp', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timestamp_bloom_ops',
opcfamily => 'brin/datetime_bloom_ops', opcintype => 'timestamp',
opckeytype => 'timestamp', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timestamptz_minmax_ops',
opcfamily => 'brin/datetime_minmax_ops', opcintype => 'timestamptz',
opckeytype => 'timestamptz' },
{ opcmethod => 'brin', opcname => 'timestamptz_minmax_multi_ops',
opcfamily => 'brin/datetime_minmax_multi_ops', opcintype => 'timestamptz',
opckeytype => 'timestamptz', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timestamptz_bloom_ops',
opcfamily => 'brin/datetime_bloom_ops', opcintype => 'timestamptz',
opckeytype => 'timestamptz', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'interval_minmax_ops',
opcfamily => 'brin/interval_minmax_ops', opcintype => 'interval',
opckeytype => 'interval' },
{ opcmethod => 'brin', opcname => 'interval_minmax_multi_ops',
opcfamily => 'brin/interval_minmax_multi_ops', opcintype => 'interval',
opckeytype => 'interval', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'interval_bloom_ops',
opcfamily => 'brin/interval_bloom_ops', opcintype => 'interval',
opckeytype => 'interval', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timetz_minmax_ops',
opcfamily => 'brin/timetz_minmax_ops', opcintype => 'timetz',
opckeytype => 'timetz' },
{ opcmethod => 'brin', opcname => 'timetz_minmax_multi_ops',
opcfamily => 'brin/timetz_minmax_multi_ops', opcintype => 'timetz',
opckeytype => 'timetz', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'timetz_bloom_ops',
opcfamily => 'brin/timetz_bloom_ops', opcintype => 'timetz',
opckeytype => 'timetz', opcdefault => 'f' },
@ -398,6 +446,9 @@
{ opcmethod => 'brin', opcname => 'numeric_minmax_ops',
opcfamily => 'brin/numeric_minmax_ops', opcintype => 'numeric',
opckeytype => 'numeric' },
{ opcmethod => 'brin', opcname => 'numeric_minmax_multi_ops',
opcfamily => 'brin/numeric_minmax_multi_ops', opcintype => 'numeric',
opckeytype => 'numeric', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'numeric_bloom_ops',
opcfamily => 'brin/numeric_bloom_ops', opcintype => 'numeric',
opckeytype => 'numeric', opcdefault => 'f' },
@ -407,6 +458,9 @@
{ opcmethod => 'brin', opcname => 'uuid_minmax_ops',
opcfamily => 'brin/uuid_minmax_ops', opcintype => 'uuid',
opckeytype => 'uuid' },
{ opcmethod => 'brin', opcname => 'uuid_minmax_multi_ops',
opcfamily => 'brin/uuid_minmax_multi_ops', opcintype => 'uuid',
opckeytype => 'uuid', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'uuid_bloom_ops',
opcfamily => 'brin/uuid_bloom_ops', opcintype => 'uuid',
opckeytype => 'uuid', opcdefault => 'f' },
@ -416,6 +470,9 @@
{ opcmethod => 'brin', opcname => 'pg_lsn_minmax_ops',
opcfamily => 'brin/pg_lsn_minmax_ops', opcintype => 'pg_lsn',
opckeytype => 'pg_lsn' },
{ opcmethod => 'brin', opcname => 'pg_lsn_minmax_multi_ops',
opcfamily => 'brin/pg_lsn_minmax_multi_ops', opcintype => 'pg_lsn',
opckeytype => 'pg_lsn', opcdefault => 'f' },
{ opcmethod => 'brin', opcname => 'pg_lsn_bloom_ops',
opcfamily => 'brin/pg_lsn_bloom_ops', opcintype => 'pg_lsn',
opckeytype => 'pg_lsn', opcdefault => 'f' },

View File

@ -182,10 +182,14 @@
opfmethod => 'gin', opfname => 'jsonb_path_ops' },
{ oid => '4054',
opfmethod => 'brin', opfname => 'integer_minmax_ops' },
{ oid => '4602',
opfmethod => 'brin', opfname => 'integer_minmax_multi_ops' },
{ oid => '4572',
opfmethod => 'brin', opfname => 'integer_bloom_ops' },
{ oid => '4055',
opfmethod => 'brin', opfname => 'numeric_minmax_ops' },
{ oid => '4603',
opfmethod => 'brin', opfname => 'numeric_minmax_multi_ops' },
{ oid => '4056',
opfmethod => 'brin', opfname => 'text_minmax_ops' },
{ oid => '4573',
@ -194,10 +198,14 @@
opfmethod => 'brin', opfname => 'numeric_bloom_ops' },
{ oid => '4058',
opfmethod => 'brin', opfname => 'timetz_minmax_ops' },
{ oid => '4604',
opfmethod => 'brin', opfname => 'timetz_minmax_multi_ops' },
{ oid => '4575',
opfmethod => 'brin', opfname => 'timetz_bloom_ops' },
{ oid => '4059',
opfmethod => 'brin', opfname => 'datetime_minmax_ops' },
{ oid => '4605',
opfmethod => 'brin', opfname => 'datetime_minmax_multi_ops' },
{ oid => '4576',
opfmethod => 'brin', opfname => 'datetime_bloom_ops' },
{ oid => '4062',
@ -214,26 +222,38 @@
opfmethod => 'brin', opfname => 'name_bloom_ops' },
{ oid => '4068',
opfmethod => 'brin', opfname => 'oid_minmax_ops' },
{ oid => '4606',
opfmethod => 'brin', opfname => 'oid_minmax_multi_ops' },
{ oid => '4580',
opfmethod => 'brin', opfname => 'oid_bloom_ops' },
{ oid => '4069',
opfmethod => 'brin', opfname => 'tid_minmax_ops' },
{ oid => '4581',
opfmethod => 'brin', opfname => 'tid_bloom_ops' },
{ oid => '4607',
opfmethod => 'brin', opfname => 'tid_minmax_multi_ops' },
{ oid => '4070',
opfmethod => 'brin', opfname => 'float_minmax_ops' },
{ oid => '4608',
opfmethod => 'brin', opfname => 'float_minmax_multi_ops' },
{ oid => '4582',
opfmethod => 'brin', opfname => 'float_bloom_ops' },
{ oid => '4074',
opfmethod => 'brin', opfname => 'macaddr_minmax_ops' },
{ oid => '4609',
opfmethod => 'brin', opfname => 'macaddr_minmax_multi_ops' },
{ oid => '4583',
opfmethod => 'brin', opfname => 'macaddr_bloom_ops' },
{ oid => '4109',
opfmethod => 'brin', opfname => 'macaddr8_minmax_ops' },
{ oid => '4610',
opfmethod => 'brin', opfname => 'macaddr8_minmax_multi_ops' },
{ oid => '4584',
opfmethod => 'brin', opfname => 'macaddr8_bloom_ops' },
{ oid => '4075',
opfmethod => 'brin', opfname => 'network_minmax_ops' },
{ oid => '4611',
opfmethod => 'brin', opfname => 'network_minmax_multi_ops' },
{ oid => '4102',
opfmethod => 'brin', opfname => 'network_inclusion_ops' },
{ oid => '4585',
@ -244,10 +264,14 @@
opfmethod => 'brin', opfname => 'bpchar_bloom_ops' },
{ oid => '4077',
opfmethod => 'brin', opfname => 'time_minmax_ops' },
{ oid => '4612',
opfmethod => 'brin', opfname => 'time_minmax_multi_ops' },
{ oid => '4587',
opfmethod => 'brin', opfname => 'time_bloom_ops' },
{ oid => '4078',
opfmethod => 'brin', opfname => 'interval_minmax_ops' },
{ oid => '4613',
opfmethod => 'brin', opfname => 'interval_minmax_multi_ops' },
{ oid => '4588',
opfmethod => 'brin', opfname => 'interval_bloom_ops' },
{ oid => '4079',
@ -256,12 +280,16 @@
opfmethod => 'brin', opfname => 'varbit_minmax_ops' },
{ oid => '4081',
opfmethod => 'brin', opfname => 'uuid_minmax_ops' },
{ oid => '4614',
opfmethod => 'brin', opfname => 'uuid_minmax_multi_ops' },
{ oid => '4589',
opfmethod => 'brin', opfname => 'uuid_bloom_ops' },
{ oid => '4103',
opfmethod => 'brin', opfname => 'range_inclusion_ops' },
{ oid => '4082',
opfmethod => 'brin', opfname => 'pg_lsn_minmax_ops' },
{ oid => '4615',
opfmethod => 'brin', opfname => 'pg_lsn_minmax_multi_ops' },
{ oid => '4590',
opfmethod => 'brin', opfname => 'pg_lsn_bloom_ops' },
{ oid => '4104',

View File

@ -8238,6 +8238,77 @@
proname => 'brin_minmax_union', prorettype => 'bool',
proargtypes => 'internal internal internal', prosrc => 'brin_minmax_union' },
# BRIN minmax multi
{ oid => '4616', descr => 'BRIN multi minmax support',
proname => 'brin_minmax_multi_opcinfo', prorettype => 'internal',
proargtypes => 'internal', prosrc => 'brin_minmax_multi_opcinfo' },
{ oid => '4617', descr => 'BRIN multi minmax support',
proname => 'brin_minmax_multi_add_value', prorettype => 'bool',
proargtypes => 'internal internal internal internal',
prosrc => 'brin_minmax_multi_add_value' },
{ oid => '4618', descr => 'BRIN multi minmax support',
proname => 'brin_minmax_multi_consistent', prorettype => 'bool',
proargtypes => 'internal internal internal int4',
prosrc => 'brin_minmax_multi_consistent' },
{ oid => '4619', descr => 'BRIN multi minmax support',
proname => 'brin_minmax_multi_union', prorettype => 'bool',
proargtypes => 'internal internal internal', prosrc => 'brin_minmax_multi_union' },
{ oid => '4620', descr => 'BRIN multi minmax support',
proname => 'brin_minmax_multi_options', prorettype => 'void', proisstrict => 'f',
proargtypes => 'internal', prosrc => 'brin_minmax_multi_options' },
{ oid => '4621', descr => 'BRIN multi minmax int2 distance',
proname => 'brin_minmax_multi_distance_int2', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_int2' },
{ oid => '4622', descr => 'BRIN multi minmax int4 distance',
proname => 'brin_minmax_multi_distance_int4', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_int4' },
{ oid => '4623', descr => 'BRIN multi minmax int8 distance',
proname => 'brin_minmax_multi_distance_int8', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_int8' },
{ oid => '4624', descr => 'BRIN multi minmax float4 distance',
proname => 'brin_minmax_multi_distance_float4', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_float4' },
{ oid => '4625', descr => 'BRIN multi minmax float8 distance',
proname => 'brin_minmax_multi_distance_float8', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_float8' },
{ oid => '4626', descr => 'BRIN multi minmax numeric distance',
proname => 'brin_minmax_multi_distance_numeric', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_numeric' },
{ oid => '4627', descr => 'BRIN multi minmax tid distance',
proname => 'brin_minmax_multi_distance_tid', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_tid' },
{ oid => '4628', descr => 'BRIN multi minmax uuid distance',
proname => 'brin_minmax_multi_distance_uuid', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_uuid' },
{ oid => '4629', descr => 'BRIN multi minmax date distance',
proname => 'brin_minmax_multi_distance_date', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_date' },
{ oid => '4630', descr => 'BRIN multi minmax time distance',
proname => 'brin_minmax_multi_distance_time', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_time' },
{ oid => '4631', descr => 'BRIN multi minmax interval distance',
proname => 'brin_minmax_multi_distance_interval', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_interval' },
{ oid => '4632', descr => 'BRIN multi minmax timetz distance',
proname => 'brin_minmax_multi_distance_timetz', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_timetz' },
{ oid => '4633', descr => 'BRIN multi minmax pg_lsn distance',
proname => 'brin_minmax_multi_distance_pg_lsn', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_pg_lsn' },
{ oid => '4634', descr => 'BRIN multi minmax macaddr distance',
proname => 'brin_minmax_multi_distance_macaddr', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_macaddr' },
{ oid => '4635', descr => 'BRIN multi minmax macaddr8 distance',
proname => 'brin_minmax_multi_distance_macaddr8', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_macaddr8' },
{ oid => '4636', descr => 'BRIN multi minmax inet distance',
proname => 'brin_minmax_multi_distance_inet', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_inet' },
{ oid => '4637', descr => 'BRIN multi minmax timestamp distance',
proname => 'brin_minmax_multi_distance_timestamp', prorettype => 'float8',
proargtypes => 'internal internal', prosrc => 'brin_minmax_multi_distance_timestamp' },
# BRIN inclusion
{ oid => '4105', descr => 'BRIN inclusion support',
proname => 'brin_inclusion_opcinfo', prorettype => 'internal',
@ -11462,4 +11533,18 @@
proname => 'brin_bloom_summary_send', provolatile => 's', prorettype => 'bytea',
proargtypes => 'pg_brin_bloom_summary', prosrc => 'brin_bloom_summary_send' },
{ oid => '4638', descr => 'I/O',
proname => 'brin_minmax_multi_summary_in', prorettype => 'pg_brin_minmax_multi_summary',
proargtypes => 'cstring', prosrc => 'brin_minmax_multi_summary_in' },
{ oid => '4639', descr => 'I/O',
proname => 'brin_minmax_multi_summary_out', prorettype => 'cstring',
proargtypes => 'pg_brin_minmax_multi_summary', prosrc => 'brin_minmax_multi_summary_out' },
{ oid => '4640', descr => 'I/O',
proname => 'brin_minmax_multi_summary_recv', provolatile => 's',
prorettype => 'pg_brin_minmax_multi_summary', proargtypes => 'internal',
prosrc => 'brin_minmax_multi_summary_recv' },
{ oid => '4641', descr => 'I/O',
proname => 'brin_minmax_multi_summary_send', provolatile => 's', prorettype => 'bytea',
proargtypes => 'pg_brin_minmax_multi_summary', prosrc => 'brin_minmax_multi_summary_send' },
]

View File

@ -685,4 +685,10 @@
typinput => 'brin_bloom_summary_in', typoutput => 'brin_bloom_summary_out',
typreceive => 'brin_bloom_summary_recv', typsend => 'brin_bloom_summary_send',
typalign => 'i', typstorage => 'x', typcollation => 'default' },
{ oid => '4601',
descr => 'BRIN minmax-multi summary',
typname => 'pg_brin_minmax_multi_summary', typlen => '-1', typbyval => 'f', typcategory => 'S',
typinput => 'brin_minmax_multi_summary_in', typoutput => 'brin_minmax_multi_summary_out',
typreceive => 'brin_minmax_multi_summary_recv', typsend => 'brin_minmax_multi_summary_send',
typalign => 'i', typstorage => 'x', typcollation => 'default' },
]

View File

@ -0,0 +1,450 @@
CREATE TABLE brintest_multi (
int8col bigint,
int2col smallint,
int4col integer,
oidcol oid,
tidcol tid,
float4col real,
float8col double precision,
macaddrcol macaddr,
inetcol inet,
cidrcol cidr,
datecol date,
timecol time without time zone,
timestampcol timestamp without time zone,
timestamptzcol timestamp with time zone,
intervalcol interval,
timetzcol time with time zone,
numericcol numeric,
uuidcol uuid,
lsncol pg_lsn
) WITH (fillfactor=10);
INSERT INTO brintest_multi SELECT
142857 * tenthous,
thousand,
twothousand,
unique1::oid,
format('(%s,%s)', tenthous, twenty)::tid,
(four + 1.0)/(hundred+1),
odd::float8 / (tenthous + 1),
format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr,
inet '10.2.3.4/24' + tenthous,
cidr '10.2.3/24' + tenthous,
date '1995-08-15' + tenthous,
time '01:20:30' + thousand * interval '18.5 second',
timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours',
timestamptz '1972-10-10 03:00' + thousand * interval '1 hour',
justify_days(justify_hours(tenthous * interval '12 minutes')),
timetz '01:30:20+02' + hundred * interval '15 seconds',
tenthous::numeric(36,30) * fivethous * even / (hundred + 1),
format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid,
format('%s/%s%s', odd, even, tenthous)::pg_lsn
FROM tenk1 ORDER BY unique2 LIMIT 100;
-- throw in some NULL's and different values
INSERT INTO brintest_multi (inetcol, cidrcol) SELECT
inet 'fe80::6e40:8ff:fea9:8c46' + tenthous,
cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous
FROM tenk1 ORDER BY thousand, tenthous LIMIT 25;
-- test minmax-multi specific index options
-- number of values must be >= 16
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops(values_per_range = 7)
);
ERROR: value 7 out of bounds for option "values_per_range"
DETAIL: Valid values are between "8" and "256".
-- number of values must be <= 256
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops(values_per_range = 257)
);
ERROR: value 257 out of bounds for option "values_per_range"
DETAIL: Valid values are between "8" and "256".
-- first create an index with a single page range, to force compaction
-- due to exceeding the number of values per summary
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops,
int2col int2_minmax_multi_ops,
int4col int4_minmax_multi_ops,
oidcol oid_minmax_multi_ops,
tidcol tid_minmax_multi_ops,
float4col float4_minmax_multi_ops,
float8col float8_minmax_multi_ops,
macaddrcol macaddr_minmax_multi_ops,
inetcol inet_minmax_multi_ops,
cidrcol inet_minmax_multi_ops,
datecol date_minmax_multi_ops,
timecol time_minmax_multi_ops,
timestampcol timestamp_minmax_multi_ops,
timestamptzcol timestamptz_minmax_multi_ops,
intervalcol interval_minmax_multi_ops,
timetzcol timetz_minmax_multi_ops,
numericcol numeric_minmax_multi_ops,
uuidcol uuid_minmax_multi_ops,
lsncol pg_lsn_minmax_multi_ops
);
DROP INDEX brinidx_multi;
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops,
int2col int2_minmax_multi_ops,
int4col int4_minmax_multi_ops,
oidcol oid_minmax_multi_ops,
tidcol tid_minmax_multi_ops,
float4col float4_minmax_multi_ops,
float8col float8_minmax_multi_ops,
macaddrcol macaddr_minmax_multi_ops,
inetcol inet_minmax_multi_ops,
cidrcol inet_minmax_multi_ops,
datecol date_minmax_multi_ops,
timecol time_minmax_multi_ops,
timestampcol timestamp_minmax_multi_ops,
timestamptzcol timestamptz_minmax_multi_ops,
intervalcol interval_minmax_multi_ops,
timetzcol timetz_minmax_multi_ops,
numericcol numeric_minmax_multi_ops,
uuidcol uuid_minmax_multi_ops,
lsncol pg_lsn_minmax_multi_ops
) with (pages_per_range = 1);
CREATE TABLE brinopers_multi (colname name, typ text,
op text[], value text[], matches int[],
check (cardinality(op) = cardinality(value)),
check (cardinality(op) = cardinality(matches)));
INSERT INTO brinopers_multi VALUES
('int2col', 'int2',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 999}',
'{100, 100, 1, 100, 100}'),
('int2col', 'int4',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 1999}',
'{100, 100, 1, 100, 100}'),
('int2col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 1428427143}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int2',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1999}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int4',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1999}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1428427143}',
'{100, 100, 1, 100, 100}'),
('int8col', 'int2',
'{>, >=}',
'{0, 0}',
'{100, 100}'),
('int8col', 'int4',
'{>, >=}',
'{0, 0}',
'{100, 100}'),
('int8col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 1257141600, 1428427143, 1428427143}',
'{100, 100, 1, 100, 100}'),
('oidcol', 'oid',
'{>, >=, =, <=, <}',
'{0, 0, 8800, 9999, 9999}',
'{100, 100, 1, 100, 100}'),
('tidcol', 'tid',
'{>, >=, =, <=, <}',
'{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}',
'{100, 100, 1, 100, 100}'),
('float4col', 'float4',
'{>, >=, =, <=, <}',
'{0.0103093, 0.0103093, 1, 1, 1}',
'{100, 100, 4, 100, 96}'),
('float4col', 'float8',
'{>, >=, =, <=, <}',
'{0.0103093, 0.0103093, 1, 1, 1}',
'{100, 100, 4, 100, 96}'),
('float8col', 'float4',
'{>, >=, =, <=, <}',
'{0, 0, 0, 1.98, 1.98}',
'{99, 100, 1, 100, 100}'),
('float8col', 'float8',
'{>, >=, =, <=, <}',
'{0, 0, 0, 1.98, 1.98}',
'{99, 100, 1, 100, 100}'),
('macaddrcol', 'macaddr',
'{>, >=, =, <=, <}',
'{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}',
'{99, 100, 2, 100, 100}'),
('inetcol', 'inet',
'{=, <, <=, >, >=}',
'{10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{1, 100, 100, 125, 125}'),
('inetcol', 'cidr',
'{<, <=, >, >=}',
'{255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{100, 100, 125, 125}'),
('cidrcol', 'inet',
'{=, <, <=, >, >=}',
'{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{2, 100, 100, 125, 125}'),
('cidrcol', 'cidr',
'{=, <, <=, >, >=}',
'{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{2, 100, 100, 125, 125}'),
('datecol', 'date',
'{>, >=, =, <=, <}',
'{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}',
'{100, 100, 1, 100, 100}'),
('timecol', 'time',
'{>, >=, =, <=, <}',
'{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}',
'{100, 100, 1, 100, 100}'),
('timestampcol', 'timestamp',
'{>, >=, =, <=, <}',
'{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}',
'{100, 100, 1, 100, 100}'),
('timestampcol', 'timestamptz',
'{>, >=, =, <=, <}',
'{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}',
'{100, 100, 1, 100, 100}'),
('timestamptzcol', 'timestamptz',
'{>, >=, =, <=, <}',
'{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}',
'{100, 100, 1, 100, 100}'),
('intervalcol', 'interval',
'{>, >=, =, <=, <}',
'{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}',
'{100, 100, 1, 100, 100}'),
('timetzcol', 'timetz',
'{>, >=, =, <=, <}',
'{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}',
'{99, 100, 2, 100, 100}'),
('numericcol', 'numeric',
'{>, >=, =, <=, <}',
'{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}',
'{100, 100, 1, 100, 100}'),
('uuidcol', 'uuid',
'{>, >=, =, <=, <}',
'{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}',
'{100, 100, 1, 100, 100}'),
('lsncol', 'pg_lsn',
'{>, >=, =, <=, <, IS, IS NOT}',
'{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}',
'{100, 100, 1, 100, 100, 25, 100}');
DO $x$
DECLARE
r record;
r2 record;
cond text;
idx_ctids tid[];
ss_ctids tid[];
count int;
plan_ok bool;
plan_line text;
BEGIN
FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_multi, unnest(op) WITH ORDINALITY AS oper LOOP
-- prepare the condition
IF r.value IS NULL THEN
cond := format('%I %s %L', r.colname, r.oper, r.value);
ELSE
cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ);
END IF;
-- run the query using the brin index
SET enable_seqscan = 0;
SET enable_bitmapscan = 1;
plan_ok := false;
FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP
IF plan_line LIKE '%Bitmap Heap Scan on brintest_multi%' THEN
plan_ok := true;
END IF;
END LOOP;
IF NOT plan_ok THEN
RAISE WARNING 'did not get bitmap indexscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond)
INTO idx_ctids;
-- run the query using a seqscan
SET enable_seqscan = 1;
SET enable_bitmapscan = 0;
plan_ok := false;
FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP
IF plan_line LIKE '%Seq Scan on brintest_multi%' THEN
plan_ok := true;
END IF;
END LOOP;
IF NOT plan_ok THEN
RAISE WARNING 'did not get seqscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond)
INTO ss_ctids;
-- make sure both return the same results
count := array_length(idx_ctids, 1);
IF NOT (count = array_length(ss_ctids, 1) AND
idx_ctids @> ss_ctids AND
idx_ctids <@ ss_ctids) THEN
-- report the results of each scan to make the differences obvious
RAISE WARNING 'something not right in %: count %', r, count;
SET enable_seqscan = 1;
SET enable_bitmapscan = 0;
FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP
RAISE NOTICE 'seqscan: %', r2;
END LOOP;
SET enable_seqscan = 0;
SET enable_bitmapscan = 1;
FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP
RAISE NOTICE 'bitmapscan: %', r2;
END LOOP;
END IF;
-- make sure we found expected number of matches
IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF;
END LOOP;
END;
$x$;
RESET enable_seqscan;
RESET enable_bitmapscan;
INSERT INTO brintest_multi SELECT
142857 * tenthous,
thousand,
twothousand,
unique1::oid,
format('(%s,%s)', tenthous, twenty)::tid,
(four + 1.0)/(hundred+1),
odd::float8 / (tenthous + 1),
format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr,
inet '10.2.3.4' + tenthous,
cidr '10.2.3/24' + tenthous,
date '1995-08-15' + tenthous,
time '01:20:30' + thousand * interval '18.5 second',
timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours',
timestamptz '1972-10-10 03:00' + thousand * interval '1 hour',
justify_days(justify_hours(tenthous * interval '12 minutes')),
timetz '01:30:20' + hundred * interval '15 seconds',
tenthous::numeric(36,30) * fivethous * even / (hundred + 1),
format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid,
format('%s/%s%s', odd, even, tenthous)::pg_lsn
FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5;
SELECT brin_desummarize_range('brinidx_multi', 0);
brin_desummarize_range
------------------------
(1 row)
VACUUM brintest_multi; -- force a summarization cycle in brinidx
UPDATE brintest_multi SET int8col = int8col * int4col;
-- Tests for brin_summarize_new_values
SELECT brin_summarize_new_values('brintest_multi'); -- error, not an index
ERROR: "brintest_multi" is not an index
SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index
ERROR: "tenk1_unique1" is not a BRIN index
SELECT brin_summarize_new_values('brinidx_multi'); -- ok, no change expected
brin_summarize_new_values
---------------------------
0
(1 row)
-- Tests for brin_desummarize_range
SELECT brin_desummarize_range('brinidx_multi', -1); -- error, invalid range
ERROR: block number out of range: -1
SELECT brin_desummarize_range('brinidx_multi', 0);
brin_desummarize_range
------------------------
(1 row)
SELECT brin_desummarize_range('brinidx_multi', 0);
brin_desummarize_range
------------------------
(1 row)
SELECT brin_desummarize_range('brinidx_multi', 100000000);
brin_desummarize_range
------------------------
(1 row)
-- test building an index with many values, to force compaction of the buffer
CREATE TABLE brin_large_range (a int4);
INSERT INTO brin_large_range SELECT i FROM generate_series(1,10000) s(i);
CREATE INDEX brin_large_range_idx ON brin_large_range USING brin (a int4_minmax_multi_ops);
DROP TABLE brin_large_range;
-- Test brin_summarize_range
CREATE TABLE brin_summarize_multi (
value int
) WITH (fillfactor=10, autovacuum_enabled=false);
CREATE INDEX brin_summarize_multi_idx ON brin_summarize_multi USING brin (value) WITH (pages_per_range=2);
-- Fill a few pages
DO $$
DECLARE curtid tid;
BEGIN
LOOP
INSERT INTO brin_summarize_multi VALUES (1) RETURNING ctid INTO curtid;
EXIT WHEN curtid > tid '(2, 0)';
END LOOP;
END;
$$;
-- summarize one range
SELECT brin_summarize_range('brin_summarize_multi_idx', 0);
brin_summarize_range
----------------------
0
(1 row)
-- nothing: already summarized
SELECT brin_summarize_range('brin_summarize_multi_idx', 1);
brin_summarize_range
----------------------
0
(1 row)
-- summarize one range
SELECT brin_summarize_range('brin_summarize_multi_idx', 2);
brin_summarize_range
----------------------
1
(1 row)
-- nothing: page doesn't exist in table
SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967295);
brin_summarize_range
----------------------
0
(1 row)
-- invalid block number values
SELECT brin_summarize_range('brin_summarize_multi_idx', -1);
ERROR: block number out of range: -1
SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967296);
ERROR: block number out of range: 4294967296
-- test brin cost estimates behave sanely based on correlation of values
CREATE TABLE brin_test_multi (a INT, b INT);
INSERT INTO brin_test_multi SELECT x/100,x%100 FROM generate_series(1,10000) x(x);
CREATE INDEX brin_test_multi_a_idx ON brin_test_multi USING brin (a) WITH (pages_per_range = 2);
CREATE INDEX brin_test_multi_b_idx ON brin_test_multi USING brin (b) WITH (pages_per_range = 2);
VACUUM ANALYZE brin_test_multi;
-- Ensure brin index is used when columns are perfectly correlated
EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE a = 1;
QUERY PLAN
--------------------------------------------------
Bitmap Heap Scan on brin_test_multi
Recheck Cond: (a = 1)
-> Bitmap Index Scan on brin_test_multi_a_idx
Index Cond: (a = 1)
(4 rows)
-- Ensure brin index is not used when values are not correlated
EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1;
QUERY PLAN
-----------------------------
Seq Scan on brin_test_multi
Filter: (b = 1)
(2 rows)

View File

@ -4990,12 +4990,13 @@ List of access methods
(0 rows)
\dAc brin pg*.oid*
List of operator classes
AM | Input type | Storage type | Operator class | Default?
------+------------+--------------+----------------+----------
brin | oid | | oid_bloom_ops | no
brin | oid | | oid_minmax_ops | yes
(2 rows)
List of operator classes
AM | Input type | Storage type | Operator class | Default?
------+------------+--------------+----------------------+----------
brin | oid | | oid_bloom_ops | no
brin | oid | | oid_minmax_multi_ops | no
brin | oid | | oid_minmax_ops | yes
(3 rows)
\dAf spgist
List of operator families

View File

@ -67,14 +67,15 @@ WHERE p1.typtype not in ('p') AND p1.typname NOT LIKE E'\\_%'
WHERE p2.typname = ('_' || p1.typname)::name AND
p2.typelem = p1.oid and p1.typarray = p2.oid)
ORDER BY p1.oid;
oid | typname
------+-----------------------
oid | typname
------+------------------------------
194 | pg_node_tree
3361 | pg_ndistinct
3402 | pg_dependencies
4600 | pg_brin_bloom_summary
4601 | pg_brin_minmax_multi_summary
5017 | pg_mcv_list
(5 rows)
(6 rows)
-- Make sure typarray points to a "true" array type of our own base
SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype,

View File

@ -80,7 +80,7 @@ test: brin gin gist spgist privileges init_privs security_label collate matview
# ----------
# Additional BRIN tests
# ----------
test: brin_bloom
test: brin_bloom brin_multi
# ----------
# Another group of parallel tests

View File

@ -109,6 +109,7 @@ test: namespace
test: prepared_xacts
test: brin
test: brin_bloom
test: brin_multi
test: gin
test: gist
test: spgist

View File

@ -0,0 +1,403 @@
CREATE TABLE brintest_multi (
int8col bigint,
int2col smallint,
int4col integer,
oidcol oid,
tidcol tid,
float4col real,
float8col double precision,
macaddrcol macaddr,
inetcol inet,
cidrcol cidr,
datecol date,
timecol time without time zone,
timestampcol timestamp without time zone,
timestamptzcol timestamp with time zone,
intervalcol interval,
timetzcol time with time zone,
numericcol numeric,
uuidcol uuid,
lsncol pg_lsn
) WITH (fillfactor=10);
INSERT INTO brintest_multi SELECT
142857 * tenthous,
thousand,
twothousand,
unique1::oid,
format('(%s,%s)', tenthous, twenty)::tid,
(four + 1.0)/(hundred+1),
odd::float8 / (tenthous + 1),
format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr,
inet '10.2.3.4/24' + tenthous,
cidr '10.2.3/24' + tenthous,
date '1995-08-15' + tenthous,
time '01:20:30' + thousand * interval '18.5 second',
timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours',
timestamptz '1972-10-10 03:00' + thousand * interval '1 hour',
justify_days(justify_hours(tenthous * interval '12 minutes')),
timetz '01:30:20+02' + hundred * interval '15 seconds',
tenthous::numeric(36,30) * fivethous * even / (hundred + 1),
format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid,
format('%s/%s%s', odd, even, tenthous)::pg_lsn
FROM tenk1 ORDER BY unique2 LIMIT 100;
-- throw in some NULL's and different values
INSERT INTO brintest_multi (inetcol, cidrcol) SELECT
inet 'fe80::6e40:8ff:fea9:8c46' + tenthous,
cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous
FROM tenk1 ORDER BY thousand, tenthous LIMIT 25;
-- test minmax-multi specific index options
-- number of values must be >= 16
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops(values_per_range = 7)
);
-- number of values must be <= 256
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops(values_per_range = 257)
);
-- first create an index with a single page range, to force compaction
-- due to exceeding the number of values per summary
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops,
int2col int2_minmax_multi_ops,
int4col int4_minmax_multi_ops,
oidcol oid_minmax_multi_ops,
tidcol tid_minmax_multi_ops,
float4col float4_minmax_multi_ops,
float8col float8_minmax_multi_ops,
macaddrcol macaddr_minmax_multi_ops,
inetcol inet_minmax_multi_ops,
cidrcol inet_minmax_multi_ops,
datecol date_minmax_multi_ops,
timecol time_minmax_multi_ops,
timestampcol timestamp_minmax_multi_ops,
timestamptzcol timestamptz_minmax_multi_ops,
intervalcol interval_minmax_multi_ops,
timetzcol timetz_minmax_multi_ops,
numericcol numeric_minmax_multi_ops,
uuidcol uuid_minmax_multi_ops,
lsncol pg_lsn_minmax_multi_ops
);
DROP INDEX brinidx_multi;
CREATE INDEX brinidx_multi ON brintest_multi USING brin (
int8col int8_minmax_multi_ops,
int2col int2_minmax_multi_ops,
int4col int4_minmax_multi_ops,
oidcol oid_minmax_multi_ops,
tidcol tid_minmax_multi_ops,
float4col float4_minmax_multi_ops,
float8col float8_minmax_multi_ops,
macaddrcol macaddr_minmax_multi_ops,
inetcol inet_minmax_multi_ops,
cidrcol inet_minmax_multi_ops,
datecol date_minmax_multi_ops,
timecol time_minmax_multi_ops,
timestampcol timestamp_minmax_multi_ops,
timestamptzcol timestamptz_minmax_multi_ops,
intervalcol interval_minmax_multi_ops,
timetzcol timetz_minmax_multi_ops,
numericcol numeric_minmax_multi_ops,
uuidcol uuid_minmax_multi_ops,
lsncol pg_lsn_minmax_multi_ops
) with (pages_per_range = 1);
CREATE TABLE brinopers_multi (colname name, typ text,
op text[], value text[], matches int[],
check (cardinality(op) = cardinality(value)),
check (cardinality(op) = cardinality(matches)));
INSERT INTO brinopers_multi VALUES
('int2col', 'int2',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 999}',
'{100, 100, 1, 100, 100}'),
('int2col', 'int4',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 1999}',
'{100, 100, 1, 100, 100}'),
('int2col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 800, 999, 1428427143}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int2',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1999}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int4',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1999}',
'{100, 100, 1, 100, 100}'),
('int4col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 800, 1999, 1428427143}',
'{100, 100, 1, 100, 100}'),
('int8col', 'int2',
'{>, >=}',
'{0, 0}',
'{100, 100}'),
('int8col', 'int4',
'{>, >=}',
'{0, 0}',
'{100, 100}'),
('int8col', 'int8',
'{>, >=, =, <=, <}',
'{0, 0, 1257141600, 1428427143, 1428427143}',
'{100, 100, 1, 100, 100}'),
('oidcol', 'oid',
'{>, >=, =, <=, <}',
'{0, 0, 8800, 9999, 9999}',
'{100, 100, 1, 100, 100}'),
('tidcol', 'tid',
'{>, >=, =, <=, <}',
'{"(0,0)", "(0,0)", "(8800,0)", "(9999,19)", "(9999,19)"}',
'{100, 100, 1, 100, 100}'),
('float4col', 'float4',
'{>, >=, =, <=, <}',
'{0.0103093, 0.0103093, 1, 1, 1}',
'{100, 100, 4, 100, 96}'),
('float4col', 'float8',
'{>, >=, =, <=, <}',
'{0.0103093, 0.0103093, 1, 1, 1}',
'{100, 100, 4, 100, 96}'),
('float8col', 'float4',
'{>, >=, =, <=, <}',
'{0, 0, 0, 1.98, 1.98}',
'{99, 100, 1, 100, 100}'),
('float8col', 'float8',
'{>, >=, =, <=, <}',
'{0, 0, 0, 1.98, 1.98}',
'{99, 100, 1, 100, 100}'),
('macaddrcol', 'macaddr',
'{>, >=, =, <=, <}',
'{00:00:01:00:00:00, 00:00:01:00:00:00, 2c:00:2d:00:16:00, ff:fe:00:00:00:00, ff:fe:00:00:00:00}',
'{99, 100, 2, 100, 100}'),
('inetcol', 'inet',
'{=, <, <=, >, >=}',
'{10.2.14.231/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{1, 100, 100, 125, 125}'),
('inetcol', 'cidr',
'{<, <=, >, >=}',
'{255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{100, 100, 125, 125}'),
('cidrcol', 'inet',
'{=, <, <=, >, >=}',
'{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{2, 100, 100, 125, 125}'),
('cidrcol', 'cidr',
'{=, <, <=, >, >=}',
'{10.2.14/24, 255.255.255.255, 255.255.255.255, 0.0.0.0, 0.0.0.0}',
'{2, 100, 100, 125, 125}'),
('datecol', 'date',
'{>, >=, =, <=, <}',
'{1995-08-15, 1995-08-15, 2009-12-01, 2022-12-30, 2022-12-30}',
'{100, 100, 1, 100, 100}'),
('timecol', 'time',
'{>, >=, =, <=, <}',
'{01:20:30, 01:20:30, 02:28:57, 06:28:31.5, 06:28:31.5}',
'{100, 100, 1, 100, 100}'),
('timestampcol', 'timestamp',
'{>, >=, =, <=, <}',
'{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}',
'{100, 100, 1, 100, 100}'),
('timestampcol', 'timestamptz',
'{>, >=, =, <=, <}',
'{1942-07-23 03:05:09, 1942-07-23 03:05:09, 1964-03-24 19:26:45, 1984-01-20 22:42:21, 1984-01-20 22:42:21}',
'{100, 100, 1, 100, 100}'),
('timestamptzcol', 'timestamptz',
'{>, >=, =, <=, <}',
'{1972-10-10 03:00:00-04, 1972-10-10 03:00:00-04, 1972-10-19 09:00:00-07, 1972-11-20 19:00:00-03, 1972-11-20 19:00:00-03}',
'{100, 100, 1, 100, 100}'),
('intervalcol', 'interval',
'{>, >=, =, <=, <}',
'{00:00:00, 00:00:00, 1 mons 13 days 12:24, 2 mons 23 days 07:48:00, 1 year}',
'{100, 100, 1, 100, 100}'),
('timetzcol', 'timetz',
'{>, >=, =, <=, <}',
'{01:30:20+02, 01:30:20+02, 01:35:50+02, 23:55:05+02, 23:55:05+02}',
'{99, 100, 2, 100, 100}'),
('numericcol', 'numeric',
'{>, >=, =, <=, <}',
'{0.00, 0.01, 2268164.347826086956521739130434782609, 99470151.9, 99470151.9}',
'{100, 100, 1, 100, 100}'),
('uuidcol', 'uuid',
'{>, >=, =, <=, <}',
'{00040004-0004-0004-0004-000400040004, 00040004-0004-0004-0004-000400040004, 52225222-5222-5222-5222-522252225222, 99989998-9998-9998-9998-999899989998, 99989998-9998-9998-9998-999899989998}',
'{100, 100, 1, 100, 100}'),
('lsncol', 'pg_lsn',
'{>, >=, =, <=, <, IS, IS NOT}',
'{0/1200, 0/1200, 44/455222, 198/1999799, 198/1999799, NULL, NULL}',
'{100, 100, 1, 100, 100, 25, 100}');
DO $x$
DECLARE
r record;
r2 record;
cond text;
idx_ctids tid[];
ss_ctids tid[];
count int;
plan_ok bool;
plan_line text;
BEGIN
FOR r IN SELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_multi, unnest(op) WITH ORDINALITY AS oper LOOP
-- prepare the condition
IF r.value IS NULL THEN
cond := format('%I %s %L', r.colname, r.oper, r.value);
ELSE
cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ);
END IF;
-- run the query using the brin index
SET enable_seqscan = 0;
SET enable_bitmapscan = 1;
plan_ok := false;
FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP
IF plan_line LIKE '%Bitmap Heap Scan on brintest_multi%' THEN
plan_ok := true;
END IF;
END LOOP;
IF NOT plan_ok THEN
RAISE WARNING 'did not get bitmap indexscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond)
INTO idx_ctids;
-- run the query using a seqscan
SET enable_seqscan = 1;
SET enable_bitmapscan = 0;
plan_ok := false;
FOR plan_line IN EXECUTE format($y$EXPLAIN SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond) LOOP
IF plan_line LIKE '%Seq Scan on brintest_multi%' THEN
plan_ok := true;
END IF;
END LOOP;
IF NOT plan_ok THEN
RAISE WARNING 'did not get seqscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_multi WHERE %s $y$, cond)
INTO ss_ctids;
-- make sure both return the same results
count := array_length(idx_ctids, 1);
IF NOT (count = array_length(ss_ctids, 1) AND
idx_ctids @> ss_ctids AND
idx_ctids <@ ss_ctids) THEN
-- report the results of each scan to make the differences obvious
RAISE WARNING 'something not right in %: count %', r, count;
SET enable_seqscan = 1;
SET enable_bitmapscan = 0;
FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP
RAISE NOTICE 'seqscan: %', r2;
END LOOP;
SET enable_seqscan = 0;
SET enable_bitmapscan = 1;
FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_multi WHERE ' || cond LOOP
RAISE NOTICE 'bitmapscan: %', r2;
END LOOP;
END IF;
-- make sure we found expected number of matches
IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF;
END LOOP;
END;
$x$;
RESET enable_seqscan;
RESET enable_bitmapscan;
INSERT INTO brintest_multi SELECT
142857 * tenthous,
thousand,
twothousand,
unique1::oid,
format('(%s,%s)', tenthous, twenty)::tid,
(four + 1.0)/(hundred+1),
odd::float8 / (tenthous + 1),
format('%s:00:%s:00:%s:00', to_hex(odd), to_hex(even), to_hex(hundred))::macaddr,
inet '10.2.3.4' + tenthous,
cidr '10.2.3/24' + tenthous,
date '1995-08-15' + tenthous,
time '01:20:30' + thousand * interval '18.5 second',
timestamp '1942-07-23 03:05:09' + tenthous * interval '36.38 hours',
timestamptz '1972-10-10 03:00' + thousand * interval '1 hour',
justify_days(justify_hours(tenthous * interval '12 minutes')),
timetz '01:30:20' + hundred * interval '15 seconds',
tenthous::numeric(36,30) * fivethous * even / (hundred + 1),
format('%s%s-%s-%s-%s-%s%s%s', to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'), to_char(tenthous, 'FM0000'))::uuid,
format('%s/%s%s', odd, even, tenthous)::pg_lsn
FROM tenk1 ORDER BY unique2 LIMIT 5 OFFSET 5;
SELECT brin_desummarize_range('brinidx_multi', 0);
VACUUM brintest_multi; -- force a summarization cycle in brinidx
UPDATE brintest_multi SET int8col = int8col * int4col;
-- Tests for brin_summarize_new_values
SELECT brin_summarize_new_values('brintest_multi'); -- error, not an index
SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index
SELECT brin_summarize_new_values('brinidx_multi'); -- ok, no change expected
-- Tests for brin_desummarize_range
SELECT brin_desummarize_range('brinidx_multi', -1); -- error, invalid range
SELECT brin_desummarize_range('brinidx_multi', 0);
SELECT brin_desummarize_range('brinidx_multi', 0);
SELECT brin_desummarize_range('brinidx_multi', 100000000);
-- test building an index with many values, to force compaction of the buffer
CREATE TABLE brin_large_range (a int4);
INSERT INTO brin_large_range SELECT i FROM generate_series(1,10000) s(i);
CREATE INDEX brin_large_range_idx ON brin_large_range USING brin (a int4_minmax_multi_ops);
DROP TABLE brin_large_range;
-- Test brin_summarize_range
CREATE TABLE brin_summarize_multi (
value int
) WITH (fillfactor=10, autovacuum_enabled=false);
CREATE INDEX brin_summarize_multi_idx ON brin_summarize_multi USING brin (value) WITH (pages_per_range=2);
-- Fill a few pages
DO $$
DECLARE curtid tid;
BEGIN
LOOP
INSERT INTO brin_summarize_multi VALUES (1) RETURNING ctid INTO curtid;
EXIT WHEN curtid > tid '(2, 0)';
END LOOP;
END;
$$;
-- summarize one range
SELECT brin_summarize_range('brin_summarize_multi_idx', 0);
-- nothing: already summarized
SELECT brin_summarize_range('brin_summarize_multi_idx', 1);
-- summarize one range
SELECT brin_summarize_range('brin_summarize_multi_idx', 2);
-- nothing: page doesn't exist in table
SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967295);
-- invalid block number values
SELECT brin_summarize_range('brin_summarize_multi_idx', -1);
SELECT brin_summarize_range('brin_summarize_multi_idx', 4294967296);
-- test brin cost estimates behave sanely based on correlation of values
CREATE TABLE brin_test_multi (a INT, b INT);
INSERT INTO brin_test_multi SELECT x/100,x%100 FROM generate_series(1,10000) x(x);
CREATE INDEX brin_test_multi_a_idx ON brin_test_multi USING brin (a) WITH (pages_per_range = 2);
CREATE INDEX brin_test_multi_b_idx ON brin_test_multi USING brin (b) WITH (pages_per_range = 2);
VACUUM ANALYZE brin_test_multi;
-- Ensure brin index is used when columns are perfectly correlated
EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE a = 1;
-- Ensure brin index is not used when values are not correlated
EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1;