diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index cdfe5dec565b85a8cd11bb7d9b7505d3d4c150d8..c8c3de72e335463aae0993cd7c25e94f7dd30c4e 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -529,14 +529,79 @@ typedef struct BrinOpcInfo </varlistentry> </variablelist> - To implement these methods in a generic way, the operator class - defines its own internal support functions. - (For instance, the <quote>min/max</> operator classes implement - support functions for the four inequality operators for their data type.) - Additionally, the operator class must supply appropriate - operator entries, - to enable the optimizer to use the index when those operators are - used in queries. + 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 datatypes 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 procedures's source code. </para> + + <para> + Operator classes that implement completely different semantics are also + possible, provided implementations of the four main support procedures + described above are written. Note that backwards compatibility across major + releases is not guaranteed: for example, additional support procedures might + be required in later releases. + </para> + + <para> + To write an operator class for a datatype that implements a totally + ordered set, it is possible to use the Minmax support procedures + alongside the corresponding operators, as shown in + <xref linkend="brin-extensibility-minmax-table">. + All operator class members (procedures and operators) are mandatory. + </para> + + <table id="brin-extensibility-minmax-table"> + <title>Procedure and Support Numbers for Minmax 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>function <function>brin_minmax_opcinfo()</function></entry> + </row> + <row> + <entry>Support Procedure 2</entry> + <entry>function <function>brin_minmax_add_value()</function></entry> + </row> + <row> + <entry>Support Procedure 3</entry> + <entry>function <function>brin_minmax_consistent()</function></entry> + </row> + <row> + <entry>Support Procedure 4</entry> + <entry>function <function>brin_minmax_union()</function></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> </sect1> </chapter> diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index ff18b220c2b8f9605a0ca07c1e9e82d5d95e9892..268a55e71f93a49451de2a392b3a8535f41f3415 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -688,7 +688,7 @@ brinbuildempty(PG_FUNCTION_ARGS) * * XXX we could mark item tuples as "dirty" (when a minimum or maximum heap * tuple is deleted), meaning the need to re-run summarization on the affected - * range. Need to an extra flag in mmtuples for that. + * range. Need to an extra flag in brintuples for that. */ Datum brinbulkdelete(PG_FUNCTION_ARGS) diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c index 09001552920b552e1dfb2f8b6020a041ab4efe19..760f0daf024df4fd14af409d4ea08d1193f8da12 100644 --- a/src/backend/access/brin/brin_xlog.c +++ b/src/backend/access/brin/brin_xlog.c @@ -180,11 +180,11 @@ brin_xlog_samepage_update(XLogReaderState *record) if (action == BLK_NEEDS_REDO) { Size tuplen; - BrinTuple *mmtuple; + BrinTuple *brintuple; Page page; OffsetNumber offnum; - mmtuple = (BrinTuple *) XLogRecGetBlockData(record, 0, &tuplen); + brintuple = (BrinTuple *) XLogRecGetBlockData(record, 0, &tuplen); page = (Page) BufferGetPage(buffer); @@ -193,7 +193,7 @@ brin_xlog_samepage_update(XLogReaderState *record) elog(PANIC, "brin_xlog_samepage_update: invalid max offset number"); PageIndexDeleteNoCompact(page, &offnum, 1); - offnum = PageAddItem(page, (Item) mmtuple, tuplen, offnum, true, false); + offnum = PageAddItem(page, (Item) brintuple, tuplen, offnum, true, false); if (offnum == InvalidOffsetNumber) elog(PANIC, "brin_xlog_samepage_update: failed to add tuple");