@@ -535,7 +535,7 @@ typedef struct BrinOpcInfo
535
535
defined by the user for other data types using equivalent definitions,
536
536
without having to write any source code; appropriate catalog entries being
537
537
declared is enough. Note that assumptions about the semantics of operator
538
- strategies are embedded in the support procedures's source code.
538
+ strategies are embedded in the support procedures' source code.
539
539
</para>
540
540
541
541
<para>
@@ -566,19 +566,19 @@ typedef struct BrinOpcInfo
566
566
<tbody>
567
567
<row>
568
568
<entry>Support Procedure 1</entry>
569
- <entry>function <function>brin_minmax_opcinfo()</function></entry>
569
+ <entry>internal function <function>brin_minmax_opcinfo()</function></entry>
570
570
</row>
571
571
<row>
572
572
<entry>Support Procedure 2</entry>
573
- <entry>function <function>brin_minmax_add_value()</function></entry>
573
+ <entry>internal function <function>brin_minmax_add_value()</function></entry>
574
574
</row>
575
575
<row>
576
576
<entry>Support Procedure 3</entry>
577
- <entry>function <function>brin_minmax_consistent()</function></entry>
577
+ <entry>internal function <function>brin_minmax_consistent()</function></entry>
578
578
</row>
579
579
<row>
580
580
<entry>Support Procedure 4</entry>
581
- <entry>function <function>brin_minmax_union()</function></entry>
581
+ <entry>internal function <function>brin_minmax_union()</function></entry>
582
582
</row>
583
583
<row>
584
584
<entry>Operator Strategy 1</entry>
@@ -603,5 +603,191 @@ typedef struct BrinOpcInfo
603
603
</tbody>
604
604
</tgroup>
605
605
</table>
606
+
607
+ <para>
608
+ To write an operator class for a complex datatype which has values
609
+ included within another type, it's possible to use the inclusion support
610
+ procedures alongside the corresponding operators, as shown
611
+ in <xref linkend="brin-extensibility-inclusion-table">. It requires
612
+ only a single additional function, which can be written in any language.
613
+ More functions can be defined for additional functionality. All operators
614
+ are optional. Some operators require other operators, as shown as
615
+ dependencies on the table.
616
+ </para>
617
+
618
+ <table id="brin-extensibility-inclusion-table">
619
+ <title>Procedure and Support Numbers for Inclusion Operator Classes</title>
620
+ <tgroup cols="3">
621
+ <thead>
622
+ <row>
623
+ <entry>Operator class member</entry>
624
+ <entry>Object</entry>
625
+ <entry>Dependency</entry>
626
+ </row>
627
+ </thead>
628
+ <tbody>
629
+ <row>
630
+ <entry>Support Procedure 1</entry>
631
+ <entry>internal function <function>brin_inclusion_opcinfo()</function></entry>
632
+ <entry></entry>
633
+ </row>
634
+ <row>
635
+ <entry>Support Procedure 2</entry>
636
+ <entry>internal function <function>brin_inclusion_add_value()</function></entry>
637
+ <entry></entry>
638
+ </row>
639
+ <row>
640
+ <entry>Support Procedure 3</entry>
641
+ <entry>internal function <function>brin_inclusion_consistent()</function></entry>
642
+ <entry></entry>
643
+ </row>
644
+ <row>
645
+ <entry>Support Procedure 4</entry>
646
+ <entry>internal function <function>brin_inclusion_union()</function></entry>
647
+ <entry></entry>
648
+ </row>
649
+ <row>
650
+ <entry>Support Procedure 11</entry>
651
+ <entry>function to merge two elements</entry>
652
+ <entry></entry>
653
+ </row>
654
+ <row>
655
+ <entry>Support Procedure 12</entry>
656
+ <entry>optional function to check whether two elements are mergeable</entry>
657
+ <entry></entry>
658
+ </row>
659
+ <row>
660
+ <entry>Support Procedure 13</entry>
661
+ <entry>optional function to check if an element is contained within another</entry>
662
+ <entry></entry>
663
+ </row>
664
+ <row>
665
+ <entry>Support Procedure 14</entry>
666
+ <entry>optional function to check whether an element is empty</entry>
667
+ <entry></entry>
668
+ </row>
669
+ <row>
670
+ <entry>Operator Strategy 1</entry>
671
+ <entry>operator left-of</entry>
672
+ <entry>Operator Strategy 4</entry>
673
+ </row>
674
+ <row>
675
+ <entry>Operator Strategy 2</entry>
676
+ <entry>operator does-not-extend-to-the-right-of</entry>
677
+ <entry>Operator Strategy 5</entry>
678
+ </row>
679
+ <row>
680
+ <entry>Operator Strategy 3</entry>
681
+ <entry>operator overlaps</entry>
682
+ <entry></entry>
683
+ </row>
684
+ <row>
685
+ <entry>Operator Strategy 4</entry>
686
+ <entry>operator right-of</entry>
687
+ <entry>Operator Strategy 2</entry>
688
+ </row>
689
+ <row>
690
+ <entry>Operator Strategy 5</entry>
691
+ <entry>operator does-not-extend-to-the-right-of</entry>
692
+ <entry>Operator Strategy 1</entry>
693
+ </row>
694
+ <row>
695
+ <entry>Operator Strategy 6, 18</entry>
696
+ <entry>operator same-as-or-equal-to</entry>
697
+ <entry>Operator Strategy 7</entry>
698
+ </row>
699
+ <row>
700
+ <entry>Operator Strategy 7, 13, 16, 24, 25</entry>
701
+ <entry>operator contains-or-equal-to</entry>
702
+ <entry></entry>
703
+ </row>
704
+ <row>
705
+ <entry>Operator Strategy 8, 14, 26, 27</entry>
706
+ <entry>operator is-contained-by-or-equal-to</entry>
707
+ <entry>Operator Strategy 3</entry>
708
+ </row>
709
+ <row>
710
+ <entry>Operator Strategy 9</entry>
711
+ <entry>operator does-not-extend-above</entry>
712
+ <entry>Operator Strategy 11</entry>
713
+ </row>
714
+ <row>
715
+ <entry>Operator Strategy 10</entry>
716
+ <entry>operator is-below</entry>
717
+ <entry>Operator Strategy 12</entry>
718
+ </row>
719
+ <row>
720
+ <entry>Operator Strategy 11</entry>
721
+ <entry>operator is-above</entry>
722
+ <entry>Operator Strategy 9</entry>
723
+ </row>
724
+ <row>
725
+ <entry>Operator Strategy 12</entry>
726
+ <entry>operator does-not-extend-below</entry>
727
+ <entry>Operator Strategy 10</entry>
728
+ </row>
729
+ <row>
730
+ <entry>Operator Strategy 20</entry>
731
+ <entry>operator less-than</entry>
732
+ <entry>Operator Strategy 4</entry>
733
+ </row>
734
+ <row>
735
+ <entry>Operator Strategy 21</entry>
736
+ <entry>operator less-than-or-equal-to</entry>
737
+ <entry>Operator Strategy 4</entry>
738
+ </row>
739
+ <row>
740
+ <entry>Operator Strategy 22</entry>
741
+ <entry>operator greater-than</entry>
742
+ <entry>Operator Strategy 1</entry>
743
+ </row>
744
+ <row>
745
+ <entry>Operator Strategy 23</entry>
746
+ <entry>operator greater-than-or-equal-to</entry>
747
+ <entry>Operator Strategy 1</entry>
748
+ </row>
749
+ </tbody>
750
+ </tgroup>
751
+ </table>
752
+
753
+ <para>
754
+ Support procedure numbers 1-10 are reserved for the BRIN internal
755
+ functions, so the SQL level functions start with number 11. Support
756
+ function number 11 is the main function required to build the index.
757
+ It should accept two arguments with the same datatype as the opclass,
758
+ and return the union of them. The inclusion opclass can store union
759
+ values with different datatypes if it is defined with the
760
+ <literal>STORAGE</> parameter. The return value of the union
761
+ function should match the <literal>STORAGE</> datatype.
762
+ </para>
763
+
764
+ <para>
765
+ Support procedure numbers 12 and 14 are provided to support
766
+ irregularities of built-in datatypes. Procedure number 12
767
+ is used to support network addresses from different families which
768
+ are not mergeable. Procedure number 14 is used to support
769
+ empty ranges. Procedure number 13 is an optional but
770
+ recommended one, which allows the new value to be checked before
771
+ it is passed to the union function. As the BRIN framework can shortcut
772
+ some operations when the union is not changed, using this
773
+ function can improve index performance.
774
+ </para>
775
+
776
+ <para>
777
+ Both minmax and inclusion opclasses support cross-datatype
778
+ operators, though with these the dependencies become more complicated.
779
+ The minmax opclass requires a full set of operators to be
780
+ defined with both arguments having the same datatype. It allows
781
+ additional datatypes to be supported by defining extra sets
782
+ of operators. Inclusion opclass operator strategies are dependent
783
+ on another operator strategy as shown in
784
+ <xref linkend="brin-extensibility-inclusion-table">, or the same
785
+ operator strategy as themselves. They require the dependency
786
+ operator to be defined with the <literal>STORAGE</> datatype as the
787
+ left-hand-side argument and the other supported datatype to be the
788
+ right-hand-side argument of the supported operator. See
789
+ <literal>float4_minmax_ops</> as an example of minmax, and
790
+ <literal>box_inclusion_ops</> as an example of inclusion.
791
+ </para>
606
792
</sect1>
607
793
</chapter>
0 commit comments