Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / multirangetypes.out
blobf5f089741c1720870245507de12382cc03a66d6a
1 -- Tests for multirange data types.
2 --
3 -- test input parser
4 --
5 -- negative tests; should fail
6 select ''::textmultirange;
7 ERROR:  malformed multirange literal: ""
8 LINE 1: select ''::textmultirange;
9                ^
10 DETAIL:  Missing left brace.
11 select '{,}'::textmultirange;
12 ERROR:  malformed multirange literal: "{,}"
13 LINE 1: select '{,}'::textmultirange;
14                ^
15 DETAIL:  Expected range start.
16 select '{(,)}.'::textmultirange;
17 ERROR:  malformed multirange literal: "{(,)}."
18 LINE 1: select '{(,)}.'::textmultirange;
19                ^
20 DETAIL:  Junk after closing right brace.
21 select '{[a,c),}'::textmultirange;
22 ERROR:  malformed multirange literal: "{[a,c),}"
23 LINE 1: select '{[a,c),}'::textmultirange;
24                ^
25 DETAIL:  Expected range start.
26 select '{,[a,c)}'::textmultirange;
27 ERROR:  malformed multirange literal: "{,[a,c)}"
28 LINE 1: select '{,[a,c)}'::textmultirange;
29                ^
30 DETAIL:  Expected range start.
31 select '{-[a,z)}'::textmultirange;
32 ERROR:  malformed multirange literal: "{-[a,z)}"
33 LINE 1: select '{-[a,z)}'::textmultirange;
34                ^
35 DETAIL:  Expected range start.
36 select '{[a,z) - }'::textmultirange;
37 ERROR:  malformed multirange literal: "{[a,z) - }"
38 LINE 1: select '{[a,z) - }'::textmultirange;
39                ^
40 DETAIL:  Expected comma or end of multirange.
41 select '{(",a)}'::textmultirange;
42 ERROR:  malformed multirange literal: "{(",a)}"
43 LINE 1: select '{(",a)}'::textmultirange;
44                ^
45 DETAIL:  Unexpected end of input.
46 select '{(,,a)}'::textmultirange;
47 ERROR:  malformed range literal: "(,,a)"
48 LINE 1: select '{(,,a)}'::textmultirange;
49                ^
50 DETAIL:  Too many commas.
51 select '{(),a)}'::textmultirange;
52 ERROR:  malformed range literal: "()"
53 LINE 1: select '{(),a)}'::textmultirange;
54                ^
55 DETAIL:  Missing comma after lower bound.
56 select '{(a,))}'::textmultirange;
57 ERROR:  malformed multirange literal: "{(a,))}"
58 LINE 1: select '{(a,))}'::textmultirange;
59                ^
60 DETAIL:  Expected comma or end of multirange.
61 select '{(],a)}'::textmultirange;
62 ERROR:  malformed range literal: "(]"
63 LINE 1: select '{(],a)}'::textmultirange;
64                ^
65 DETAIL:  Missing comma after lower bound.
66 select '{(a,])}'::textmultirange;
67 ERROR:  malformed multirange literal: "{(a,])}"
68 LINE 1: select '{(a,])}'::textmultirange;
69                ^
70 DETAIL:  Expected comma or end of multirange.
71 select '{[z,a]}'::textmultirange;
72 ERROR:  range lower bound must be less than or equal to range upper bound
73 LINE 1: select '{[z,a]}'::textmultirange;
74                ^
75 -- should succeed
76 select '{}'::textmultirange;
77  textmultirange 
78 ----------------
79  {}
80 (1 row)
82 select '  {}  '::textmultirange;
83  textmultirange 
84 ----------------
85  {}
86 (1 row)
88 select ' { empty, empty }  '::textmultirange;
89  textmultirange 
90 ----------------
91  {}
92 (1 row)
94 select ' {( " a " " a ", " z " " z " )  }'::textmultirange;
95        textmultirange       
96 ----------------------------
97  {("  a   a ","  z   z  ")}
98 (1 row)
100 select '{(,z)}'::textmultirange;
101  textmultirange 
102 ----------------
103  {(,z)}
104 (1 row)
106 select '{(a,)}'::textmultirange;
107  textmultirange 
108 ----------------
109  {(a,)}
110 (1 row)
112 select '{[,z]}'::textmultirange;
113  textmultirange 
114 ----------------
115  {(,z]}
116 (1 row)
118 select '{[a,]}'::textmultirange;
119  textmultirange 
120 ----------------
121  {[a,)}
122 (1 row)
124 select '{(,)}'::textmultirange;
125  textmultirange 
126 ----------------
127  {(,)}
128 (1 row)
130 select '{[ , ]}'::textmultirange;
131  textmultirange 
132 ----------------
133  {[" "," "]}
134 (1 row)
136 select '{["",""]}'::textmultirange;
137  textmultirange 
138 ----------------
139  {["",""]}
140 (1 row)
142 select '{[",",","]}'::textmultirange;
143  textmultirange 
144 ----------------
145  {[",",","]}
146 (1 row)
148 select '{["\\","\\"]}'::textmultirange;
149  textmultirange 
150 ----------------
151  {["\\","\\"]}
152 (1 row)
154 select '{["""","\""]}'::textmultirange;
155  textmultirange 
156 ----------------
157  {["""",""""]}
158 (1 row)
160 select '{(\\,a)}'::textmultirange;
161  textmultirange 
162 ----------------
163  {("\\",a)}
164 (1 row)
166 select '{((,z)}'::textmultirange;
167  textmultirange 
168 ----------------
169  {("(",z)}
170 (1 row)
172 select '{([,z)}'::textmultirange;
173  textmultirange 
174 ----------------
175  {("[",z)}
176 (1 row)
178 select '{(!,()}'::textmultirange;
179  textmultirange 
180 ----------------
181  {(!,"(")}
182 (1 row)
184 select '{(!,[)}'::textmultirange;
185  textmultirange 
186 ----------------
187  {(!,"[")}
188 (1 row)
190 select '{[a,a]}'::textmultirange;
191  textmultirange 
192 ----------------
193  {[a,a]}
194 (1 row)
196 select '{[a,a],[a,b]}'::textmultirange;
197  textmultirange 
198 ----------------
199  {[a,b]}
200 (1 row)
202 select '{[a,b), [b,e]}'::textmultirange;
203  textmultirange 
204 ----------------
205  {[a,e]}
206 (1 row)
208 select '{[a,d), [b,f]}'::textmultirange;
209  textmultirange 
210 ----------------
211  {[a,f]}
212 (1 row)
214 select '{[a,a],[b,b]}'::textmultirange;
215  textmultirange 
216 ----------------
217  {[a,a],[b,b]}
218 (1 row)
220 -- without canonicalization, we can't join these:
221 select '{[a,a], [b,b]}'::textmultirange;
222  textmultirange 
223 ----------------
224  {[a,a],[b,b]}
225 (1 row)
227 -- with canonicalization, we can join these:
228 select '{[1,2], [3,4]}'::int4multirange;
229  int4multirange 
230 ----------------
231  {[1,5)}
232 (1 row)
234 select '{[a,a], [b,b], [c,c]}'::textmultirange;
235    textmultirange    
236 ---------------------
237  {[a,a],[b,b],[c,c]}
238 (1 row)
240 select '{[a,d], [b,e]}'::textmultirange;
241  textmultirange 
242 ----------------
243  {[a,e]}
244 (1 row)
246 select '{[a,d), [d,e)}'::textmultirange;
247  textmultirange 
248 ----------------
249  {[a,e)}
250 (1 row)
252 -- these are allowed but normalize to empty:
253 select '{[a,a)}'::textmultirange;
254  textmultirange 
255 ----------------
256  {}
257 (1 row)
259 select '{(a,a]}'::textmultirange;
260  textmultirange 
261 ----------------
262  {}
263 (1 row)
265 select '{(a,a)}'::textmultirange;
266  textmultirange 
267 ----------------
268  {}
269 (1 row)
272 -- test the constructor
274 select textmultirange();
275  textmultirange 
276 ----------------
277  {}
278 (1 row)
280 select textmultirange(textrange('a', 'c'));
281  textmultirange 
282 ----------------
283  {[a,c)}
284 (1 row)
286 select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
287  textmultirange 
288 ----------------
289  {[a,c),[f,g)}
290 (1 row)
292 select textmultirange(textrange('a', 'c'), textrange('b', 'd'));
293  textmultirange 
294 ----------------
295  {[a,d)}
296 (1 row)
299 -- test casts, both a built-in range type and a user-defined one:
301 select 'empty'::int4range::int4multirange;
302  int4multirange 
303 ----------------
304  {}
305 (1 row)
307 select int4range(1, 3)::int4multirange;
308  int4range 
309 -----------
310  {[1,3)}
311 (1 row)
313 select int4range(1, null)::int4multirange;
314  int4range 
315 -----------
316  {[1,)}
317 (1 row)
319 select int4range(null, null)::int4multirange;
320  int4range 
321 -----------
322  {(,)}
323 (1 row)
325 select 'empty'::textrange::textmultirange;
326  textmultirange 
327 ----------------
328  {}
329 (1 row)
331 select textrange('a', 'c')::textmultirange;
332  textrange 
333 -----------
334  {[a,c)}
335 (1 row)
337 select textrange('a', null)::textmultirange;
338  textrange 
339 -----------
340  {[a,)}
341 (1 row)
343 select textrange(null, null)::textmultirange;
344  textrange 
345 -----------
346  {(,)}
347 (1 row)
350 -- test unnest(multirange) function
352 select unnest(int4multirange(int4range('5', '6'), int4range('1', '2')));
353  unnest 
354 --------
355  [1,2)
356  [5,6)
357 (2 rows)
359 select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
360  unnest 
361 --------
362  [a,b)
363  [d,e)
364 (2 rows)
367 -- create some test data and test the operators
369 CREATE TABLE nummultirange_test (nmr NUMMULTIRANGE);
370 CREATE INDEX nummultirange_test_btree ON nummultirange_test(nmr);
371 INSERT INTO nummultirange_test VALUES('{}');
372 INSERT INTO nummultirange_test VALUES('{[,)}');
373 INSERT INTO nummultirange_test VALUES('{[3,]}');
374 INSERT INTO nummultirange_test VALUES('{[,), [3,]}');
375 INSERT INTO nummultirange_test VALUES('{[, 5)}');
376 INSERT INTO nummultirange_test VALUES(nummultirange());
377 INSERT INTO nummultirange_test VALUES(nummultirange(variadic '{}'::numrange[]));
378 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.1, 2.2)));
379 INSERT INTO nummultirange_test VALUES('{empty}');
380 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.7, 1.9)));
381 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.9, 2.1)));
382 SELECT nmr, isempty(nmr), lower(nmr), upper(nmr) FROM nummultirange_test ORDER BY nmr;
383           nmr          | isempty | lower | upper 
384 -----------------------+---------+-------+-------
385  {}                    | t       |       |      
386  {}                    | t       |       |      
387  {}                    | t       |       |      
388  {}                    | t       |       |      
389  {(,5)}                | f       |       |     5
390  {(,)}                 | f       |       |      
391  {(,)}                 | f       |       |      
392  {[1.1,2.2)}           | f       |   1.1 |   2.2
393  {[1.7,1.7],[1.9,2.1)} | f       |   1.7 |   2.1
394  {[1.7,1.9)}           | f       |   1.7 |   1.9
395  {[3,)}                | f       |     3 |      
396 (11 rows)
398 SELECT nmr, lower_inc(nmr), lower_inf(nmr), upper_inc(nmr), upper_inf(nmr) FROM nummultirange_test ORDER BY nmr;
399           nmr          | lower_inc | lower_inf | upper_inc | upper_inf 
400 -----------------------+-----------+-----------+-----------+-----------
401  {}                    | f         | f         | f         | f
402  {}                    | f         | f         | f         | f
403  {}                    | f         | f         | f         | f
404  {}                    | f         | f         | f         | f
405  {(,5)}                | f         | t         | f         | f
406  {(,)}                 | f         | t         | f         | t
407  {(,)}                 | f         | t         | f         | t
408  {[1.1,2.2)}           | t         | f         | f         | f
409  {[1.7,1.7],[1.9,2.1)} | t         | f         | f         | f
410  {[1.7,1.9)}           | t         | f         | f         | f
411  {[3,)}                | t         | f         | f         | t
412 (11 rows)
414 SELECT * FROM nummultirange_test WHERE nmr = '{}';
415  nmr 
416 -----
417  {}
418  {}
419  {}
420  {}
421 (4 rows)
423 SELECT * FROM nummultirange_test WHERE nmr = '{(,5)}';
424   nmr   
425 --------
426  {(,5)}
427 (1 row)
429 SELECT * FROM nummultirange_test WHERE nmr = '{[3,)}';
430   nmr   
431 --------
432  {[3,)}
433 (1 row)
435 SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7]}';
436  nmr 
437 -----
438 (0 rows)
440 SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7],[1.9,2.1)}';
441           nmr          
442 -----------------------
443  {[1.7,1.7],[1.9,2.1)}
444 (1 row)
446 SELECT * FROM nummultirange_test WHERE nmr < '{}';
447  nmr 
448 -----
449 (0 rows)
451 SELECT * FROM nummultirange_test WHERE nmr < '{[-1000.0, -1000.0]}';
452   nmr   
453 --------
454  {}
455  {(,)}
456  {(,)}
457  {(,5)}
458  {}
459  {}
460  {}
461 (7 rows)
463 SELECT * FROM nummultirange_test WHERE nmr < '{[0.0, 1.0]}';
464   nmr   
465 --------
466  {}
467  {(,)}
468  {(,)}
469  {(,5)}
470  {}
471  {}
472  {}
473 (7 rows)
475 SELECT * FROM nummultirange_test WHERE nmr < '{[1000.0, 1001.0]}';
476           nmr          
477 -----------------------
478  {}
479  {(,)}
480  {[3,)}
481  {(,)}
482  {(,5)}
483  {}
484  {}
485  {[1.1,2.2)}
486  {}
487  {[1.7,1.9)}
488  {[1.7,1.7],[1.9,2.1)}
489 (11 rows)
491 SELECT * FROM nummultirange_test WHERE nmr <= '{}';
492  nmr 
493 -----
494  {}
495  {}
496  {}
497  {}
498 (4 rows)
500 SELECT * FROM nummultirange_test WHERE nmr <= '{[3,)}';
501           nmr          
502 -----------------------
503  {}
504  {(,)}
505  {[3,)}
506  {(,)}
507  {(,5)}
508  {}
509  {}
510  {[1.1,2.2)}
511  {}
512  {[1.7,1.9)}
513  {[1.7,1.7],[1.9,2.1)}
514 (11 rows)
516 SELECT * FROM nummultirange_test WHERE nmr >= '{}';
517           nmr          
518 -----------------------
519  {}
520  {(,)}
521  {[3,)}
522  {(,)}
523  {(,5)}
524  {}
525  {}
526  {[1.1,2.2)}
527  {}
528  {[1.7,1.9)}
529  {[1.7,1.7],[1.9,2.1)}
530 (11 rows)
532 SELECT * FROM nummultirange_test WHERE nmr >= '{[3,)}';
533   nmr   
534 --------
535  {[3,)}
536 (1 row)
538 SELECT * FROM nummultirange_test WHERE nmr > '{}';
539           nmr          
540 -----------------------
541  {(,)}
542  {[3,)}
543  {(,)}
544  {(,5)}
545  {[1.1,2.2)}
546  {[1.7,1.9)}
547  {[1.7,1.7],[1.9,2.1)}
548 (7 rows)
550 SELECT * FROM nummultirange_test WHERE nmr > '{[-1000.0, -1000.0]}';
551           nmr          
552 -----------------------
553  {[3,)}
554  {[1.1,2.2)}
555  {[1.7,1.9)}
556  {[1.7,1.7],[1.9,2.1)}
557 (4 rows)
559 SELECT * FROM nummultirange_test WHERE nmr > '{[0.0, 1.0]}';
560           nmr          
561 -----------------------
562  {[3,)}
563  {[1.1,2.2)}
564  {[1.7,1.9)}
565  {[1.7,1.7],[1.9,2.1)}
566 (4 rows)
568 SELECT * FROM nummultirange_test WHERE nmr > '{[1000.0, 1001.0]}';
569  nmr 
570 -----
571 (0 rows)
573 SELECT * FROM nummultirange_test WHERE nmr <> '{}';
574           nmr          
575 -----------------------
576  {(,)}
577  {[3,)}
578  {(,)}
579  {(,5)}
580  {[1.1,2.2)}
581  {[1.7,1.9)}
582  {[1.7,1.7],[1.9,2.1)}
583 (7 rows)
585 SELECT * FROM nummultirange_test WHERE nmr <> '{(,5)}';
586           nmr          
587 -----------------------
588  {}
589  {(,)}
590  {[3,)}
591  {(,)}
592  {}
593  {}
594  {[1.1,2.2)}
595  {}
596  {[1.7,1.9)}
597  {[1.7,1.7],[1.9,2.1)}
598 (10 rows)
600 select nummultirange(numrange(2.0, 1.0));
601 ERROR:  range lower bound must be less than or equal to range upper bound
602 select nummultirange(numrange(5.0, 6.0), numrange(1.0, 2.0));
603      nummultirange     
604 -----------------------
605  {[1.0,2.0),[5.0,6.0)}
606 (1 row)
608 analyze nummultirange_test;
609 -- overlaps
610 SELECT * FROM nummultirange_test WHERE range_overlaps_multirange(numrange(4.0, 4.2), nmr);
611   nmr   
612 --------
613  {(,)}
614  {[3,)}
615  {(,)}
616  {(,5)}
617 (4 rows)
619 SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) && nmr;
620   nmr   
621 --------
622  {(,)}
623  {[3,)}
624  {(,)}
625  {(,5)}
626 (4 rows)
628 SELECT * FROM nummultirange_test WHERE multirange_overlaps_range(nmr, numrange(4.0, 4.2));
629   nmr   
630 --------
631  {(,)}
632  {[3,)}
633  {(,)}
634  {(,5)}
635 (4 rows)
637 SELECT * FROM nummultirange_test WHERE nmr && numrange(4.0, 4.2);
638   nmr   
639 --------
640  {(,)}
641  {[3,)}
642  {(,)}
643  {(,5)}
644 (4 rows)
646 SELECT * FROM nummultirange_test WHERE multirange_overlaps_multirange(nmr, nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0)));
647   nmr   
648 --------
649  {(,)}
650  {[3,)}
651  {(,)}
652  {(,5)}
653 (4 rows)
655 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0));
656   nmr   
657 --------
658  {(,)}
659  {[3,)}
660  {(,)}
661  {(,5)}
662 (4 rows)
664 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0));
665   nmr   
666 --------
667  {(,)}
668  {[3,)}
669  {(,)}
670 (3 rows)
672 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0), numrange(8.0, 9.0));
673   nmr   
674 --------
675  {(,)}
676  {[3,)}
677  {(,)}
678 (3 rows)
680 -- mr contains x
681 SELECT * FROM nummultirange_test WHERE multirange_contains_elem(nmr, 4.0);
682   nmr   
683 --------
684  {(,)}
685  {[3,)}
686  {(,)}
687  {(,5)}
688 (4 rows)
690 SELECT * FROM nummultirange_test WHERE nmr @> 4.0;
691   nmr   
692 --------
693  {(,)}
694  {[3,)}
695  {(,)}
696  {(,5)}
697 (4 rows)
699 SELECT * FROM nummultirange_test WHERE multirange_contains_range(nmr, numrange(4.0, 4.2));
700   nmr   
701 --------
702  {(,)}
703  {[3,)}
704  {(,)}
705  {(,5)}
706 (4 rows)
708 SELECT * FROM nummultirange_test WHERE nmr @> numrange(4.0, 4.2);
709   nmr   
710 --------
711  {(,)}
712  {[3,)}
713  {(,)}
714  {(,5)}
715 (4 rows)
717 SELECT * FROM nummultirange_test WHERE multirange_contains_multirange(nmr, '{[4.0,4.2), [6.0, 8.0)}');
718   nmr   
719 --------
720  {(,)}
721  {[3,)}
722  {(,)}
723 (3 rows)
725 SELECT * FROM nummultirange_test WHERE nmr @> '{[4.0,4.2), [6.0, 8.0)}'::nummultirange;
726   nmr   
727 --------
728  {(,)}
729  {[3,)}
730  {(,)}
731 (3 rows)
733 -- x is contained by mr
734 SELECT * FROM nummultirange_test WHERE elem_contained_by_multirange(4.0, nmr);
735   nmr   
736 --------
737  {(,)}
738  {[3,)}
739  {(,)}
740  {(,5)}
741 (4 rows)
743 SELECT * FROM nummultirange_test WHERE 4.0 <@ nmr;
744   nmr   
745 --------
746  {(,)}
747  {[3,)}
748  {(,)}
749  {(,5)}
750 (4 rows)
752 SELECT * FROM nummultirange_test WHERE range_contained_by_multirange(numrange(4.0, 4.2), nmr);
753   nmr   
754 --------
755  {(,)}
756  {[3,)}
757  {(,)}
758  {(,5)}
759 (4 rows)
761 SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) <@ nmr;
762   nmr   
763 --------
764  {(,)}
765  {[3,)}
766  {(,)}
767  {(,5)}
768 (4 rows)
770 SELECT * FROM nummultirange_test WHERE multirange_contained_by_multirange('{[4.0,4.2), [6.0, 8.0)}', nmr);
771   nmr   
772 --------
773  {(,)}
774  {[3,)}
775  {(,)}
776 (3 rows)
778 SELECT * FROM nummultirange_test WHERE '{[4.0,4.2), [6.0, 8.0)}'::nummultirange <@ nmr;
779   nmr   
780 --------
781  {(,)}
782  {[3,)}
783  {(,)}
784 (3 rows)
786 -- overlaps
787 SELECT 'empty'::numrange && nummultirange();
788  ?column? 
789 ----------
791 (1 row)
793 SELECT 'empty'::numrange && nummultirange(numrange(1,2));
794  ?column? 
795 ----------
797 (1 row)
799 SELECT nummultirange() && 'empty'::numrange;
800  ?column? 
801 ----------
803 (1 row)
805 SELECT nummultirange(numrange(1,2)) && 'empty'::numrange;
806  ?column? 
807 ----------
809 (1 row)
811 SELECT nummultirange() && nummultirange();
812  ?column? 
813 ----------
815 (1 row)
817 SELECT nummultirange() && nummultirange(numrange(1,2));
818  ?column? 
819 ----------
821 (1 row)
823 SELECT nummultirange(numrange(1,2)) && nummultirange();
824  ?column? 
825 ----------
827 (1 row)
829 SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(7,8));
830  ?column? 
831 ----------
833 (1 row)
835 SELECT nummultirange(numrange(1,2), numrange(7,8)) && nummultirange(numrange(3,4));
836  ?column? 
837 ----------
839 (1 row)
841 SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(3.5,8));
842  ?column? 
843 ----------
845 (1 row)
847 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && numrange(3,4);
848  ?column? 
849 ----------
851 (1 row)
853 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3,4));
854  ?column? 
855 ----------
857 (1 row)
859 select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange;
860  ?column? 
861 ----------
863 (1 row)
865 -- contains
866 SELECT nummultirange() @> nummultirange();
867  ?column? 
868 ----------
870 (1 row)
872 SELECT nummultirange() @> 'empty'::numrange;
873  ?column? 
874 ----------
876 (1 row)
878 SELECT nummultirange(numrange(null,null)) @> numrange(1,2);
879  ?column? 
880 ----------
882 (1 row)
884 SELECT nummultirange(numrange(null,null)) @> numrange(null,2);
885  ?column? 
886 ----------
888 (1 row)
890 SELECT nummultirange(numrange(null,null)) @> numrange(2,null);
891  ?column? 
892 ----------
894 (1 row)
896 SELECT nummultirange(numrange(null,5)) @> numrange(null,3);
897  ?column? 
898 ----------
900 (1 row)
902 SELECT nummultirange(numrange(null,5)) @> numrange(null,8);
903  ?column? 
904 ----------
906 (1 row)
908 SELECT nummultirange(numrange(5,null)) @> numrange(8,null);
909  ?column? 
910 ----------
912 (1 row)
914 SELECT nummultirange(numrange(5,null)) @> numrange(3,null);
915  ?column? 
916 ----------
918 (1 row)
920 SELECT nummultirange(numrange(1,5)) @> numrange(8,9);
921  ?column? 
922 ----------
924 (1 row)
926 SELECT nummultirange(numrange(1,5)) @> numrange(3,9);
927  ?column? 
928 ----------
930 (1 row)
932 SELECT nummultirange(numrange(1,5)) @> numrange(1,4);
933  ?column? 
934 ----------
936 (1 row)
938 SELECT nummultirange(numrange(1,5)) @> numrange(1,5);
939  ?column? 
940 ----------
942 (1 row)
944 SELECT nummultirange(numrange(-4,-2), numrange(1,5)) @> numrange(1,5);
945  ?column? 
946 ----------
948 (1 row)
950 SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(1,5);
951  ?column? 
952 ----------
954 (1 row)
956 SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(6,7);
957  ?column? 
958 ----------
960 (1 row)
962 SELECT nummultirange(numrange(1,5), numrange(6,9)) @> numrange(6,7);
963  ?column? 
964 ----------
966 (1 row)
968 SELECT '{[1,5)}'::nummultirange @> '{[1,5)}';
969  ?column? 
970 ----------
972 (1 row)
974 SELECT '{[-4,-2), [1,5)}'::nummultirange @> '{[1,5)}';
975  ?column? 
976 ----------
978 (1 row)
980 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[1,5)}';
981  ?column? 
982 ----------
984 (1 row)
986 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[6,7)}';
987  ?column? 
988 ----------
990 (1 row)
992 SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}';
993  ?column? 
994 ----------
996 (1 row)
998 select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange;
999  ?column? 
1000 ----------
1002 (1 row)
1004 SELECT numrange(null,null) @> nummultirange(numrange(1,2));
1005  ?column? 
1006 ----------
1008 (1 row)
1010 SELECT numrange(null,null) @> nummultirange(numrange(null,2));
1011  ?column? 
1012 ----------
1014 (1 row)
1016 SELECT numrange(null,null) @> nummultirange(numrange(2,null));
1017  ?column? 
1018 ----------
1020 (1 row)
1022 SELECT numrange(null,5) @> nummultirange(numrange(null,3));
1023  ?column? 
1024 ----------
1026 (1 row)
1028 SELECT numrange(null,5) @> nummultirange(numrange(null,8));
1029  ?column? 
1030 ----------
1032 (1 row)
1034 SELECT numrange(5,null) @> nummultirange(numrange(8,null));
1035  ?column? 
1036 ----------
1038 (1 row)
1040 SELECT numrange(5,null) @> nummultirange(numrange(3,null));
1041  ?column? 
1042 ----------
1044 (1 row)
1046 SELECT numrange(1,5) @> nummultirange(numrange(8,9));
1047  ?column? 
1048 ----------
1050 (1 row)
1052 SELECT numrange(1,5) @> nummultirange(numrange(3,9));
1053  ?column? 
1054 ----------
1056 (1 row)
1058 SELECT numrange(1,5) @> nummultirange(numrange(1,4));
1059  ?column? 
1060 ----------
1062 (1 row)
1064 SELECT numrange(1,5) @> nummultirange(numrange(1,5));
1065  ?column? 
1066 ----------
1068 (1 row)
1070 SELECT numrange(1,9) @> nummultirange(numrange(-4,-2), numrange(1,5));
1071  ?column? 
1072 ----------
1074 (1 row)
1076 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(8,9));
1077  ?column? 
1078 ----------
1080 (1 row)
1082 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,9));
1083  ?column? 
1084 ----------
1086 (1 row)
1088 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,10));
1089  ?column? 
1090 ----------
1092 (1 row)
1094 SELECT '{[1,9)}' @> '{[1,5)}'::nummultirange;
1095  ?column? 
1096 ----------
1098 (1 row)
1100 SELECT '{[1,9)}' @> '{[-4,-2), [1,5)}'::nummultirange;
1101  ?column? 
1102 ----------
1104 (1 row)
1106 SELECT '{[1,9)}' @> '{[1,5), [8,9)}'::nummultirange;
1107  ?column? 
1108 ----------
1110 (1 row)
1112 SELECT '{[1,9)}' @> '{[1,5), [6,9)}'::nummultirange;
1113  ?column? 
1114 ----------
1116 (1 row)
1118 SELECT '{[1,9)}' @> '{[1,5), [6,10)}'::nummultirange;
1119  ?column? 
1120 ----------
1122 (1 row)
1124 -- is contained by
1125 SELECT nummultirange() <@ nummultirange();
1126  ?column? 
1127 ----------
1129 (1 row)
1131 SELECT 'empty'::numrange <@ nummultirange();
1132  ?column? 
1133 ----------
1135 (1 row)
1137 SELECT numrange(1,2) <@ nummultirange(numrange(null,null));
1138  ?column? 
1139 ----------
1141 (1 row)
1143 SELECT numrange(null,2) <@ nummultirange(numrange(null,null));
1144  ?column? 
1145 ----------
1147 (1 row)
1149 SELECT numrange(2,null) <@ nummultirange(numrange(null,null));
1150  ?column? 
1151 ----------
1153 (1 row)
1155 SELECT numrange(null,3) <@ nummultirange(numrange(null,5));
1156  ?column? 
1157 ----------
1159 (1 row)
1161 SELECT numrange(null,8) <@ nummultirange(numrange(null,5));
1162  ?column? 
1163 ----------
1165 (1 row)
1167 SELECT numrange(8,null) <@ nummultirange(numrange(5,null));
1168  ?column? 
1169 ----------
1171 (1 row)
1173 SELECT numrange(3,null) <@ nummultirange(numrange(5,null));
1174  ?column? 
1175 ----------
1177 (1 row)
1179 SELECT numrange(8,9) <@ nummultirange(numrange(1,5));
1180  ?column? 
1181 ----------
1183 (1 row)
1185 SELECT numrange(3,9) <@ nummultirange(numrange(1,5));
1186  ?column? 
1187 ----------
1189 (1 row)
1191 SELECT numrange(1,4) <@ nummultirange(numrange(1,5));
1192  ?column? 
1193 ----------
1195 (1 row)
1197 SELECT numrange(1,5) <@ nummultirange(numrange(1,5));
1198  ?column? 
1199 ----------
1201 (1 row)
1203 SELECT numrange(1,5) <@ nummultirange(numrange(-4,-2), numrange(1,5));
1204  ?column? 
1205 ----------
1207 (1 row)
1209 SELECT numrange(1,5) <@ nummultirange(numrange(1,5), numrange(8,9));
1210  ?column? 
1211 ----------
1213 (1 row)
1215 SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(8,9));
1216  ?column? 
1217 ----------
1219 (1 row)
1221 SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(6,9));
1222  ?column? 
1223 ----------
1225 (1 row)
1227 SELECT '{[1,5)}' <@ '{[1,5)}'::nummultirange;
1228  ?column? 
1229 ----------
1231 (1 row)
1233 SELECT '{[1,5)}' <@ '{[-4,-2), [1,5)}'::nummultirange;
1234  ?column? 
1235 ----------
1237 (1 row)
1239 SELECT '{[1,5)}' <@ '{[1,5), [8,9)}'::nummultirange;
1240  ?column? 
1241 ----------
1243 (1 row)
1245 SELECT '{[6,7)}' <@ '{[1,5), [8,9)}'::nummultirange;
1246  ?column? 
1247 ----------
1249 (1 row)
1251 SELECT '{[6,7)}' <@ '{[1,5), [6,9)}'::nummultirange;
1252  ?column? 
1253 ----------
1255 (1 row)
1257 SELECT nummultirange(numrange(1,2)) <@ numrange(null,null);
1258  ?column? 
1259 ----------
1261 (1 row)
1263 SELECT nummultirange(numrange(null,2)) <@ numrange(null,null);
1264  ?column? 
1265 ----------
1267 (1 row)
1269 SELECT nummultirange(numrange(2,null)) <@ numrange(null,null);
1270  ?column? 
1271 ----------
1273 (1 row)
1275 SELECT nummultirange(numrange(null,3)) <@ numrange(null,5);
1276  ?column? 
1277 ----------
1279 (1 row)
1281 SELECT nummultirange(numrange(null,8)) <@ numrange(null,5);
1282  ?column? 
1283 ----------
1285 (1 row)
1287 SELECT nummultirange(numrange(8,null)) <@ numrange(5,null);
1288  ?column? 
1289 ----------
1291 (1 row)
1293 SELECT nummultirange(numrange(3,null)) <@ numrange(5,null);
1294  ?column? 
1295 ----------
1297 (1 row)
1299 SELECT nummultirange(numrange(8,9)) <@ numrange(1,5);
1300  ?column? 
1301 ----------
1303 (1 row)
1305 SELECT nummultirange(numrange(3,9)) <@ numrange(1,5);
1306  ?column? 
1307 ----------
1309 (1 row)
1311 SELECT nummultirange(numrange(1,4)) <@ numrange(1,5);
1312  ?column? 
1313 ----------
1315 (1 row)
1317 SELECT nummultirange(numrange(1,5)) <@ numrange(1,5);
1318  ?column? 
1319 ----------
1321 (1 row)
1323 SELECT nummultirange(numrange(-4,-2), numrange(1,5)) <@ numrange(1,9);
1324  ?column? 
1325 ----------
1327 (1 row)
1329 SELECT nummultirange(numrange(1,5), numrange(8,9)) <@ numrange(1,9);
1330  ?column? 
1331 ----------
1333 (1 row)
1335 SELECT nummultirange(numrange(1,5), numrange(6,9)) <@ numrange(1,9);
1336  ?column? 
1337 ----------
1339 (1 row)
1341 SELECT nummultirange(numrange(1,5), numrange(6,10)) <@ numrange(1,9);
1342  ?column? 
1343 ----------
1345 (1 row)
1347 SELECT '{[1,5)}'::nummultirange <@ '{[1,9)}';
1348  ?column? 
1349 ----------
1351 (1 row)
1353 SELECT '{[-4,-2), [1,5)}'::nummultirange <@ '{[1,9)}';
1354  ?column? 
1355 ----------
1357 (1 row)
1359 SELECT '{[1,5), [8,9)}'::nummultirange <@ '{[1,9)}';
1360  ?column? 
1361 ----------
1363 (1 row)
1365 SELECT '{[1,5), [6,9)}'::nummultirange <@ '{[1,9)}';
1366  ?column? 
1367 ----------
1369 (1 row)
1371 SELECT '{[1,5), [6,10)}'::nummultirange <@ '{[1,9)}';
1372  ?column? 
1373 ----------
1375 (1 row)
1377 -- overleft
1378 SELECT 'empty'::numrange &< nummultirange();
1379  ?column? 
1380 ----------
1382 (1 row)
1384 SELECT 'empty'::numrange &< nummultirange(numrange(1,2));
1385  ?column? 
1386 ----------
1388 (1 row)
1390 SELECT nummultirange() &< 'empty'::numrange;
1391  ?column? 
1392 ----------
1394 (1 row)
1396 SELECT nummultirange(numrange(1,2)) &< 'empty'::numrange;
1397  ?column? 
1398 ----------
1400 (1 row)
1402 SELECT nummultirange() &< nummultirange();
1403  ?column? 
1404 ----------
1406 (1 row)
1408 SELECT nummultirange(numrange(1,2)) &< nummultirange();
1409  ?column? 
1410 ----------
1412 (1 row)
1414 SELECT nummultirange() &< nummultirange(numrange(1,2));
1415  ?column? 
1416 ----------
1418 (1 row)
1420 SELECT numrange(6,7) &< nummultirange(numrange(3,4));
1421  ?column? 
1422 ----------
1424 (1 row)
1426 SELECT numrange(1,2) &< nummultirange(numrange(3,4));
1427  ?column? 
1428 ----------
1430 (1 row)
1432 SELECT numrange(1,4) &< nummultirange(numrange(3,4));
1433  ?column? 
1434 ----------
1436 (1 row)
1438 SELECT numrange(1,6) &< nummultirange(numrange(3,4));
1439  ?column? 
1440 ----------
1442 (1 row)
1444 SELECT numrange(3.5,6) &< nummultirange(numrange(3,4));
1445  ?column? 
1446 ----------
1448 (1 row)
1450 SELECT nummultirange(numrange(6,7)) &< numrange(3,4);
1451  ?column? 
1452 ----------
1454 (1 row)
1456 SELECT nummultirange(numrange(1,2)) &< numrange(3,4);
1457  ?column? 
1458 ----------
1460 (1 row)
1462 SELECT nummultirange(numrange(1,4)) &< numrange(3,4);
1463  ?column? 
1464 ----------
1466 (1 row)
1468 SELECT nummultirange(numrange(1,6)) &< numrange(3,4);
1469  ?column? 
1470 ----------
1472 (1 row)
1474 SELECT nummultirange(numrange(3.5,6)) &< numrange(3,4);
1475  ?column? 
1476 ----------
1478 (1 row)
1480 SELECT nummultirange(numrange(6,7)) &< nummultirange(numrange(3,4));
1481  ?column? 
1482 ----------
1484 (1 row)
1486 SELECT nummultirange(numrange(1,2)) &< nummultirange(numrange(3,4));
1487  ?column? 
1488 ----------
1490 (1 row)
1492 SELECT nummultirange(numrange(1,4)) &< nummultirange(numrange(3,4));
1493  ?column? 
1494 ----------
1496 (1 row)
1498 SELECT nummultirange(numrange(1,6)) &< nummultirange(numrange(3,4));
1499  ?column? 
1500 ----------
1502 (1 row)
1504 SELECT nummultirange(numrange(3.5,6)) &< nummultirange(numrange(3,4));
1505  ?column? 
1506 ----------
1508 (1 row)
1510 -- overright
1511 SELECT nummultirange() &> 'empty'::numrange;
1512  ?column? 
1513 ----------
1515 (1 row)
1517 SELECT nummultirange(numrange(1,2)) &> 'empty'::numrange;
1518  ?column? 
1519 ----------
1521 (1 row)
1523 SELECT 'empty'::numrange &> nummultirange();
1524  ?column? 
1525 ----------
1527 (1 row)
1529 SELECT 'empty'::numrange &> nummultirange(numrange(1,2));
1530  ?column? 
1531 ----------
1533 (1 row)
1535 SELECT nummultirange() &> nummultirange();
1536  ?column? 
1537 ----------
1539 (1 row)
1541 SELECT nummultirange() &> nummultirange(numrange(1,2));
1542  ?column? 
1543 ----------
1545 (1 row)
1547 SELECT nummultirange(numrange(1,2)) &> nummultirange();
1548  ?column? 
1549 ----------
1551 (1 row)
1553 SELECT nummultirange(numrange(3,4)) &> numrange(6,7);
1554  ?column? 
1555 ----------
1557 (1 row)
1559 SELECT nummultirange(numrange(3,4)) &> numrange(1,2);
1560  ?column? 
1561 ----------
1563 (1 row)
1565 SELECT nummultirange(numrange(3,4)) &> numrange(1,4);
1566  ?column? 
1567 ----------
1569 (1 row)
1571 SELECT nummultirange(numrange(3,4)) &> numrange(1,6);
1572  ?column? 
1573 ----------
1575 (1 row)
1577 SELECT nummultirange(numrange(3,4)) &> numrange(3.5,6);
1578  ?column? 
1579 ----------
1581 (1 row)
1583 SELECT numrange(3,4) &> nummultirange(numrange(6,7));
1584  ?column? 
1585 ----------
1587 (1 row)
1589 SELECT numrange(3,4) &> nummultirange(numrange(1,2));
1590  ?column? 
1591 ----------
1593 (1 row)
1595 SELECT numrange(3,4) &> nummultirange(numrange(1,4));
1596  ?column? 
1597 ----------
1599 (1 row)
1601 SELECT numrange(3,4) &> nummultirange(numrange(1,6));
1602  ?column? 
1603 ----------
1605 (1 row)
1607 SELECT numrange(3,4) &> nummultirange(numrange(3.5,6));
1608  ?column? 
1609 ----------
1611 (1 row)
1613 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(6,7));
1614  ?column? 
1615 ----------
1617 (1 row)
1619 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,2));
1620  ?column? 
1621 ----------
1623 (1 row)
1625 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,4));
1626  ?column? 
1627 ----------
1629 (1 row)
1631 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,6));
1632  ?column? 
1633 ----------
1635 (1 row)
1637 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(3.5,6));
1638  ?column? 
1639 ----------
1641 (1 row)
1643 -- meets
1644 SELECT 'empty'::numrange -|- nummultirange();
1645  ?column? 
1646 ----------
1648 (1 row)
1650 SELECT 'empty'::numrange -|- nummultirange(numrange(1,2));
1651  ?column? 
1652 ----------
1654 (1 row)
1656 SELECT nummultirange() -|- 'empty'::numrange;
1657  ?column? 
1658 ----------
1660 (1 row)
1662 SELECT nummultirange(numrange(1,2)) -|- 'empty'::numrange;
1663  ?column? 
1664 ----------
1666 (1 row)
1668 SELECT nummultirange() -|- nummultirange();
1669  ?column? 
1670 ----------
1672 (1 row)
1674 SELECT nummultirange(numrange(1,2)) -|- nummultirange();
1675  ?column? 
1676 ----------
1678 (1 row)
1680 SELECT nummultirange() -|- nummultirange(numrange(1,2));
1681  ?column? 
1682 ----------
1684 (1 row)
1686 SELECT numrange(1,2) -|- nummultirange(numrange(2,4));
1687  ?column? 
1688 ----------
1690 (1 row)
1692 SELECT numrange(1,2) -|- nummultirange(numrange(3,4));
1693  ?column? 
1694 ----------
1696 (1 row)
1698 SELECT nummultirange(numrange(1,2)) -|- numrange(2,4);
1699  ?column? 
1700 ----------
1702 (1 row)
1704 SELECT nummultirange(numrange(1,2)) -|- numrange(3,4);
1705  ?column? 
1706 ----------
1708 (1 row)
1710 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4));
1711  ?column? 
1712 ----------
1714 (1 row)
1716 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(3,4));
1717  ?column? 
1718 ----------
1720 (1 row)
1722 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(3,4));
1723  ?column? 
1724 ----------
1726 (1 row)
1728 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(6,7));
1729  ?column? 
1730 ----------
1732 (1 row)
1734 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(8,9));
1735  ?column? 
1736 ----------
1738 (1 row)
1740 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4), numrange(6,7));
1741  ?column? 
1742 ----------
1744 (1 row)
1746 -- strictly left
1747 select 'empty'::numrange << nummultirange();
1748  ?column? 
1749 ----------
1751 (1 row)
1753 select numrange(1,2) << nummultirange();
1754  ?column? 
1755 ----------
1757 (1 row)
1759 select numrange(1,2) << nummultirange(numrange(3,4));
1760  ?column? 
1761 ----------
1763 (1 row)
1765 select numrange(1,2) << nummultirange(numrange(0,4));
1766  ?column? 
1767 ----------
1769 (1 row)
1771 select numrange(1,2) << nummultirange(numrange(0,4), numrange(7,8));
1772  ?column? 
1773 ----------
1775 (1 row)
1777 select nummultirange() << 'empty'::numrange;
1778  ?column? 
1779 ----------
1781 (1 row)
1783 select nummultirange() << numrange(1,2);
1784  ?column? 
1785 ----------
1787 (1 row)
1789 select nummultirange(numrange(3,4)) << numrange(3,6);
1790  ?column? 
1791 ----------
1793 (1 row)
1795 select nummultirange(numrange(0,2)) << numrange(3,6);
1796  ?column? 
1797 ----------
1799 (1 row)
1801 select nummultirange(numrange(0,2), numrange(7,8)) << numrange(3,6);
1802  ?column? 
1803 ----------
1805 (1 row)
1807 select nummultirange(numrange(-4,-2), numrange(0,2)) << numrange(3,6);
1808  ?column? 
1809 ----------
1811 (1 row)
1813 select nummultirange() << nummultirange();
1814  ?column? 
1815 ----------
1817 (1 row)
1819 select nummultirange() << nummultirange(numrange(1,2));
1820  ?column? 
1821 ----------
1823 (1 row)
1825 select nummultirange(numrange(1,2)) << nummultirange();
1826  ?column? 
1827 ----------
1829 (1 row)
1831 select nummultirange(numrange(1,2)) << nummultirange(numrange(1,2));
1832  ?column? 
1833 ----------
1835 (1 row)
1837 select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4));
1838  ?column? 
1839 ----------
1841 (1 row)
1843 select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4), numrange(7,8));
1844  ?column? 
1845 ----------
1847 (1 row)
1849 select nummultirange(numrange(1,2), numrange(4,5)) << nummultirange(numrange(3,4), numrange(7,8));
1850  ?column? 
1851 ----------
1853 (1 row)
1855 -- strictly right
1856 select nummultirange() >> 'empty'::numrange;
1857  ?column? 
1858 ----------
1860 (1 row)
1862 select nummultirange() >> numrange(1,2);
1863  ?column? 
1864 ----------
1866 (1 row)
1868 select nummultirange(numrange(3,4)) >> numrange(1,2);
1869  ?column? 
1870 ----------
1872 (1 row)
1874 select nummultirange(numrange(0,4)) >> numrange(1,2);
1875  ?column? 
1876 ----------
1878 (1 row)
1880 select nummultirange(numrange(0,4), numrange(7,8)) >> numrange(1,2);
1881  ?column? 
1882 ----------
1884 (1 row)
1886 select 'empty'::numrange >> nummultirange();
1887  ?column? 
1888 ----------
1890 (1 row)
1892 select numrange(1,2) >> nummultirange();
1893  ?column? 
1894 ----------
1896 (1 row)
1898 select numrange(3,6) >> nummultirange(numrange(3,4));
1899  ?column? 
1900 ----------
1902 (1 row)
1904 select numrange(3,6) >> nummultirange(numrange(0,2));
1905  ?column? 
1906 ----------
1908 (1 row)
1910 select numrange(3,6) >> nummultirange(numrange(0,2), numrange(7,8));
1911  ?column? 
1912 ----------
1914 (1 row)
1916 select numrange(3,6) >> nummultirange(numrange(-4,-2), numrange(0,2));
1917  ?column? 
1918 ----------
1920 (1 row)
1922 select nummultirange() >> nummultirange();
1923  ?column? 
1924 ----------
1926 (1 row)
1928 select nummultirange(numrange(1,2)) >> nummultirange();
1929  ?column? 
1930 ----------
1932 (1 row)
1934 select nummultirange() >> nummultirange(numrange(1,2));
1935  ?column? 
1936 ----------
1938 (1 row)
1940 select nummultirange(numrange(1,2)) >> nummultirange(numrange(1,2));
1941  ?column? 
1942 ----------
1944 (1 row)
1946 select nummultirange(numrange(3,4)) >> nummultirange(numrange(1,2));
1947  ?column? 
1948 ----------
1950 (1 row)
1952 select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2));
1953  ?column? 
1954 ----------
1956 (1 row)
1958 select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2), numrange(4,5));
1959  ?column? 
1960 ----------
1962 (1 row)
1964 -- union
1965 SELECT nummultirange() + nummultirange();
1966  ?column? 
1967 ----------
1968  {}
1969 (1 row)
1971 SELECT nummultirange() + nummultirange(numrange(1,2));
1972  ?column? 
1973 ----------
1974  {[1,2)}
1975 (1 row)
1977 SELECT nummultirange(numrange(1,2)) + nummultirange();
1978  ?column? 
1979 ----------
1980  {[1,2)}
1981 (1 row)
1983 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(1,2));
1984  ?column? 
1985 ----------
1986  {[1,2)}
1987 (1 row)
1989 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(2,4));
1990  ?column? 
1991 ----------
1992  {[1,4)}
1993 (1 row)
1995 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(3,4));
1996    ?column?    
1997 ---------------
1998  {[1,2),[3,4)}
1999 (1 row)
2001 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(2,4));
2002  ?column? 
2003 ----------
2004  {[1,5)}
2005 (1 row)
2007 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(3,4));
2008    ?column?    
2009 ---------------
2010  {[1,2),[3,5)}
2011 (1 row)
2013 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(0,9));
2014  ?column? 
2015 ----------
2016  {[0,9)}
2017 (1 row)
2019 -- merge
2020 SELECT range_merge(nummultirange());
2021  range_merge 
2022 -------------
2023  empty
2024 (1 row)
2026 SELECT range_merge(nummultirange(numrange(1,2)));
2027  range_merge 
2028 -------------
2029  [1,2)
2030 (1 row)
2032 SELECT range_merge(nummultirange(numrange(1,2), numrange(7,8)));
2033  range_merge 
2034 -------------
2035  [1,8)
2036 (1 row)
2038 -- minus
2039 SELECT nummultirange() - nummultirange();
2040  ?column? 
2041 ----------
2042  {}
2043 (1 row)
2045 SELECT nummultirange() - nummultirange(numrange(1,2));
2046  ?column? 
2047 ----------
2048  {}
2049 (1 row)
2051 SELECT nummultirange(numrange(1,2)) - nummultirange();
2052  ?column? 
2053 ----------
2054  {[1,2)}
2055 (1 row)
2057 SELECT nummultirange(numrange(1,2), numrange(3,4)) - nummultirange();
2058    ?column?    
2059 ---------------
2060  {[1,2),[3,4)}
2061 (1 row)
2063 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(1,2));
2064  ?column? 
2065 ----------
2066  {}
2067 (1 row)
2069 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(2,4));
2070  ?column? 
2071 ----------
2072  {[1,2)}
2073 (1 row)
2075 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(3,4));
2076  ?column? 
2077 ----------
2078  {[1,2)}
2079 (1 row)
2081 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(1,2));
2082  ?column? 
2083 ----------
2084  {[2,4)}
2085 (1 row)
2087 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(2,3));
2088    ?column?    
2089 ---------------
2090  {[1,2),[3,4)}
2091 (1 row)
2093 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,8));
2094  ?column? 
2095 ----------
2096  {}
2097 (1 row)
2099 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,2));
2100  ?column? 
2101 ----------
2102  {[2,4)}
2103 (1 row)
2105 SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(0,2), numrange(3,4));
2106    ?column?    
2107 ---------------
2108  {[2,3),[4,8)}
2109 (1 row)
2111 SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(2,3), numrange(5,null));
2112    ?column?    
2113 ---------------
2114  {[1,2),[3,5)}
2115 (1 row)
2117 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0));
2118    ?column?    
2119 ---------------
2120  {[1,2),[4,5)}
2121 (1 row)
2123 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(2,4));
2124    ?column?    
2125 ---------------
2126  {[1,2),[4,5)}
2127 (1 row)
2129 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(3,5));
2130  ?column? 
2131 ----------
2132  {[1,2)}
2133 (1 row)
2135 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(0,9));
2136  ?column? 
2137 ----------
2138  {}
2139 (1 row)
2141 SELECT nummultirange(numrange(1,3), numrange(4,5)) - nummultirange(numrange(2,9));
2142  ?column? 
2143 ----------
2144  {[1,2)}
2145 (1 row)
2147 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(8,9));
2148    ?column?    
2149 ---------------
2150  {[1,2),[4,5)}
2151 (1 row)
2153 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0), numrange(8,9));
2154    ?column?    
2155 ---------------
2156  {[1,2),[4,5)}
2157 (1 row)
2159 -- intersection
2160 SELECT nummultirange() * nummultirange();
2161  ?column? 
2162 ----------
2163  {}
2164 (1 row)
2166 SELECT nummultirange() * nummultirange(numrange(1,2));
2167  ?column? 
2168 ----------
2169  {}
2170 (1 row)
2172 SELECT nummultirange(numrange(1,2)) * nummultirange();
2173  ?column? 
2174 ----------
2175  {}
2176 (1 row)
2178 SELECT '{[1,3)}'::nummultirange * '{[1,5)}'::nummultirange;
2179  ?column? 
2180 ----------
2181  {[1,3)}
2182 (1 row)
2184 SELECT '{[1,3)}'::nummultirange * '{[0,5)}'::nummultirange;
2185  ?column? 
2186 ----------
2187  {[1,3)}
2188 (1 row)
2190 SELECT '{[1,3)}'::nummultirange * '{[0,2)}'::nummultirange;
2191  ?column? 
2192 ----------
2193  {[1,2)}
2194 (1 row)
2196 SELECT '{[1,3)}'::nummultirange * '{[2,5)}'::nummultirange;
2197  ?column? 
2198 ----------
2199  {[2,3)}
2200 (1 row)
2202 SELECT '{[1,4)}'::nummultirange * '{[2,3)}'::nummultirange;
2203  ?column? 
2204 ----------
2205  {[2,3)}
2206 (1 row)
2208 SELECT '{[1,4)}'::nummultirange * '{[0,2), [3,5)}'::nummultirange;
2209    ?column?    
2210 ---------------
2211  {[1,2),[3,4)}
2212 (1 row)
2214 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,8), [9,12)}'::nummultirange;
2215        ?column?       
2216 ----------------------
2217  {[1,4),[7,8),[9,10)}
2218 (1 row)
2220 SELECT '{[1,4), [7,10)}'::nummultirange * '{[9,12)}'::nummultirange;
2221  ?column? 
2222 ----------
2223  {[9,10)}
2224 (1 row)
2226 SELECT '{[1,4), [7,10)}'::nummultirange * '{[-5,-4), [5,6), [9,12)}'::nummultirange;
2227  ?column? 
2228 ----------
2229  {[9,10)}
2230 (1 row)
2232 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange;
2233           ?column?          
2234 ----------------------------
2235  {[1,2),[3,4),[7,8),[9,10)}
2236 (1 row)
2238 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange;
2239           ?column?          
2240 ----------------------------
2241  {[1,2),[3,4),[7,8),[9,10)}
2242 (1 row)
2244 -- test GiST index
2245 create table test_multirange_gist(mr int4multirange);
2246 insert into test_multirange_gist select int4multirange(int4range(g, g+10),int4range(g+20, g+30),int4range(g+40, g+50)) from generate_series(1,2000) g;
2247 insert into test_multirange_gist select '{}'::int4multirange from generate_series(1,500) g;
2248 insert into test_multirange_gist select int4multirange(int4range(g, g+10000)) from generate_series(1,1000) g;
2249 insert into test_multirange_gist select int4multirange(int4range(NULL, g*10, '(]'), int4range(g*10, g*20, '(]')) from generate_series(1,100) g;
2250 insert into test_multirange_gist select int4multirange(int4range(g*10, g*20, '(]'), int4range(g*20, NULL, '(]')) from generate_series(1,100) g;
2251 create index test_mulrirange_gist_idx on test_multirange_gist using gist (mr);
2252 -- test statistics and selectivity estimation as well
2254 -- We don't check the accuracy of selectivity estimation, but at least check
2255 -- it doesn't fall.
2256 analyze test_multirange_gist;
2257 -- first, verify non-indexed results
2258 SET enable_seqscan    = t;
2259 SET enable_indexscan  = f;
2260 SET enable_bitmapscan = f;
2261 select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
2262  count 
2263 -------
2264    500
2265 (1 row)
2267 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2268  count 
2269 -------
2270   3700
2271 (1 row)
2273 select count(*) from test_multirange_gist where mr && 'empty'::int4range;
2274  count 
2275 -------
2276      0
2277 (1 row)
2279 select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
2280  count 
2281 -------
2282    500
2283 (1 row)
2285 select count(*) from test_multirange_gist where mr << 'empty'::int4range;
2286  count 
2287 -------
2288      0
2289 (1 row)
2291 select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
2292  count 
2293 -------
2294      0
2295 (1 row)
2297 select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
2298  count 
2299 -------
2300      0
2301 (1 row)
2303 select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
2304  count 
2305 -------
2306      0
2307 (1 row)
2309 select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
2310  count 
2311 -------
2312      0
2313 (1 row)
2315 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2316  count 
2317 -------
2318   3700
2319 (1 row)
2321 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2322  count 
2323 -------
2324   3700
2325 (1 row)
2327 select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
2328  count 
2329 -------
2330      0
2331 (1 row)
2333 select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
2334  count 
2335 -------
2336    500
2337 (1 row)
2339 select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
2340  count 
2341 -------
2342      0
2343 (1 row)
2345 select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
2346  count 
2347 -------
2348      0
2349 (1 row)
2351 select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
2352  count 
2353 -------
2354      0
2355 (1 row)
2357 select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
2358  count 
2359 -------
2360      0
2361 (1 row)
2363 select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
2364  count 
2365 -------
2366      0
2367 (1 row)
2369 select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
2370  count 
2371 -------
2372      1
2373 (1 row)
2375 select count(*) from test_multirange_gist where mr @> 10;
2376  count 
2377 -------
2378    120
2379 (1 row)
2381 select count(*) from test_multirange_gist where mr @> int4range(10,20);
2382  count 
2383 -------
2384    111
2385 (1 row)
2387 select count(*) from test_multirange_gist where mr && int4range(10,20);
2388  count 
2389 -------
2390    139
2391 (1 row)
2393 select count(*) from test_multirange_gist where mr <@ int4range(10,50);
2394  count 
2395 -------
2396    500
2397 (1 row)
2399 select count(*) from test_multirange_gist where mr << int4range(100,500);
2400  count 
2401 -------
2402     54
2403 (1 row)
2405 select count(*) from test_multirange_gist where mr >> int4range(100,500);
2406  count 
2407 -------
2408   2053
2409 (1 row)
2411 select count(*) from test_multirange_gist where mr &< int4range(100,500);
2412  count 
2413 -------
2414    474
2415 (1 row)
2417 select count(*) from test_multirange_gist where mr &> int4range(100,500);
2418  count 
2419 -------
2420   2893
2421 (1 row)
2423 select count(*) from test_multirange_gist where mr -|- int4range(100,500);
2424  count 
2425 -------
2426      3
2427 (1 row)
2429 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2430  count 
2431 -------
2432   3700
2433 (1 row)
2435 select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40));
2436  count 
2437 -------
2438    110
2439 (1 row)
2441 select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange;
2442  count 
2443 -------
2444    218
2445 (1 row)
2447 select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
2448  count 
2449 -------
2450    500
2451 (1 row)
2453 select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500));
2454  count 
2455 -------
2456     54
2457 (1 row)
2459 select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500));
2460  count 
2461 -------
2462   2053
2463 (1 row)
2465 select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500));
2466  count 
2467 -------
2468    474
2469 (1 row)
2471 select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500));
2472  count 
2473 -------
2474   2893
2475 (1 row)
2477 select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500));
2478  count 
2479 -------
2480      3
2481 (1 row)
2483 -- now check same queries using index
2484 SET enable_seqscan    = f;
2485 SET enable_indexscan  = t;
2486 SET enable_bitmapscan = f;
2487 select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
2488  count 
2489 -------
2490    500
2491 (1 row)
2493 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2494  count 
2495 -------
2496   3700
2497 (1 row)
2499 select count(*) from test_multirange_gist where mr && 'empty'::int4range;
2500  count 
2501 -------
2502      0
2503 (1 row)
2505 select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
2506  count 
2507 -------
2508    500
2509 (1 row)
2511 select count(*) from test_multirange_gist where mr << 'empty'::int4range;
2512  count 
2513 -------
2514      0
2515 (1 row)
2517 select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
2518  count 
2519 -------
2520      0
2521 (1 row)
2523 select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
2524  count 
2525 -------
2526      0
2527 (1 row)
2529 select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
2530  count 
2531 -------
2532      0
2533 (1 row)
2535 select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
2536  count 
2537 -------
2538      0
2539 (1 row)
2541 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2542  count 
2543 -------
2544   3700
2545 (1 row)
2547 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2548  count 
2549 -------
2550   3700
2551 (1 row)
2553 select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
2554  count 
2555 -------
2556      0
2557 (1 row)
2559 select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
2560  count 
2561 -------
2562    500
2563 (1 row)
2565 select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
2566  count 
2567 -------
2568      0
2569 (1 row)
2571 select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
2572  count 
2573 -------
2574      0
2575 (1 row)
2577 select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
2578  count 
2579 -------
2580      0
2581 (1 row)
2583 select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
2584  count 
2585 -------
2586      0
2587 (1 row)
2589 select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
2590  count 
2591 -------
2592      0
2593 (1 row)
2595 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2596  count 
2597 -------
2598   3700
2599 (1 row)
2601 select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
2602  count 
2603 -------
2604      1
2605 (1 row)
2607 select count(*) from test_multirange_gist where mr @> 10;
2608  count 
2609 -------
2610    120
2611 (1 row)
2613 select count(*) from test_multirange_gist where mr @> int4range(10,20);
2614  count 
2615 -------
2616    111
2617 (1 row)
2619 select count(*) from test_multirange_gist where mr && int4range(10,20);
2620  count 
2621 -------
2622    139
2623 (1 row)
2625 select count(*) from test_multirange_gist where mr <@ int4range(10,50);
2626  count 
2627 -------
2628    500
2629 (1 row)
2631 select count(*) from test_multirange_gist where mr << int4range(100,500);
2632  count 
2633 -------
2634     54
2635 (1 row)
2637 select count(*) from test_multirange_gist where mr >> int4range(100,500);
2638  count 
2639 -------
2640   2053
2641 (1 row)
2643 select count(*) from test_multirange_gist where mr &< int4range(100,500);
2644  count 
2645 -------
2646    474
2647 (1 row)
2649 select count(*) from test_multirange_gist where mr &> int4range(100,500);
2650  count 
2651 -------
2652   2893
2653 (1 row)
2655 select count(*) from test_multirange_gist where mr -|- int4range(100,500);
2656  count 
2657 -------
2658      3
2659 (1 row)
2661 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2662  count 
2663 -------
2664   3700
2665 (1 row)
2667 select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40));
2668  count 
2669 -------
2670    110
2671 (1 row)
2673 select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange;
2674  count 
2675 -------
2676    218
2677 (1 row)
2679 select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
2680  count 
2681 -------
2682    500
2683 (1 row)
2685 select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500));
2686  count 
2687 -------
2688     54
2689 (1 row)
2691 select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500));
2692  count 
2693 -------
2694   2053
2695 (1 row)
2697 select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500));
2698  count 
2699 -------
2700    474
2701 (1 row)
2703 select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500));
2704  count 
2705 -------
2706   2893
2707 (1 row)
2709 select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500));
2710  count 
2711 -------
2712      3
2713 (1 row)
2715 drop table test_multirange_gist;
2717 -- range_agg function
2719 create table reservations ( room_id integer not null, booked_during daterange );
2720 insert into reservations values
2721 -- 1: has a meets and a gap
2722 (1, daterange('2018-07-01', '2018-07-07')),
2723 (1, daterange('2018-07-07', '2018-07-14')),
2724 (1, daterange('2018-07-20', '2018-07-22')),
2725 -- 2: just a single row
2726 (2, daterange('2018-07-01', '2018-07-03')),
2727 -- 3: one null range
2728 (3, NULL),
2729 -- 4: two null ranges
2730 (4, NULL),
2731 (4, NULL),
2732 -- 5: a null range and a non-null range
2733 (5, NULL),
2734 (5, daterange('2018-07-01', '2018-07-03')),
2735 -- 6: has overlap
2736 (6, daterange('2018-07-01', '2018-07-07')),
2737 (6, daterange('2018-07-05', '2018-07-10')),
2738 -- 7: two ranges that meet: no gap or overlap
2739 (7, daterange('2018-07-01', '2018-07-07')),
2740 (7, daterange('2018-07-07', '2018-07-14')),
2741 -- 8: an empty range
2742 (8, 'empty'::daterange)
2744 SELECT   room_id, range_agg(booked_during)
2745 FROM     reservations
2746 GROUP BY room_id
2747 ORDER BY room_id;
2748  room_id |                     range_agg                     
2749 ---------+---------------------------------------------------
2750        1 | {[07-01-2018,07-14-2018),[07-20-2018,07-22-2018)}
2751        2 | {[07-01-2018,07-03-2018)}
2752        3 | 
2753        4 | 
2754        5 | {[07-01-2018,07-03-2018)}
2755        6 | {[07-01-2018,07-10-2018)}
2756        7 | {[07-01-2018,07-14-2018)}
2757        8 | {}
2758 (8 rows)
2760 -- range_agg on a custom range type too
2761 SELECT  range_agg(r)
2762 FROM    (VALUES
2763           ('[a,c]'::textrange),
2764           ('[b,b]'::textrange),
2765           ('[c,f]'::textrange),
2766           ('[g,h)'::textrange),
2767           ('[h,j)'::textrange)
2768         ) t(r);
2769    range_agg   
2770 ---------------
2771  {[a,f],[g,j)}
2772 (1 row)
2774 select range_intersect_agg(nmr) from nummultirange_test;
2775  range_intersect_agg 
2776 ---------------------
2777  {}
2778 (1 row)
2780 select range_intersect_agg(nmr) from nummultirange_test where false;
2781  range_intersect_agg 
2782 ---------------------
2784 (1 row)
2786 -- test with just one input:
2787 select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr);
2788  range_intersect_agg 
2789 ---------------------
2790  {[1,2]}
2791 (1 row)
2793 select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0;
2794  range_intersect_agg 
2795 ---------------------
2796  {[3,5)}
2797 (1 row)
2799 create table nummultirange_test2(nmr nummultirange);
2800 create index nummultirange_test2_hash_idx on nummultirange_test2 using hash (nmr);
2801 INSERT INTO nummultirange_test2 VALUES('{[, 5)}');
2802 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2)));
2803 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2)));
2804 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2,'()')));
2805 INSERT INTO nummultirange_test2 VALUES('{}');
2806 select * from nummultirange_test2 where nmr = '{}';
2807  nmr 
2808 -----
2809  {}
2810 (1 row)
2812 select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.2));
2813      nmr     
2814 -------------
2815  {[1.1,2.2)}
2816  {[1.1,2.2)}
2817 (2 rows)
2819 select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.3));
2820  nmr 
2821 -----
2822 (0 rows)
2824 set enable_nestloop=t;
2825 set enable_hashjoin=f;
2826 set enable_mergejoin=f;
2827 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
2828      nmr     
2829 -------------
2830  {}
2831  {}
2832  {}
2833  {}
2834  {(,5)}
2835  {[1.1,2.2)}
2836  {[1.1,2.2)}
2837 (7 rows)
2839 set enable_nestloop=f;
2840 set enable_hashjoin=t;
2841 set enable_mergejoin=f;
2842 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
2843      nmr     
2844 -------------
2845  {}
2846  {}
2847  {}
2848  {}
2849  {(,5)}
2850  {[1.1,2.2)}
2851  {[1.1,2.2)}
2852 (7 rows)
2854 set enable_nestloop=f;
2855 set enable_hashjoin=f;
2856 set enable_mergejoin=t;
2857 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
2858      nmr     
2859 -------------
2860  {}
2861  {}
2862  {}
2863  {}
2864  {(,5)}
2865  {[1.1,2.2)}
2866  {[1.1,2.2)}
2867 (7 rows)
2869 set enable_nestloop to default;
2870 set enable_hashjoin to default;
2871 set enable_mergejoin to default;
2872 DROP TABLE nummultirange_test2;
2874 -- Test user-defined multirange of floats
2876 select '{[123.001, 5.e9)}'::float8multirange @> 888.882::float8;
2877  ?column? 
2878 ----------
2880 (1 row)
2882 create table float8multirange_test(f8mr float8multirange, i int);
2883 insert into float8multirange_test values(float8multirange(float8range(-100.00007, '1.111113e9')), 42);
2884 select * from float8multirange_test;
2885            f8mr            | i  
2886 ---------------------------+----
2887  {[-100.00007,1111113000)} | 42
2888 (1 row)
2890 drop table float8multirange_test;
2892 -- Test multirange types over domains
2894 create domain mydomain as int4;
2895 create type mydomainrange as range(subtype=mydomain);
2896 select '{[4,50)}'::mydomainmultirange @> 7::mydomain;
2897  ?column? 
2898 ----------
2900 (1 row)
2902 drop domain mydomain cascade;
2903 NOTICE:  drop cascades to type mydomainrange
2905 -- Test domains over multirange types
2907 create domain restrictedmultirange as int4multirange check (upper(value) < 10);
2908 select '{[4,5)}'::restrictedmultirange @> 7;
2909  ?column? 
2910 ----------
2912 (1 row)
2914 select '{[4,50)}'::restrictedmultirange @> 7; -- should fail
2915 ERROR:  value for domain restrictedmultirange violates check constraint "restrictedmultirange_check"
2916 drop domain restrictedmultirange;
2918 -- Check automatic naming of multiranges
2920 create type intr as range(subtype=int);
2921 select intr_multirange(intr(1,10));
2922  intr_multirange 
2923 -----------------
2924  {[1,10)}
2925 (1 row)
2927 drop type intr;
2928 create type intmultirange as (x int, y int);
2929 create type intrange as range(subtype=int); -- should fail
2930 ERROR:  type "intmultirange" already exists
2931 DETAIL:  Failed while creating a multirange type for type "intrange".
2932 HINT:  You can manually specify a multirange type name using the "multirange_type_name" attribute.
2933 drop type intmultirange;
2934 create type intr_multirange as (x int, y int);
2935 create type intr as range(subtype=int); -- should fail
2936 ERROR:  type "intr_multirange" already exists
2937 DETAIL:  Failed while creating a multirange type for type "intr".
2938 HINT:  You can manually specify a multirange type name using the "multirange_type_name" attribute.
2939 drop type intr_multirange;
2941 -- Test multiple multirange types over the same subtype and manual naming of
2942 -- the multirange type.
2944 -- should fail
2945 create type textrange1 as range(subtype=text, multirange_type_name=int, collation="C");
2946 ERROR:  type "int4" already exists
2947 -- should pass
2948 create type textrange1 as range(subtype=text, multirange_type_name=multirange_of_text, collation="C");
2949 -- should pass, because existing _textrange1 is automatically renamed
2950 create type textrange2 as range(subtype=text, multirange_type_name=_textrange1, collation="C");
2951 select multirange_of_text(textrange2('a','Z'));  -- should fail
2952 ERROR:  function multirange_of_text(textrange2) does not exist
2953 LINE 1: select multirange_of_text(textrange2('a','Z'));
2954                ^
2955 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
2956 select multirange_of_text(textrange1('a','Z')) @> 'b'::text;
2957 ERROR:  range lower bound must be less than or equal to range upper bound
2958 select unnest(multirange_of_text(textrange1('a','b'), textrange1('d','e')));
2959  unnest 
2960 --------
2961  [a,b)
2962  [d,e)
2963 (2 rows)
2965 select _textrange1(textrange2('a','z')) @> 'b'::text;
2966  ?column? 
2967 ----------
2969 (1 row)
2971 drop type textrange1;
2972 drop type textrange2;
2974 -- Test polymorphic type system
2976 create function anyarray_anymultirange_func(a anyarray, r anymultirange)
2977   returns anyelement as 'select $1[1] + lower($2);' language sql;
2978 select anyarray_anymultirange_func(ARRAY[1,2], int4multirange(int4range(10,20)));
2979  anyarray_anymultirange_func 
2980 -----------------------------
2981                           11
2982 (1 row)
2984 -- should fail
2985 select anyarray_anymultirange_func(ARRAY[1,2], nummultirange(numrange(10,20)));
2986 ERROR:  function anyarray_anymultirange_func(integer[], nummultirange) does not exist
2987 LINE 1: select anyarray_anymultirange_func(ARRAY[1,2], nummultirange...
2988                ^
2989 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
2990 drop function anyarray_anymultirange_func(anyarray, anymultirange);
2991 -- should fail
2992 create function bogus_func(anyelement)
2993   returns anymultirange as 'select int4multirange(int4range(1,10))' language sql;
2994 ERROR:  cannot determine result data type
2995 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
2996 -- should fail
2997 create function bogus_func(int)
2998   returns anymultirange as 'select int4multirange(int4range(1,10))' language sql;
2999 ERROR:  cannot determine result data type
3000 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3001 create function range_add_bounds(anymultirange)
3002   returns anyelement as 'select lower($1) + upper($1)' language sql;
3003 select range_add_bounds(int4multirange(int4range(1, 17)));
3004  range_add_bounds 
3005 ------------------
3006                18
3007 (1 row)
3009 select range_add_bounds(nummultirange(numrange(1.0001, 123.123)));
3010  range_add_bounds 
3011 ------------------
3012          124.1231
3013 (1 row)
3015 create function multirangetypes_sql(q anymultirange, b anyarray, out c anyelement)
3016   as $$ select upper($1) + $2[1] $$
3017   language sql;
3018 select multirangetypes_sql(int4multirange(int4range(1,10)), ARRAY[2,20]);
3019  multirangetypes_sql 
3020 ---------------------
3021                   12
3022 (1 row)
3024 select multirangetypes_sql(nummultirange(numrange(1,10)), ARRAY[2,20]);  -- match failure
3025 ERROR:  function multirangetypes_sql(nummultirange, integer[]) does not exist
3026 LINE 1: select multirangetypes_sql(nummultirange(numrange(1,10)), AR...
3027                ^
3028 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3029 create function anycompatiblearray_anycompatiblemultirange_func(a anycompatiblearray, mr anycompatiblemultirange)
3030   returns anycompatible as 'select $1[1] + lower($2);' language sql;
3031 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(int4range(10,20)));
3032  anycompatiblearray_anycompatiblemultirange_func 
3033 -------------------------------------------------
3034                                               11
3035 (1 row)
3037 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(numrange(10,20)));
3038  anycompatiblearray_anycompatiblemultirange_func 
3039 -------------------------------------------------
3040                                               11
3041 (1 row)
3043 -- should fail
3044 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1.1,2], multirange(int4range(10,20)));
3045 ERROR:  function anycompatiblearray_anycompatiblemultirange_func(numeric[], int4multirange) does not exist
3046 LINE 1: select anycompatiblearray_anycompatiblemultirange_func(ARRAY...
3047                ^
3048 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3049 drop function anycompatiblearray_anycompatiblemultirange_func(anycompatiblearray, anycompatiblemultirange);
3050 create function anycompatiblerange_anycompatiblemultirange_func(r anycompatiblerange, mr anycompatiblemultirange)
3051   returns anycompatible as 'select lower($1) + lower($2);' language sql;
3052 select anycompatiblerange_anycompatiblemultirange_func(int4range(1,2), multirange(int4range(10,20)));
3053  anycompatiblerange_anycompatiblemultirange_func 
3054 -------------------------------------------------
3055                                               11
3056 (1 row)
3058 -- should fail
3059 select anycompatiblerange_anycompatiblemultirange_func(numrange(1,2), multirange(int4range(10,20)));
3060 ERROR:  function anycompatiblerange_anycompatiblemultirange_func(numrange, int4multirange) does not exist
3061 LINE 1: select anycompatiblerange_anycompatiblemultirange_func(numra...
3062                ^
3063 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3064 drop function anycompatiblerange_anycompatiblemultirange_func(anycompatiblerange, anycompatiblemultirange);
3065 -- should fail
3066 create function bogus_func(anycompatible)
3067   returns anycompatiblerange as 'select int4range(1,10)' language sql;
3068 ERROR:  cannot determine result data type
3069 DETAIL:  A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange.
3071 -- Arrays of multiranges
3073 select ARRAY[nummultirange(numrange(1.1, 1.2)), nummultirange(numrange(12.3, 155.5))];
3074               array               
3075 ----------------------------------
3076  {"{[1.1,1.2)}","{[12.3,155.5)}"}
3077 (1 row)
3079 create table i8mr_array (f1 int, f2 int8multirange[]);
3080 insert into i8mr_array values (42, array[int8multirange(int8range(1,10)), int8multirange(int8range(2,20))]);
3081 select * from i8mr_array;
3082  f1 |           f2            
3083 ----+-------------------------
3084  42 | {"{[1,10)}","{[2,20)}"}
3085 (1 row)
3087 drop table i8mr_array;
3089 -- Multiranges of arrays
3091 select arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1]));
3092    arraymultirange   
3093 ---------------------
3094  {["{1,2}","{2,1}")}
3095 (1 row)
3097 select arraymultirange(arrayrange(ARRAY[2,1], ARRAY[1,2]));  -- fail
3098 ERROR:  range lower bound must be less than or equal to range upper bound
3099 select array[1,1] <@ arraymultirange(arrayrange(array[1,2], array[2,1]));
3100  ?column? 
3101 ----------
3103 (1 row)
3105 select array[1,3] <@ arraymultirange(arrayrange(array[1,2], array[2,1]));
3106  ?column? 
3107 ----------
3109 (1 row)
3112 -- Ranges of composites
3114 create type two_ints as (a int, b int);
3115 create type two_ints_range as range (subtype = two_ints);
3116 -- with force_parallel_mode on, this exercises tqueue.c's range remapping
3117 select *, row_to_json(upper(t)) as u from
3118   (values (two_ints_multirange(two_ints_range(row(1,2), row(3,4)))),
3119           (two_ints_multirange(two_ints_range(row(5,6), row(7,8))))) v(t);
3120           t          |       u       
3121 ---------------------+---------------
3122  {["(1,2)","(3,4)")} | {"a":3,"b":4}
3123  {["(5,6)","(7,8)")} | {"a":7,"b":8}
3124 (2 rows)
3126 drop type two_ints cascade;
3127 NOTICE:  drop cascades to type two_ints_range
3129 -- Check behavior when subtype lacks a hash function
3131 set enable_sort = off;  -- try to make it pick a hash setop implementation
3132 select '{(2,5)}'::cashmultirange except select '{(5,6)}'::cashmultirange;
3133  cashmultirange  
3134 -----------------
3135  {($2.00,$5.00)}
3136 (1 row)
3138 reset enable_sort;
3140 -- OUT/INOUT/TABLE functions
3142 -- infer anymultirange from anymultirange
3143 create function mr_outparam_succeed(i anymultirange, out r anymultirange, out t text)
3144   as $$ select $1, 'foo'::text $$ language sql;
3145 select * from mr_outparam_succeed(int4multirange(int4range(1,2)));
3146     r    |  t  
3147 ---------+-----
3148  {[1,2)} | foo
3149 (1 row)
3151 -- infer anyarray from anymultirange
3152 create function mr_outparam_succeed2(i anymultirange, out r anyarray, out t text)
3153   as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql;
3154 select * from mr_outparam_succeed2(int4multirange(int4range(1,2)));
3155   r  |  t  
3156 -----+-----
3157  {2} | foo
3158 (1 row)
3160 -- infer anyrange from anymultirange
3161 create function mr_outparam_succeed3(i anymultirange, out r anyrange, out t text)
3162   as $$ select range_merge($1), 'foo'::text $$ language sql;
3163 select * from mr_outparam_succeed3(int4multirange(int4range(1,2)));
3164    r   |  t  
3165 -------+-----
3166  [1,2) | foo
3167 (1 row)
3169 -- infer anymultirange from anyrange
3170 create function mr_outparam_succeed4(i anyrange, out r anymultirange, out t text)
3171   as $$ select multirange($1), 'foo'::text $$ language sql;
3172 select * from mr_outparam_succeed4(int4range(1,2));
3173     r    |  t  
3174 ---------+-----
3175  {[1,2)} | foo
3176 (1 row)
3178 -- infer anyelement from anymultirange
3179 create function mr_inoutparam_succeed(out i anyelement, inout r anymultirange)
3180   as $$ select upper($1), $1 $$ language sql;
3181 select * from mr_inoutparam_succeed(int4multirange(int4range(1,2)));
3182  i |    r    
3183 ---+---------
3184  2 | {[1,2)}
3185 (1 row)
3187 -- infer anyelement+anymultirange from anyelement+anymultirange
3188 create function mr_table_succeed(i anyelement, r anymultirange) returns table(i anyelement, r anymultirange)
3189   as $$ select $1, $2 $$ language sql;
3190 select * from mr_table_succeed(123, int4multirange(int4range(1,11)));
3191   i  |    r     
3192 -----+----------
3193  123 | {[1,11)}
3194 (1 row)
3196 -- use anymultirange in plpgsql
3197 create function mr_polymorphic(i anyrange) returns anymultirange
3198   as $$ begin return multirange($1); end; $$ language plpgsql;
3199 select mr_polymorphic(int4range(1, 4));
3200  mr_polymorphic 
3201 ----------------
3202  {[1,4)}
3203 (1 row)
3205 -- should fail
3206 create function mr_outparam_fail(i anyelement, out r anymultirange, out t text)
3207   as $$ select '[1,10]', 'foo' $$ language sql;
3208 ERROR:  cannot determine result data type
3209 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3210 --should fail
3211 create function mr_inoutparam_fail(inout i anyelement, out r anymultirange)
3212   as $$ select $1, '[1,10]' $$ language sql;
3213 ERROR:  cannot determine result data type
3214 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3215 --should fail
3216 create function mr_table_fail(i anyelement) returns table(i anyelement, r anymultirange)
3217   as $$ select $1, '[1,10]' $$ language sql;
3218 ERROR:  cannot determine result data type
3219 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.