Skip to content

Commit db6335b

Browse files
committed
Add support of multirange matching to the existing range GiST indexes
6df7a96 has introduced a set of operators between ranges and multiranges. Existing GiST indexes for ranges could easily support majority of them. This commit adds support for new operators to the existing range GiST indexes. New operators resides the same strategy numbers as existing ones. Appropriate check function is determined using the subtype. Catversion is bumped.
1 parent d1d61a8 commit db6335b

15 files changed

+1024
-69
lines changed

doc/src/sgml/gist.sgml

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,29 @@
116116
<row><entry><literal>&gt;= (inet,inet)</literal></entry></row>
117117
<row><entry><literal>&amp;&amp; (inet,inet)</literal></entry></row>
118118

119+
<row>
120+
<entry valign="middle" morerows="17"><literal>multirange_ops</literal></entry>
121+
<entry><literal>= (anymultirange,anymultirange)</literal></entry>
122+
<entry valign="middle" morerows="17"></entry>
123+
</row>
124+
<row><entry><literal>&amp;&amp; (anymultirange,anymultirange)</literal></entry></row>
125+
<row><entry><literal>&amp;&amp; (anymultirange,anyrange)</literal></entry></row>
126+
<row><entry><literal>@&gt; (anymultirange,anyelement)</literal></entry></row>
127+
<row><entry><literal>@&gt; (anymultirange,anymultirange)</literal></entry></row>
128+
<row><entry><literal>@&gt; (anymultirange,anyrange)</literal></entry></row>
129+
<row><entry><literal>&lt;@ (anymultirange,anymultirange)</literal></entry></row>
130+
<row><entry><literal>&lt;@ (anymultirange,anyrange)</literal></entry></row>
131+
<row><entry><literal>&lt;&lt; (anymultirange,anymultirange)</literal></entry></row>
132+
<row><entry><literal>&lt;&lt; (anymultirange,anyrange)</literal></entry></row>
133+
<row><entry><literal>&gt;&gt; (anymultirange,anymultirange)</literal></entry></row>
134+
<row><entry><literal>&gt;&gt; (anymultirange,anyrange)</literal></entry></row>
135+
<row><entry><literal>&amp;&lt; (anymultirange,anymultirange)</literal></entry></row>
136+
<row><entry><literal>&amp;&lt; (anymultirange,anyrange)</literal></entry></row>
137+
<row><entry><literal>&amp;&gt; (anymultirange,anymultirange)</literal></entry></row>
138+
<row><entry><literal>&amp;&gt; (anymultirange,anyrange)</literal></entry></row>
139+
<row><entry><literal>-|- (anymultirange,anymultirange)</literal></entry></row>
140+
<row><entry><literal>-|- (anymultirange,anyrange)</literal></entry></row>
141+
119142
<row>
120143
<entry valign="middle" morerows="7"><literal>point_ops</literal></entry>
121144
<entry><literal>|&gt;&gt; (point,point)</literal></entry>
@@ -149,19 +172,27 @@
149172
<row><entry><literal>~ (polygon,polygon)</literal></entry></row>
150173

151174
<row>
152-
<entry valign="middle" morerows="9"><literal>range_ops</literal></entry>
175+
<entry valign="middle" morerows="17"><literal>range_ops</literal></entry>
153176
<entry><literal>= (anyrange,anyrange)</literal></entry>
154-
<entry valign="middle" morerows="9"></entry>
177+
<entry valign="middle" morerows="17"></entry>
155178
</row>
156179
<row><entry><literal>&amp;&amp; (anyrange,anyrange)</literal></entry></row>
180+
<row><entry><literal>&amp;&amp; (anyrange,anymultirange)</literal></entry></row>
157181
<row><entry><literal>@&gt; (anyrange,anyelement)</literal></entry></row>
158182
<row><entry><literal>@&gt; (anyrange,anyrange)</literal></entry></row>
183+
<row><entry><literal>@&gt; (anyrange,anymultirange)</literal></entry></row>
159184
<row><entry><literal>&lt;@ (anyrange,anyrange)</literal></entry></row>
185+
<row><entry><literal>&lt;@ (anyrange,anymultirange)</literal></entry></row>
160186
<row><entry><literal>&lt;&lt; (anyrange,anyrange)</literal></entry></row>
187+
<row><entry><literal>&lt;&lt; (anyrange,anymultirange)</literal></entry></row>
161188
<row><entry><literal>&gt;&gt; (anyrange,anyrange)</literal></entry></row>
189+
<row><entry><literal>&gt;&gt; (anyrange,anymultirange)</literal></entry></row>
162190
<row><entry><literal>&amp;&lt; (anyrange,anyrange)</literal></entry></row>
191+
<row><entry><literal>&amp;&lt; (anyrange,anymultirange)</literal></entry></row>
163192
<row><entry><literal>&amp;&gt; (anyrange,anyrange)</literal></entry></row>
193+
<row><entry><literal>&amp;&gt; (anyrange,anymultirange)</literal></entry></row>
164194
<row><entry><literal>-|- (anyrange,anyrange)</literal></entry></row>
195+
<row><entry><literal>-|- (anyrange,anymultirange)</literal></entry></row>
165196

166197
<row>
167198
<entry valign="middle" morerows="1"><literal>tsquery_ops</literal></entry>

doc/src/sgml/rangetypes.sgml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,11 +469,13 @@ SELECT '[11:10, 23:00]'::timerange;
469469

470470
<para>
471471
GiST and SP-GiST indexes can be created for table columns of range types.
472+
GiST indexes can be also created for table columns of multirange types.
472473
For instance, to create a GiST index:
473474
<programlisting>
474475
CREATE INDEX reservation_idx ON reservation USING GIST (during);
475476
</programlisting>
476-
A GiST or SP-GiST index can accelerate queries involving these range operators:
477+
A GiST or SP-GiST index on ranges can accelerate queries involving these
478+
range operators:
477479
<literal>=</literal>,
478480
<literal>&amp;&amp;</literal>,
479481
<literal>&lt;@</literal>,
@@ -482,8 +484,21 @@ CREATE INDEX reservation_idx ON reservation USING GIST (during);
482484
<literal>&gt;&gt;</literal>,
483485
<literal>-|-</literal>,
484486
<literal>&amp;&lt;</literal>, and
485-
<literal>&amp;&gt;</literal>
486-
(see <xref linkend="range-operators-table"/> for more information).
487+
<literal>&amp;&gt;</literal>.
488+
A GiST index on multiranges can accelerate queries involving the same
489+
set of multirange operators.
490+
A GiST index on ranges and GiST index on multiranges can also accelerate
491+
queries involving these cross-type range to multirange and multirange to
492+
range operators correspondingly:
493+
<literal>&amp;&amp;</literal>,
494+
<literal>&lt;@</literal>,
495+
<literal>@&gt;</literal>,
496+
<literal>&lt;&lt;</literal>,
497+
<literal>&gt;&gt;</literal>,
498+
<literal>-|-</literal>,
499+
<literal>&amp;&lt;</literal>, and
500+
<literal>&amp;&gt;</literal>.
501+
See <xref linkend="range-operators-table"/> for more information.
487502
</para>
488503

489504
<para>

src/backend/utils/adt/multirangetypes.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,27 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
768768
upper->lower = false;
769769
}
770770

771+
/*
772+
* Construct union range from the multirange.
773+
*/
774+
RangeType *
775+
multirange_get_union_range(TypeCacheEntry *rangetyp,
776+
const MultirangeType *mr)
777+
{
778+
RangeBound lower,
779+
upper,
780+
tmp;
781+
782+
if (MultirangeIsEmpty(mr))
783+
return make_empty_range(rangetyp);
784+
785+
multirange_get_bounds(rangetyp, mr, 0, &lower, &tmp);
786+
multirange_get_bounds(rangetyp, mr, mr->rangeCount - 1, &tmp, &upper);
787+
788+
return make_range(rangetyp, &lower, &upper, false);
789+
}
790+
791+
771792
/*
772793
* multirange_deserialize: deconstruct a multirange value
773794
*

0 commit comments

Comments
 (0)