switch (operator)
{
/* these return false if either argument is empty */
- case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_MULTIRANGE_OP:
- case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
- case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_LEFT_RANGE_OP:
case OID_MULTIRANGE_LEFT_MULTIRANGE_OP:
+ case OID_MULTIRANGE_RIGHT_RANGE_OP:
case OID_MULTIRANGE_RIGHT_MULTIRANGE_OP:
/* nothing is less than an empty multirange */
case OID_MULTIRANGE_LESS_OP:
* only empty multiranges can be contained by an empty
* multirange
*/
- case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+ case OID_RANGE_MULTIRANGE_CONTAINED_OP:
case OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP:
/* only empty ranges are <= an empty multirange */
case OID_MULTIRANGE_LESS_EQUAL_OP:
break;
/* an element cannot be empty */
- case OID_MULTIRANGE_ELEM_CONTAINED_OP:
case OID_MULTIRANGE_CONTAINS_ELEM_OP:
+
+ /* filtered out by multirangesel() */
+ case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_ELEM_CONTAINED_OP:
+ case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+
default:
elog(ERROR, "unexpected operator %u", operator);
selec = 0.0; /* keep compiler quiet */
* calculations, realizing that the histogram covers only the
* non-null, non-empty values.
*/
- if (operator == OID_MULTIRANGE_ELEM_CONTAINED_OP ||
- operator == OID_MULTIRANGE_RANGE_CONTAINED_OP ||
+ if (operator == OID_RANGE_MULTIRANGE_CONTAINED_OP ||
operator == OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP)
{
/* empty is contained by anything non-empty */
hist_lower, nhist, true);
break;
- case OID_RANGE_LEFT_MULTIRANGE_OP:
case OID_MULTIRANGE_LEFT_RANGE_OP:
case OID_MULTIRANGE_LEFT_MULTIRANGE_OP:
/* var << const when upper(var) < lower(const) */
hist_upper, nhist, false);
break;
- case OID_RANGE_RIGHT_MULTIRANGE_OP:
case OID_MULTIRANGE_RIGHT_RANGE_OP:
case OID_MULTIRANGE_RIGHT_MULTIRANGE_OP:
/* var >> const when lower(var) > upper(const) */
hist_lower, nhist, true);
break;
- case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RIGHT_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
/* compare lower bounds */
hist_lower, nhist, false);
break;
- case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_LEFT_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
/* compare upper bounds */
hist_upper, nhist, true);
break;
- case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
case OID_MULTIRANGE_OVERLAPS_RANGE_OP:
case OID_MULTIRANGE_OVERLAPS_MULTIRANGE_OP:
case OID_MULTIRANGE_CONTAINS_ELEM_OP:
lslot.values, lslot.nvalues);
break;
- case OID_MULTIRANGE_RANGE_CONTAINED_OP:
case OID_MULTIRANGE_MULTIRANGE_CONTAINED_OP:
case OID_RANGE_MULTIRANGE_CONTAINED_OP:
if (const_lower.infinite)
}
break;
+ /* filtered out by multirangesel() */
+ case OID_RANGE_OVERLAPS_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_OVERLAPS_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_LEFT_MULTIRANGE_OP:
+ case OID_RANGE_RIGHT_MULTIRANGE_OP:
+ case OID_RANGE_CONTAINS_MULTIRANGE_OP:
+ case OID_MULTIRANGE_ELEM_CONTAINED_OP:
+ case OID_MULTIRANGE_RANGE_CONTAINED_OP:
+
default:
elog(ERROR, "unknown multirange operator %u", operator);
hist_selec = -1.0; /* keep compiler quiet */
SET enable_seqscan = t;
SET enable_indexscan = f;
SET enable_bitmapscan = f;
+select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
+ count
+-------
+ 500
+(1 row)
+
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
count
-------
3700
(1 row)
+select count(*) from test_multirange_gist where mr && 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
+ count
+-------
+ 500
+(1 row)
+
+select count(*) from test_multirange_gist where mr << 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+ count
+-------
+ 3700
+(1 row)
+
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+ count
+-------
+ 3700
+(1 row)
+
+select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
+ count
+-------
+ 500
+(1 row)
+
+select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
count
-------
SET enable_seqscan = f;
SET enable_indexscan = t;
SET enable_bitmapscan = f;
+select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
+ count
+-------
+ 500
+(1 row)
+
+select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
+ count
+-------
+ 3700
+(1 row)
+
+select count(*) from test_multirange_gist where mr && 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
+ count
+-------
+ 500
+(1 row)
+
+select count(*) from test_multirange_gist where mr << 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+ count
+-------
+ 3700
+(1 row)
+
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+ count
+-------
+ 3700
+(1 row)
+
+select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
+ count
+-------
+ 500
+(1 row)
+
+select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
+select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
+ count
+-------
+ 0
+(1 row)
+
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
count
-------
SET enable_indexscan = f;
SET enable_bitmapscan = f;
+select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr && 'empty'::int4range;
+select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
+select count(*) from test_multirange_gist where mr << 'empty'::int4range;
+select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
+select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
+
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
select count(*) from test_multirange_gist where mr @> 10;
select count(*) from test_multirange_gist where mr @> int4range(10,20);
SET enable_indexscan = t;
SET enable_bitmapscan = f;
+select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr && 'empty'::int4range;
+select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
+select count(*) from test_multirange_gist where mr << 'empty'::int4range;
+select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
+select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
+select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
+select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
+
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
select count(*) from test_multirange_gist where mr @> 10;