Fix a memory leak in dumping functions with TRANSFORMs
[pgsql.git] / src / test / regress / expected / multirangetypes.out
blobc6363ebeb24ca3c99c56afa719cc24771e1df5b6
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 textrange('\\\\', repeat('a', 200))::textmultirange;
101                                                                                                         textrange                                                                                                        
102 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
103  {["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)}
104 (1 row)
106 select '{(,z)}'::textmultirange;
107  textmultirange 
108 ----------------
109  {(,z)}
110 (1 row)
112 select '{(a,)}'::textmultirange;
113  textmultirange 
114 ----------------
115  {(a,)}
116 (1 row)
118 select '{[,z]}'::textmultirange;
119  textmultirange 
120 ----------------
121  {(,z]}
122 (1 row)
124 select '{[a,]}'::textmultirange;
125  textmultirange 
126 ----------------
127  {[a,)}
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 '{["""","\""]}'::textmultirange;
161  textmultirange 
162 ----------------
163  {["""",""""]}
164 (1 row)
166 select '{(\\,a)}'::textmultirange;
167  textmultirange 
168 ----------------
169  {("\\",a)}
170 (1 row)
172 select '{((,z)}'::textmultirange;
173  textmultirange 
174 ----------------
175  {("(",z)}
176 (1 row)
178 select '{([,z)}'::textmultirange;
179  textmultirange 
180 ----------------
181  {("[",z)}
182 (1 row)
184 select '{(!,()}'::textmultirange;
185  textmultirange 
186 ----------------
187  {(!,"(")}
188 (1 row)
190 select '{(!,[)}'::textmultirange;
191  textmultirange 
192 ----------------
193  {(!,"[")}
194 (1 row)
196 select '{[a,a]}'::textmultirange;
197  textmultirange 
198 ----------------
199  {[a,a]}
200 (1 row)
202 select '{[a,a],[a,b]}'::textmultirange;
203  textmultirange 
204 ----------------
205  {[a,b]}
206 (1 row)
208 select '{[a,b), [b,e]}'::textmultirange;
209  textmultirange 
210 ----------------
211  {[a,e]}
212 (1 row)
214 select '{[a,d), [b,f]}'::textmultirange;
215  textmultirange 
216 ----------------
217  {[a,f]}
218 (1 row)
220 select '{[a,a],[b,b]}'::textmultirange;
221  textmultirange 
222 ----------------
223  {[a,a],[b,b]}
224 (1 row)
226 -- without canonicalization, we can't join these:
227 select '{[a,a], [b,b]}'::textmultirange;
228  textmultirange 
229 ----------------
230  {[a,a],[b,b]}
231 (1 row)
233 -- with canonicalization, we can join these:
234 select '{[1,2], [3,4]}'::int4multirange;
235  int4multirange 
236 ----------------
237  {[1,5)}
238 (1 row)
240 select '{[a,a], [b,b], [c,c]}'::textmultirange;
241    textmultirange    
242 ---------------------
243  {[a,a],[b,b],[c,c]}
244 (1 row)
246 select '{[a,d], [b,e]}'::textmultirange;
247  textmultirange 
248 ----------------
249  {[a,e]}
250 (1 row)
252 select '{[a,d), [d,e)}'::textmultirange;
253  textmultirange 
254 ----------------
255  {[a,e)}
256 (1 row)
258 -- these are allowed but normalize to empty:
259 select '{[a,a)}'::textmultirange;
260  textmultirange 
261 ----------------
262  {}
263 (1 row)
265 select '{(a,a]}'::textmultirange;
266  textmultirange 
267 ----------------
268  {}
269 (1 row)
271 select '{(a,a)}'::textmultirange;
272  textmultirange 
273 ----------------
274  {}
275 (1 row)
277 -- Also try it with non-error-throwing API
278 select pg_input_is_valid('{[1,2], [4,5]}', 'int4multirange');
279  pg_input_is_valid 
280 -------------------
282 (1 row)
284 select pg_input_is_valid('{[1,2], [4,5]', 'int4multirange');
285  pg_input_is_valid 
286 -------------------
288 (1 row)
290 select * from pg_input_error_info('{[1,2], [4,5]', 'int4multirange');
291                     message                    |          detail          | hint | sql_error_code 
292 -----------------------------------------------+--------------------------+------+----------------
293  malformed multirange literal: "{[1,2], [4,5]" | Unexpected end of input. |      | 22P02
294 (1 row)
296 select pg_input_is_valid('{[1,2], [4,zed]}', 'int4multirange');
297  pg_input_is_valid 
298 -------------------
300 (1 row)
302 select * from pg_input_error_info('{[1,2], [4,zed]}', 'int4multirange');
303                    message                    | detail | hint | sql_error_code 
304 ----------------------------------------------+--------+------+----------------
305  invalid input syntax for type integer: "zed" |        |      | 22P02
306 (1 row)
309 -- test the constructor
311 select textmultirange();
312  textmultirange 
313 ----------------
314  {}
315 (1 row)
317 select textmultirange(textrange('a', 'c'));
318  textmultirange 
319 ----------------
320  {[a,c)}
321 (1 row)
323 select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
324  textmultirange 
325 ----------------
326  {[a,c),[f,g)}
327 (1 row)
329 select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'));
330                                                                                                         textmultirange                                                                                                         
331 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
332  {["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),[c,d)}
333 (1 row)
336 -- test casts, both a built-in range type and a user-defined one:
338 select 'empty'::int4range::int4multirange;
339  int4multirange 
340 ----------------
341  {}
342 (1 row)
344 select int4range(1, 3)::int4multirange;
345  int4range 
346 -----------
347  {[1,3)}
348 (1 row)
350 select int4range(1, null)::int4multirange;
351  int4range 
352 -----------
353  {[1,)}
354 (1 row)
356 select int4range(null, null)::int4multirange;
357  int4range 
358 -----------
359  {(,)}
360 (1 row)
362 select 'empty'::textrange::textmultirange;
363  textmultirange 
364 ----------------
365  {}
366 (1 row)
368 select textrange('a', 'c')::textmultirange;
369  textrange 
370 -----------
371  {[a,c)}
372 (1 row)
374 select textrange('a', null)::textmultirange;
375  textrange 
376 -----------
377  {[a,)}
378 (1 row)
380 select textrange(null, null)::textmultirange;
381  textrange 
382 -----------
383  {(,)}
384 (1 row)
387 -- test unnest(multirange) function
389 select unnest(int4multirange(int4range('5', '6'), int4range('1', '2')));
390  unnest 
391 --------
392  [1,2)
393  [5,6)
394 (2 rows)
396 select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
397  unnest 
398 --------
399  [a,b)
400  [d,e)
401 (2 rows)
403 select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')));
404                                                                                                         unnest                                                                                                         
405 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
406  ["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
407  [c,d)
408 (2 rows)
411 -- create some test data and test the operators
413 CREATE TABLE nummultirange_test (nmr NUMMULTIRANGE);
414 CREATE INDEX nummultirange_test_btree ON nummultirange_test(nmr);
415 INSERT INTO nummultirange_test VALUES('{}');
416 INSERT INTO nummultirange_test VALUES('{[,)}');
417 INSERT INTO nummultirange_test VALUES('{[3,]}');
418 INSERT INTO nummultirange_test VALUES('{[,), [3,]}');
419 INSERT INTO nummultirange_test VALUES('{[, 5)}');
420 INSERT INTO nummultirange_test VALUES(nummultirange());
421 INSERT INTO nummultirange_test VALUES(nummultirange(variadic '{}'::numrange[]));
422 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.1, 2.2)));
423 INSERT INTO nummultirange_test VALUES('{empty}');
424 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.7, 1.9)));
425 INSERT INTO nummultirange_test VALUES(nummultirange(numrange(1.7, 1.7, '[]'), numrange(1.9, 2.1)));
426 SELECT nmr, isempty(nmr), lower(nmr), upper(nmr) FROM nummultirange_test ORDER BY nmr;
427           nmr          | isempty | lower | upper 
428 -----------------------+---------+-------+-------
429  {}                    | t       |       |      
430  {}                    | t       |       |      
431  {}                    | t       |       |      
432  {}                    | t       |       |      
433  {(,5)}                | f       |       |     5
434  {(,)}                 | f       |       |      
435  {(,)}                 | f       |       |      
436  {[1.1,2.2)}           | f       |   1.1 |   2.2
437  {[1.7,1.7],[1.9,2.1)} | f       |   1.7 |   2.1
438  {[1.7,1.9)}           | f       |   1.7 |   1.9
439  {[3,)}                | f       |     3 |      
440 (11 rows)
442 SELECT nmr, lower_inc(nmr), lower_inf(nmr), upper_inc(nmr), upper_inf(nmr) FROM nummultirange_test ORDER BY nmr;
443           nmr          | lower_inc | lower_inf | upper_inc | upper_inf 
444 -----------------------+-----------+-----------+-----------+-----------
445  {}                    | f         | f         | f         | f
446  {}                    | f         | f         | f         | f
447  {}                    | f         | f         | f         | f
448  {}                    | f         | f         | f         | f
449  {(,5)}                | f         | t         | f         | f
450  {(,)}                 | f         | t         | f         | t
451  {(,)}                 | f         | t         | f         | t
452  {[1.1,2.2)}           | t         | f         | f         | f
453  {[1.7,1.7],[1.9,2.1)} | t         | f         | f         | f
454  {[1.7,1.9)}           | t         | f         | f         | f
455  {[3,)}                | t         | f         | f         | t
456 (11 rows)
458 SELECT * FROM nummultirange_test WHERE nmr = '{}';
459  nmr 
460 -----
461  {}
462  {}
463  {}
464  {}
465 (4 rows)
467 SELECT * FROM nummultirange_test WHERE nmr = '{(,5)}';
468   nmr   
469 --------
470  {(,5)}
471 (1 row)
473 SELECT * FROM nummultirange_test WHERE nmr = '{[3,)}';
474   nmr   
475 --------
476  {[3,)}
477 (1 row)
479 SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7]}';
480  nmr 
481 -----
482 (0 rows)
484 SELECT * FROM nummultirange_test WHERE nmr = '{[1.7,1.7],[1.9,2.1)}';
485           nmr          
486 -----------------------
487  {[1.7,1.7],[1.9,2.1)}
488 (1 row)
490 SELECT * FROM nummultirange_test WHERE nmr < '{}';
491  nmr 
492 -----
493 (0 rows)
495 SELECT * FROM nummultirange_test WHERE nmr < '{[-1000.0, -1000.0]}';
496   nmr   
497 --------
498  {}
499  {(,)}
500  {(,)}
501  {(,5)}
502  {}
503  {}
504  {}
505 (7 rows)
507 SELECT * FROM nummultirange_test WHERE nmr < '{[0.0, 1.0]}';
508   nmr   
509 --------
510  {}
511  {(,)}
512  {(,)}
513  {(,5)}
514  {}
515  {}
516  {}
517 (7 rows)
519 SELECT * FROM nummultirange_test WHERE nmr < '{[1000.0, 1001.0]}';
520           nmr          
521 -----------------------
522  {}
523  {(,)}
524  {[3,)}
525  {(,)}
526  {(,5)}
527  {}
528  {}
529  {[1.1,2.2)}
530  {}
531  {[1.7,1.9)}
532  {[1.7,1.7],[1.9,2.1)}
533 (11 rows)
535 SELECT * FROM nummultirange_test WHERE nmr <= '{}';
536  nmr 
537 -----
538  {}
539  {}
540  {}
541  {}
542 (4 rows)
544 SELECT * FROM nummultirange_test WHERE nmr <= '{[3,)}';
545           nmr          
546 -----------------------
547  {}
548  {(,)}
549  {[3,)}
550  {(,)}
551  {(,5)}
552  {}
553  {}
554  {[1.1,2.2)}
555  {}
556  {[1.7,1.9)}
557  {[1.7,1.7],[1.9,2.1)}
558 (11 rows)
560 SELECT * FROM nummultirange_test WHERE nmr >= '{}';
561           nmr          
562 -----------------------
563  {}
564  {(,)}
565  {[3,)}
566  {(,)}
567  {(,5)}
568  {}
569  {}
570  {[1.1,2.2)}
571  {}
572  {[1.7,1.9)}
573  {[1.7,1.7],[1.9,2.1)}
574 (11 rows)
576 SELECT * FROM nummultirange_test WHERE nmr >= '{[3,)}';
577   nmr   
578 --------
579  {[3,)}
580 (1 row)
582 SELECT * FROM nummultirange_test WHERE nmr > '{}';
583           nmr          
584 -----------------------
585  {(,)}
586  {[3,)}
587  {(,)}
588  {(,5)}
589  {[1.1,2.2)}
590  {[1.7,1.9)}
591  {[1.7,1.7],[1.9,2.1)}
592 (7 rows)
594 SELECT * FROM nummultirange_test WHERE nmr > '{[-1000.0, -1000.0]}';
595           nmr          
596 -----------------------
597  {[3,)}
598  {[1.1,2.2)}
599  {[1.7,1.9)}
600  {[1.7,1.7],[1.9,2.1)}
601 (4 rows)
603 SELECT * FROM nummultirange_test WHERE nmr > '{[0.0, 1.0]}';
604           nmr          
605 -----------------------
606  {[3,)}
607  {[1.1,2.2)}
608  {[1.7,1.9)}
609  {[1.7,1.7],[1.9,2.1)}
610 (4 rows)
612 SELECT * FROM nummultirange_test WHERE nmr > '{[1000.0, 1001.0]}';
613  nmr 
614 -----
615 (0 rows)
617 SELECT * FROM nummultirange_test WHERE nmr <> '{}';
618           nmr          
619 -----------------------
620  {(,)}
621  {[3,)}
622  {(,)}
623  {(,5)}
624  {[1.1,2.2)}
625  {[1.7,1.9)}
626  {[1.7,1.7],[1.9,2.1)}
627 (7 rows)
629 SELECT * FROM nummultirange_test WHERE nmr <> '{(,5)}';
630           nmr          
631 -----------------------
632  {}
633  {(,)}
634  {[3,)}
635  {(,)}
636  {}
637  {}
638  {[1.1,2.2)}
639  {}
640  {[1.7,1.9)}
641  {[1.7,1.7],[1.9,2.1)}
642 (10 rows)
644 select nummultirange(numrange(2.0, 1.0));
645 ERROR:  range lower bound must be less than or equal to range upper bound
646 select nummultirange(numrange(5.0, 6.0), numrange(1.0, 2.0));
647      nummultirange     
648 -----------------------
649  {[1.0,2.0),[5.0,6.0)}
650 (1 row)
652 analyze nummultirange_test;
653 -- overlaps
654 SELECT * FROM nummultirange_test WHERE range_overlaps_multirange(numrange(4.0, 4.2), nmr);
655   nmr   
656 --------
657  {(,)}
658  {[3,)}
659  {(,)}
660  {(,5)}
661 (4 rows)
663 SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) && nmr;
664   nmr   
665 --------
666  {(,)}
667  {[3,)}
668  {(,)}
669  {(,5)}
670 (4 rows)
672 SELECT * FROM nummultirange_test WHERE multirange_overlaps_range(nmr, numrange(4.0, 4.2));
673   nmr   
674 --------
675  {(,)}
676  {[3,)}
677  {(,)}
678  {(,5)}
679 (4 rows)
681 SELECT * FROM nummultirange_test WHERE nmr && numrange(4.0, 4.2);
682   nmr   
683 --------
684  {(,)}
685  {[3,)}
686  {(,)}
687  {(,5)}
688 (4 rows)
690 SELECT * FROM nummultirange_test WHERE multirange_overlaps_multirange(nmr, nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0)));
691   nmr   
692 --------
693  {(,)}
694  {[3,)}
695  {(,)}
696  {(,5)}
697 (4 rows)
699 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(4.0, 4.2), numrange(6.0, 7.0));
700   nmr   
701 --------
702  {(,)}
703  {[3,)}
704  {(,)}
705  {(,5)}
706 (4 rows)
708 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0));
709   nmr   
710 --------
711  {(,)}
712  {[3,)}
713  {(,)}
714 (3 rows)
716 SELECT * FROM nummultirange_test WHERE nmr && nummultirange(numrange(6.0, 7.0), numrange(8.0, 9.0));
717   nmr   
718 --------
719  {(,)}
720  {[3,)}
721  {(,)}
722 (3 rows)
724 -- mr contains x
725 SELECT * FROM nummultirange_test WHERE multirange_contains_elem(nmr, 4.0);
726   nmr   
727 --------
728  {(,)}
729  {[3,)}
730  {(,)}
731  {(,5)}
732 (4 rows)
734 SELECT * FROM nummultirange_test WHERE nmr @> 4.0;
735   nmr   
736 --------
737  {(,)}
738  {[3,)}
739  {(,)}
740  {(,5)}
741 (4 rows)
743 SELECT * FROM nummultirange_test WHERE multirange_contains_range(nmr, numrange(4.0, 4.2));
744   nmr   
745 --------
746  {(,)}
747  {[3,)}
748  {(,)}
749  {(,5)}
750 (4 rows)
752 SELECT * FROM nummultirange_test WHERE nmr @> numrange(4.0, 4.2);
753   nmr   
754 --------
755  {(,)}
756  {[3,)}
757  {(,)}
758  {(,5)}
759 (4 rows)
761 SELECT * FROM nummultirange_test WHERE multirange_contains_multirange(nmr, '{[4.0,4.2), [6.0, 8.0)}');
762   nmr   
763 --------
764  {(,)}
765  {[3,)}
766  {(,)}
767 (3 rows)
769 SELECT * FROM nummultirange_test WHERE nmr @> '{[4.0,4.2), [6.0, 8.0)}'::nummultirange;
770   nmr   
771 --------
772  {(,)}
773  {[3,)}
774  {(,)}
775 (3 rows)
777 -- x is contained by mr
778 SELECT * FROM nummultirange_test WHERE elem_contained_by_multirange(4.0, nmr);
779   nmr   
780 --------
781  {(,)}
782  {[3,)}
783  {(,)}
784  {(,5)}
785 (4 rows)
787 SELECT * FROM nummultirange_test WHERE 4.0 <@ nmr;
788   nmr   
789 --------
790  {(,)}
791  {[3,)}
792  {(,)}
793  {(,5)}
794 (4 rows)
796 SELECT * FROM nummultirange_test WHERE range_contained_by_multirange(numrange(4.0, 4.2), nmr);
797   nmr   
798 --------
799  {(,)}
800  {[3,)}
801  {(,)}
802  {(,5)}
803 (4 rows)
805 SELECT * FROM nummultirange_test WHERE numrange(4.0, 4.2) <@ nmr;
806   nmr   
807 --------
808  {(,)}
809  {[3,)}
810  {(,)}
811  {(,5)}
812 (4 rows)
814 SELECT * FROM nummultirange_test WHERE multirange_contained_by_multirange('{[4.0,4.2), [6.0, 8.0)}', nmr);
815   nmr   
816 --------
817  {(,)}
818  {[3,)}
819  {(,)}
820 (3 rows)
822 SELECT * FROM nummultirange_test WHERE '{[4.0,4.2), [6.0, 8.0)}'::nummultirange <@ nmr;
823   nmr   
824 --------
825  {(,)}
826  {[3,)}
827  {(,)}
828 (3 rows)
830 -- overlaps
831 SELECT 'empty'::numrange && nummultirange();
832  ?column? 
833 ----------
835 (1 row)
837 SELECT 'empty'::numrange && nummultirange(numrange(1,2));
838  ?column? 
839 ----------
841 (1 row)
843 SELECT nummultirange() && 'empty'::numrange;
844  ?column? 
845 ----------
847 (1 row)
849 SELECT nummultirange(numrange(1,2)) && 'empty'::numrange;
850  ?column? 
851 ----------
853 (1 row)
855 SELECT nummultirange() && nummultirange();
856  ?column? 
857 ----------
859 (1 row)
861 SELECT nummultirange() && nummultirange(numrange(1,2));
862  ?column? 
863 ----------
865 (1 row)
867 SELECT nummultirange(numrange(1,2)) && nummultirange();
868  ?column? 
869 ----------
871 (1 row)
873 SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(7,8));
874  ?column? 
875 ----------
877 (1 row)
879 SELECT nummultirange(numrange(1,2), numrange(7,8)) && nummultirange(numrange(3,4));
880  ?column? 
881 ----------
883 (1 row)
885 SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(3.5,8));
886  ?column? 
887 ----------
889 (1 row)
891 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && numrange(3,4);
892  ?column? 
893 ----------
895 (1 row)
897 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3,4));
898  ?column? 
899 ----------
901 (1 row)
903 select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange;
904  ?column? 
905 ----------
907 (1 row)
909 -- contains
910 SELECT nummultirange() @> nummultirange();
911  ?column? 
912 ----------
914 (1 row)
916 SELECT nummultirange() @> 'empty'::numrange;
917  ?column? 
918 ----------
920 (1 row)
922 SELECT nummultirange(numrange(null,null)) @> numrange(1,2);
923  ?column? 
924 ----------
926 (1 row)
928 SELECT nummultirange(numrange(null,null)) @> numrange(null,2);
929  ?column? 
930 ----------
932 (1 row)
934 SELECT nummultirange(numrange(null,null)) @> numrange(2,null);
935  ?column? 
936 ----------
938 (1 row)
940 SELECT nummultirange(numrange(null,5)) @> numrange(null,3);
941  ?column? 
942 ----------
944 (1 row)
946 SELECT nummultirange(numrange(null,5)) @> numrange(null,8);
947  ?column? 
948 ----------
950 (1 row)
952 SELECT nummultirange(numrange(5,null)) @> numrange(8,null);
953  ?column? 
954 ----------
956 (1 row)
958 SELECT nummultirange(numrange(5,null)) @> numrange(3,null);
959  ?column? 
960 ----------
962 (1 row)
964 SELECT nummultirange(numrange(1,5)) @> numrange(8,9);
965  ?column? 
966 ----------
968 (1 row)
970 SELECT nummultirange(numrange(1,5)) @> numrange(3,9);
971  ?column? 
972 ----------
974 (1 row)
976 SELECT nummultirange(numrange(1,5)) @> numrange(1,4);
977  ?column? 
978 ----------
980 (1 row)
982 SELECT nummultirange(numrange(1,5)) @> numrange(1,5);
983  ?column? 
984 ----------
986 (1 row)
988 SELECT nummultirange(numrange(-4,-2), numrange(1,5)) @> numrange(1,5);
989  ?column? 
990 ----------
992 (1 row)
994 SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(1,5);
995  ?column? 
996 ----------
998 (1 row)
1000 SELECT nummultirange(numrange(1,5), numrange(8,9)) @> numrange(6,7);
1001  ?column? 
1002 ----------
1004 (1 row)
1006 SELECT nummultirange(numrange(1,5), numrange(6,9)) @> numrange(6,7);
1007  ?column? 
1008 ----------
1010 (1 row)
1012 SELECT '{[1,5)}'::nummultirange @> '{[1,5)}';
1013  ?column? 
1014 ----------
1016 (1 row)
1018 SELECT '{[-4,-2), [1,5)}'::nummultirange @> '{[1,5)}';
1019  ?column? 
1020 ----------
1022 (1 row)
1024 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[1,5)}';
1025  ?column? 
1026 ----------
1028 (1 row)
1030 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[6,7)}';
1031  ?column? 
1032 ----------
1034 (1 row)
1036 SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}';
1037  ?column? 
1038 ----------
1040 (1 row)
1042 select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange;
1043  ?column? 
1044 ----------
1046 (1 row)
1048 SELECT numrange(null,null) @> nummultirange(numrange(1,2));
1049  ?column? 
1050 ----------
1052 (1 row)
1054 SELECT numrange(null,null) @> nummultirange(numrange(null,2));
1055  ?column? 
1056 ----------
1058 (1 row)
1060 SELECT numrange(null,null) @> nummultirange(numrange(2,null));
1061  ?column? 
1062 ----------
1064 (1 row)
1066 SELECT numrange(null,5) @> nummultirange(numrange(null,3));
1067  ?column? 
1068 ----------
1070 (1 row)
1072 SELECT numrange(null,5) @> nummultirange(numrange(null,8));
1073  ?column? 
1074 ----------
1076 (1 row)
1078 SELECT numrange(5,null) @> nummultirange(numrange(8,null));
1079  ?column? 
1080 ----------
1082 (1 row)
1084 SELECT numrange(5,null) @> nummultirange(numrange(3,null));
1085  ?column? 
1086 ----------
1088 (1 row)
1090 SELECT numrange(1,5) @> nummultirange(numrange(8,9));
1091  ?column? 
1092 ----------
1094 (1 row)
1096 SELECT numrange(1,5) @> nummultirange(numrange(3,9));
1097  ?column? 
1098 ----------
1100 (1 row)
1102 SELECT numrange(1,5) @> nummultirange(numrange(1,4));
1103  ?column? 
1104 ----------
1106 (1 row)
1108 SELECT numrange(1,5) @> nummultirange(numrange(1,5));
1109  ?column? 
1110 ----------
1112 (1 row)
1114 SELECT numrange(1,9) @> nummultirange(numrange(-4,-2), numrange(1,5));
1115  ?column? 
1116 ----------
1118 (1 row)
1120 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(8,9));
1121  ?column? 
1122 ----------
1124 (1 row)
1126 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,9));
1127  ?column? 
1128 ----------
1130 (1 row)
1132 SELECT numrange(1,9) @> nummultirange(numrange(1,5), numrange(6,10));
1133  ?column? 
1134 ----------
1136 (1 row)
1138 SELECT '{[1,9)}' @> '{[1,5)}'::nummultirange;
1139  ?column? 
1140 ----------
1142 (1 row)
1144 SELECT '{[1,9)}' @> '{[-4,-2), [1,5)}'::nummultirange;
1145  ?column? 
1146 ----------
1148 (1 row)
1150 SELECT '{[1,9)}' @> '{[1,5), [8,9)}'::nummultirange;
1151  ?column? 
1152 ----------
1154 (1 row)
1156 SELECT '{[1,9)}' @> '{[1,5), [6,9)}'::nummultirange;
1157  ?column? 
1158 ----------
1160 (1 row)
1162 SELECT '{[1,9)}' @> '{[1,5), [6,10)}'::nummultirange;
1163  ?column? 
1164 ----------
1166 (1 row)
1168 -- is contained by
1169 SELECT nummultirange() <@ nummultirange();
1170  ?column? 
1171 ----------
1173 (1 row)
1175 SELECT 'empty'::numrange <@ nummultirange();
1176  ?column? 
1177 ----------
1179 (1 row)
1181 SELECT numrange(1,2) <@ nummultirange(numrange(null,null));
1182  ?column? 
1183 ----------
1185 (1 row)
1187 SELECT numrange(null,2) <@ nummultirange(numrange(null,null));
1188  ?column? 
1189 ----------
1191 (1 row)
1193 SELECT numrange(2,null) <@ nummultirange(numrange(null,null));
1194  ?column? 
1195 ----------
1197 (1 row)
1199 SELECT numrange(null,3) <@ nummultirange(numrange(null,5));
1200  ?column? 
1201 ----------
1203 (1 row)
1205 SELECT numrange(null,8) <@ nummultirange(numrange(null,5));
1206  ?column? 
1207 ----------
1209 (1 row)
1211 SELECT numrange(8,null) <@ nummultirange(numrange(5,null));
1212  ?column? 
1213 ----------
1215 (1 row)
1217 SELECT numrange(3,null) <@ nummultirange(numrange(5,null));
1218  ?column? 
1219 ----------
1221 (1 row)
1223 SELECT numrange(8,9) <@ nummultirange(numrange(1,5));
1224  ?column? 
1225 ----------
1227 (1 row)
1229 SELECT numrange(3,9) <@ nummultirange(numrange(1,5));
1230  ?column? 
1231 ----------
1233 (1 row)
1235 SELECT numrange(1,4) <@ nummultirange(numrange(1,5));
1236  ?column? 
1237 ----------
1239 (1 row)
1241 SELECT numrange(1,5) <@ nummultirange(numrange(1,5));
1242  ?column? 
1243 ----------
1245 (1 row)
1247 SELECT numrange(1,5) <@ nummultirange(numrange(-4,-2), numrange(1,5));
1248  ?column? 
1249 ----------
1251 (1 row)
1253 SELECT numrange(1,5) <@ nummultirange(numrange(1,5), numrange(8,9));
1254  ?column? 
1255 ----------
1257 (1 row)
1259 SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(8,9));
1260  ?column? 
1261 ----------
1263 (1 row)
1265 SELECT numrange(6,7) <@ nummultirange(numrange(1,5), numrange(6,9));
1266  ?column? 
1267 ----------
1269 (1 row)
1271 SELECT '{[1,5)}' <@ '{[1,5)}'::nummultirange;
1272  ?column? 
1273 ----------
1275 (1 row)
1277 SELECT '{[1,5)}' <@ '{[-4,-2), [1,5)}'::nummultirange;
1278  ?column? 
1279 ----------
1281 (1 row)
1283 SELECT '{[1,5)}' <@ '{[1,5), [8,9)}'::nummultirange;
1284  ?column? 
1285 ----------
1287 (1 row)
1289 SELECT '{[6,7)}' <@ '{[1,5), [8,9)}'::nummultirange;
1290  ?column? 
1291 ----------
1293 (1 row)
1295 SELECT '{[6,7)}' <@ '{[1,5), [6,9)}'::nummultirange;
1296  ?column? 
1297 ----------
1299 (1 row)
1301 SELECT nummultirange(numrange(1,2)) <@ numrange(null,null);
1302  ?column? 
1303 ----------
1305 (1 row)
1307 SELECT nummultirange(numrange(null,2)) <@ numrange(null,null);
1308  ?column? 
1309 ----------
1311 (1 row)
1313 SELECT nummultirange(numrange(2,null)) <@ numrange(null,null);
1314  ?column? 
1315 ----------
1317 (1 row)
1319 SELECT nummultirange(numrange(null,3)) <@ numrange(null,5);
1320  ?column? 
1321 ----------
1323 (1 row)
1325 SELECT nummultirange(numrange(null,8)) <@ numrange(null,5);
1326  ?column? 
1327 ----------
1329 (1 row)
1331 SELECT nummultirange(numrange(8,null)) <@ numrange(5,null);
1332  ?column? 
1333 ----------
1335 (1 row)
1337 SELECT nummultirange(numrange(3,null)) <@ numrange(5,null);
1338  ?column? 
1339 ----------
1341 (1 row)
1343 SELECT nummultirange(numrange(8,9)) <@ numrange(1,5);
1344  ?column? 
1345 ----------
1347 (1 row)
1349 SELECT nummultirange(numrange(3,9)) <@ numrange(1,5);
1350  ?column? 
1351 ----------
1353 (1 row)
1355 SELECT nummultirange(numrange(1,4)) <@ numrange(1,5);
1356  ?column? 
1357 ----------
1359 (1 row)
1361 SELECT nummultirange(numrange(1,5)) <@ numrange(1,5);
1362  ?column? 
1363 ----------
1365 (1 row)
1367 SELECT nummultirange(numrange(-4,-2), numrange(1,5)) <@ numrange(1,9);
1368  ?column? 
1369 ----------
1371 (1 row)
1373 SELECT nummultirange(numrange(1,5), numrange(8,9)) <@ numrange(1,9);
1374  ?column? 
1375 ----------
1377 (1 row)
1379 SELECT nummultirange(numrange(1,5), numrange(6,9)) <@ numrange(1,9);
1380  ?column? 
1381 ----------
1383 (1 row)
1385 SELECT nummultirange(numrange(1,5), numrange(6,10)) <@ numrange(1,9);
1386  ?column? 
1387 ----------
1389 (1 row)
1391 SELECT '{[1,5)}'::nummultirange <@ '{[1,9)}';
1392  ?column? 
1393 ----------
1395 (1 row)
1397 SELECT '{[-4,-2), [1,5)}'::nummultirange <@ '{[1,9)}';
1398  ?column? 
1399 ----------
1401 (1 row)
1403 SELECT '{[1,5), [8,9)}'::nummultirange <@ '{[1,9)}';
1404  ?column? 
1405 ----------
1407 (1 row)
1409 SELECT '{[1,5), [6,9)}'::nummultirange <@ '{[1,9)}';
1410  ?column? 
1411 ----------
1413 (1 row)
1415 SELECT '{[1,5), [6,10)}'::nummultirange <@ '{[1,9)}';
1416  ?column? 
1417 ----------
1419 (1 row)
1421 -- overleft
1422 SELECT 'empty'::numrange &< nummultirange();
1423  ?column? 
1424 ----------
1426 (1 row)
1428 SELECT 'empty'::numrange &< nummultirange(numrange(1,2));
1429  ?column? 
1430 ----------
1432 (1 row)
1434 SELECT nummultirange() &< 'empty'::numrange;
1435  ?column? 
1436 ----------
1438 (1 row)
1440 SELECT nummultirange(numrange(1,2)) &< 'empty'::numrange;
1441  ?column? 
1442 ----------
1444 (1 row)
1446 SELECT nummultirange() &< nummultirange();
1447  ?column? 
1448 ----------
1450 (1 row)
1452 SELECT nummultirange(numrange(1,2)) &< nummultirange();
1453  ?column? 
1454 ----------
1456 (1 row)
1458 SELECT nummultirange() &< nummultirange(numrange(1,2));
1459  ?column? 
1460 ----------
1462 (1 row)
1464 SELECT numrange(6,7) &< nummultirange(numrange(3,4));
1465  ?column? 
1466 ----------
1468 (1 row)
1470 SELECT numrange(1,2) &< nummultirange(numrange(3,4));
1471  ?column? 
1472 ----------
1474 (1 row)
1476 SELECT numrange(1,4) &< nummultirange(numrange(3,4));
1477  ?column? 
1478 ----------
1480 (1 row)
1482 SELECT numrange(1,6) &< nummultirange(numrange(3,4));
1483  ?column? 
1484 ----------
1486 (1 row)
1488 SELECT numrange(3.5,6) &< nummultirange(numrange(3,4));
1489  ?column? 
1490 ----------
1492 (1 row)
1494 SELECT nummultirange(numrange(6,7)) &< numrange(3,4);
1495  ?column? 
1496 ----------
1498 (1 row)
1500 SELECT nummultirange(numrange(1,2)) &< numrange(3,4);
1501  ?column? 
1502 ----------
1504 (1 row)
1506 SELECT nummultirange(numrange(1,4)) &< numrange(3,4);
1507  ?column? 
1508 ----------
1510 (1 row)
1512 SELECT nummultirange(numrange(1,6)) &< numrange(3,4);
1513  ?column? 
1514 ----------
1516 (1 row)
1518 SELECT nummultirange(numrange(3.5,6)) &< numrange(3,4);
1519  ?column? 
1520 ----------
1522 (1 row)
1524 SELECT nummultirange(numrange(6,7)) &< nummultirange(numrange(3,4));
1525  ?column? 
1526 ----------
1528 (1 row)
1530 SELECT nummultirange(numrange(1,2)) &< nummultirange(numrange(3,4));
1531  ?column? 
1532 ----------
1534 (1 row)
1536 SELECT nummultirange(numrange(1,4)) &< nummultirange(numrange(3,4));
1537  ?column? 
1538 ----------
1540 (1 row)
1542 SELECT nummultirange(numrange(1,6)) &< nummultirange(numrange(3,4));
1543  ?column? 
1544 ----------
1546 (1 row)
1548 SELECT nummultirange(numrange(3.5,6)) &< nummultirange(numrange(3,4));
1549  ?column? 
1550 ----------
1552 (1 row)
1554 -- overright
1555 SELECT nummultirange() &> 'empty'::numrange;
1556  ?column? 
1557 ----------
1559 (1 row)
1561 SELECT nummultirange(numrange(1,2)) &> 'empty'::numrange;
1562  ?column? 
1563 ----------
1565 (1 row)
1567 SELECT 'empty'::numrange &> nummultirange();
1568  ?column? 
1569 ----------
1571 (1 row)
1573 SELECT 'empty'::numrange &> nummultirange(numrange(1,2));
1574  ?column? 
1575 ----------
1577 (1 row)
1579 SELECT nummultirange() &> nummultirange();
1580  ?column? 
1581 ----------
1583 (1 row)
1585 SELECT nummultirange() &> nummultirange(numrange(1,2));
1586  ?column? 
1587 ----------
1589 (1 row)
1591 SELECT nummultirange(numrange(1,2)) &> nummultirange();
1592  ?column? 
1593 ----------
1595 (1 row)
1597 SELECT nummultirange(numrange(3,4)) &> numrange(6,7);
1598  ?column? 
1599 ----------
1601 (1 row)
1603 SELECT nummultirange(numrange(3,4)) &> numrange(1,2);
1604  ?column? 
1605 ----------
1607 (1 row)
1609 SELECT nummultirange(numrange(3,4)) &> numrange(1,4);
1610  ?column? 
1611 ----------
1613 (1 row)
1615 SELECT nummultirange(numrange(3,4)) &> numrange(1,6);
1616  ?column? 
1617 ----------
1619 (1 row)
1621 SELECT nummultirange(numrange(3,4)) &> numrange(3.5,6);
1622  ?column? 
1623 ----------
1625 (1 row)
1627 SELECT numrange(3,4) &> nummultirange(numrange(6,7));
1628  ?column? 
1629 ----------
1631 (1 row)
1633 SELECT numrange(3,4) &> nummultirange(numrange(1,2));
1634  ?column? 
1635 ----------
1637 (1 row)
1639 SELECT numrange(3,4) &> nummultirange(numrange(1,4));
1640  ?column? 
1641 ----------
1643 (1 row)
1645 SELECT numrange(3,4) &> nummultirange(numrange(1,6));
1646  ?column? 
1647 ----------
1649 (1 row)
1651 SELECT numrange(3,4) &> nummultirange(numrange(3.5,6));
1652  ?column? 
1653 ----------
1655 (1 row)
1657 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(6,7));
1658  ?column? 
1659 ----------
1661 (1 row)
1663 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,2));
1664  ?column? 
1665 ----------
1667 (1 row)
1669 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,4));
1670  ?column? 
1671 ----------
1673 (1 row)
1675 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(1,6));
1676  ?column? 
1677 ----------
1679 (1 row)
1681 SELECT nummultirange(numrange(3,4)) &> nummultirange(numrange(3.5,6));
1682  ?column? 
1683 ----------
1685 (1 row)
1687 -- meets
1688 SELECT 'empty'::numrange -|- nummultirange();
1689  ?column? 
1690 ----------
1692 (1 row)
1694 SELECT 'empty'::numrange -|- nummultirange(numrange(1,2));
1695  ?column? 
1696 ----------
1698 (1 row)
1700 SELECT nummultirange() -|- 'empty'::numrange;
1701  ?column? 
1702 ----------
1704 (1 row)
1706 SELECT nummultirange(numrange(1,2)) -|- 'empty'::numrange;
1707  ?column? 
1708 ----------
1710 (1 row)
1712 SELECT nummultirange() -|- nummultirange();
1713  ?column? 
1714 ----------
1716 (1 row)
1718 SELECT nummultirange(numrange(1,2)) -|- nummultirange();
1719  ?column? 
1720 ----------
1722 (1 row)
1724 SELECT nummultirange() -|- nummultirange(numrange(1,2));
1725  ?column? 
1726 ----------
1728 (1 row)
1730 SELECT numrange(1,2) -|- nummultirange(numrange(2,4));
1731  ?column? 
1732 ----------
1734 (1 row)
1736 SELECT numrange(1,2) -|- nummultirange(numrange(3,4));
1737  ?column? 
1738 ----------
1740 (1 row)
1742 SELECT nummultirange(numrange(1,2)) -|- numrange(2,4);
1743  ?column? 
1744 ----------
1746 (1 row)
1748 SELECT nummultirange(numrange(1,2)) -|- numrange(3,4);
1749  ?column? 
1750 ----------
1752 (1 row)
1754 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4));
1755  ?column? 
1756 ----------
1758 (1 row)
1760 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(3,4));
1761  ?column? 
1762 ----------
1764 (1 row)
1766 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(3,4));
1767  ?column? 
1768 ----------
1770 (1 row)
1772 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(6,7));
1773  ?column? 
1774 ----------
1776 (1 row)
1778 SELECT nummultirange(numrange(1,2), numrange(5,6)) -|- nummultirange(numrange(8,9));
1779  ?column? 
1780 ----------
1782 (1 row)
1784 SELECT nummultirange(numrange(1,2)) -|- nummultirange(numrange(2,4), numrange(6,7));
1785  ?column? 
1786 ----------
1788 (1 row)
1790 -- strictly left
1791 select 'empty'::numrange << nummultirange();
1792  ?column? 
1793 ----------
1795 (1 row)
1797 select numrange(1,2) << nummultirange();
1798  ?column? 
1799 ----------
1801 (1 row)
1803 select numrange(1,2) << nummultirange(numrange(3,4));
1804  ?column? 
1805 ----------
1807 (1 row)
1809 select numrange(1,2) << nummultirange(numrange(0,4));
1810  ?column? 
1811 ----------
1813 (1 row)
1815 select numrange(1,2) << nummultirange(numrange(0,4), numrange(7,8));
1816  ?column? 
1817 ----------
1819 (1 row)
1821 select nummultirange() << 'empty'::numrange;
1822  ?column? 
1823 ----------
1825 (1 row)
1827 select nummultirange() << numrange(1,2);
1828  ?column? 
1829 ----------
1831 (1 row)
1833 select nummultirange(numrange(3,4)) << numrange(3,6);
1834  ?column? 
1835 ----------
1837 (1 row)
1839 select nummultirange(numrange(0,2)) << numrange(3,6);
1840  ?column? 
1841 ----------
1843 (1 row)
1845 select nummultirange(numrange(0,2), numrange(7,8)) << numrange(3,6);
1846  ?column? 
1847 ----------
1849 (1 row)
1851 select nummultirange(numrange(-4,-2), numrange(0,2)) << numrange(3,6);
1852  ?column? 
1853 ----------
1855 (1 row)
1857 select nummultirange() << nummultirange();
1858  ?column? 
1859 ----------
1861 (1 row)
1863 select nummultirange() << nummultirange(numrange(1,2));
1864  ?column? 
1865 ----------
1867 (1 row)
1869 select nummultirange(numrange(1,2)) << nummultirange();
1870  ?column? 
1871 ----------
1873 (1 row)
1875 select nummultirange(numrange(1,2)) << nummultirange(numrange(1,2));
1876  ?column? 
1877 ----------
1879 (1 row)
1881 select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4));
1882  ?column? 
1883 ----------
1885 (1 row)
1887 select nummultirange(numrange(1,2)) << nummultirange(numrange(3,4), numrange(7,8));
1888  ?column? 
1889 ----------
1891 (1 row)
1893 select nummultirange(numrange(1,2), numrange(4,5)) << nummultirange(numrange(3,4), numrange(7,8));
1894  ?column? 
1895 ----------
1897 (1 row)
1899 -- strictly right
1900 select nummultirange() >> 'empty'::numrange;
1901  ?column? 
1902 ----------
1904 (1 row)
1906 select nummultirange() >> numrange(1,2);
1907  ?column? 
1908 ----------
1910 (1 row)
1912 select nummultirange(numrange(3,4)) >> numrange(1,2);
1913  ?column? 
1914 ----------
1916 (1 row)
1918 select nummultirange(numrange(0,4)) >> numrange(1,2);
1919  ?column? 
1920 ----------
1922 (1 row)
1924 select nummultirange(numrange(0,4), numrange(7,8)) >> numrange(1,2);
1925  ?column? 
1926 ----------
1928 (1 row)
1930 select 'empty'::numrange >> nummultirange();
1931  ?column? 
1932 ----------
1934 (1 row)
1936 select numrange(1,2) >> nummultirange();
1937  ?column? 
1938 ----------
1940 (1 row)
1942 select numrange(3,6) >> nummultirange(numrange(3,4));
1943  ?column? 
1944 ----------
1946 (1 row)
1948 select numrange(3,6) >> nummultirange(numrange(0,2));
1949  ?column? 
1950 ----------
1952 (1 row)
1954 select numrange(3,6) >> nummultirange(numrange(0,2), numrange(7,8));
1955  ?column? 
1956 ----------
1958 (1 row)
1960 select numrange(3,6) >> nummultirange(numrange(-4,-2), numrange(0,2));
1961  ?column? 
1962 ----------
1964 (1 row)
1966 select nummultirange() >> nummultirange();
1967  ?column? 
1968 ----------
1970 (1 row)
1972 select nummultirange(numrange(1,2)) >> nummultirange();
1973  ?column? 
1974 ----------
1976 (1 row)
1978 select nummultirange() >> nummultirange(numrange(1,2));
1979  ?column? 
1980 ----------
1982 (1 row)
1984 select nummultirange(numrange(1,2)) >> nummultirange(numrange(1,2));
1985  ?column? 
1986 ----------
1988 (1 row)
1990 select nummultirange(numrange(3,4)) >> nummultirange(numrange(1,2));
1991  ?column? 
1992 ----------
1994 (1 row)
1996 select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2));
1997  ?column? 
1998 ----------
2000 (1 row)
2002 select nummultirange(numrange(3,4), numrange(7,8)) >> nummultirange(numrange(1,2), numrange(4,5));
2003  ?column? 
2004 ----------
2006 (1 row)
2008 -- union
2009 SELECT nummultirange() + nummultirange();
2010  ?column? 
2011 ----------
2012  {}
2013 (1 row)
2015 SELECT nummultirange() + nummultirange(numrange(1,2));
2016  ?column? 
2017 ----------
2018  {[1,2)}
2019 (1 row)
2021 SELECT nummultirange(numrange(1,2)) + nummultirange();
2022  ?column? 
2023 ----------
2024  {[1,2)}
2025 (1 row)
2027 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(1,2));
2028  ?column? 
2029 ----------
2030  {[1,2)}
2031 (1 row)
2033 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(2,4));
2034  ?column? 
2035 ----------
2036  {[1,4)}
2037 (1 row)
2039 SELECT nummultirange(numrange(1,2)) + nummultirange(numrange(3,4));
2040    ?column?    
2041 ---------------
2042  {[1,2),[3,4)}
2043 (1 row)
2045 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(2,4));
2046  ?column? 
2047 ----------
2048  {[1,5)}
2049 (1 row)
2051 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(3,4));
2052    ?column?    
2053 ---------------
2054  {[1,2),[3,5)}
2055 (1 row)
2057 SELECT nummultirange(numrange(1,2), numrange(4,5)) + nummultirange(numrange(0,9));
2058  ?column? 
2059 ----------
2060  {[0,9)}
2061 (1 row)
2063 -- merge
2064 SELECT range_merge(nummultirange());
2065  range_merge 
2066 -------------
2067  empty
2068 (1 row)
2070 SELECT range_merge(nummultirange(numrange(1,2)));
2071  range_merge 
2072 -------------
2073  [1,2)
2074 (1 row)
2076 SELECT range_merge(nummultirange(numrange(1,2), numrange(7,8)));
2077  range_merge 
2078 -------------
2079  [1,8)
2080 (1 row)
2082 -- minus
2083 SELECT nummultirange() - nummultirange();
2084  ?column? 
2085 ----------
2086  {}
2087 (1 row)
2089 SELECT nummultirange() - nummultirange(numrange(1,2));
2090  ?column? 
2091 ----------
2092  {}
2093 (1 row)
2095 SELECT nummultirange(numrange(1,2)) - nummultirange();
2096  ?column? 
2097 ----------
2098  {[1,2)}
2099 (1 row)
2101 SELECT nummultirange(numrange(1,2), numrange(3,4)) - nummultirange();
2102    ?column?    
2103 ---------------
2104  {[1,2),[3,4)}
2105 (1 row)
2107 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(1,2));
2108  ?column? 
2109 ----------
2110  {}
2111 (1 row)
2113 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(2,4));
2114  ?column? 
2115 ----------
2116  {[1,2)}
2117 (1 row)
2119 SELECT nummultirange(numrange(1,2)) - nummultirange(numrange(3,4));
2120  ?column? 
2121 ----------
2122  {[1,2)}
2123 (1 row)
2125 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(1,2));
2126  ?column? 
2127 ----------
2128  {[2,4)}
2129 (1 row)
2131 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(2,3));
2132    ?column?    
2133 ---------------
2134  {[1,2),[3,4)}
2135 (1 row)
2137 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,8));
2138  ?column? 
2139 ----------
2140  {}
2141 (1 row)
2143 SELECT nummultirange(numrange(1,4)) - nummultirange(numrange(0,2));
2144  ?column? 
2145 ----------
2146  {[2,4)}
2147 (1 row)
2149 SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(0,2), numrange(3,4));
2150    ?column?    
2151 ---------------
2152  {[2,3),[4,8)}
2153 (1 row)
2155 SELECT nummultirange(numrange(1,8)) - nummultirange(numrange(2,3), numrange(5,null));
2156    ?column?    
2157 ---------------
2158  {[1,2),[3,5)}
2159 (1 row)
2161 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0));
2162    ?column?    
2163 ---------------
2164  {[1,2),[4,5)}
2165 (1 row)
2167 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(2,4));
2168    ?column?    
2169 ---------------
2170  {[1,2),[4,5)}
2171 (1 row)
2173 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(3,5));
2174  ?column? 
2175 ----------
2176  {[1,2)}
2177 (1 row)
2179 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(0,9));
2180  ?column? 
2181 ----------
2182  {}
2183 (1 row)
2185 SELECT nummultirange(numrange(1,3), numrange(4,5)) - nummultirange(numrange(2,9));
2186  ?column? 
2187 ----------
2188  {[1,2)}
2189 (1 row)
2191 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(8,9));
2192    ?column?    
2193 ---------------
2194  {[1,2),[4,5)}
2195 (1 row)
2197 SELECT nummultirange(numrange(1,2), numrange(4,5)) - nummultirange(numrange(-2,0), numrange(8,9));
2198    ?column?    
2199 ---------------
2200  {[1,2),[4,5)}
2201 (1 row)
2203 -- intersection
2204 SELECT nummultirange() * nummultirange();
2205  ?column? 
2206 ----------
2207  {}
2208 (1 row)
2210 SELECT nummultirange() * nummultirange(numrange(1,2));
2211  ?column? 
2212 ----------
2213  {}
2214 (1 row)
2216 SELECT nummultirange(numrange(1,2)) * nummultirange();
2217  ?column? 
2218 ----------
2219  {}
2220 (1 row)
2222 SELECT '{[1,3)}'::nummultirange * '{[1,5)}'::nummultirange;
2223  ?column? 
2224 ----------
2225  {[1,3)}
2226 (1 row)
2228 SELECT '{[1,3)}'::nummultirange * '{[0,5)}'::nummultirange;
2229  ?column? 
2230 ----------
2231  {[1,3)}
2232 (1 row)
2234 SELECT '{[1,3)}'::nummultirange * '{[0,2)}'::nummultirange;
2235  ?column? 
2236 ----------
2237  {[1,2)}
2238 (1 row)
2240 SELECT '{[1,3)}'::nummultirange * '{[2,5)}'::nummultirange;
2241  ?column? 
2242 ----------
2243  {[2,3)}
2244 (1 row)
2246 SELECT '{[1,4)}'::nummultirange * '{[2,3)}'::nummultirange;
2247  ?column? 
2248 ----------
2249  {[2,3)}
2250 (1 row)
2252 SELECT '{[1,4)}'::nummultirange * '{[0,2), [3,5)}'::nummultirange;
2253    ?column?    
2254 ---------------
2255  {[1,2),[3,4)}
2256 (1 row)
2258 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,8), [9,12)}'::nummultirange;
2259        ?column?       
2260 ----------------------
2261  {[1,4),[7,8),[9,10)}
2262 (1 row)
2264 SELECT '{[1,4), [7,10)}'::nummultirange * '{[9,12)}'::nummultirange;
2265  ?column? 
2266 ----------
2267  {[9,10)}
2268 (1 row)
2270 SELECT '{[1,4), [7,10)}'::nummultirange * '{[-5,-4), [5,6), [9,12)}'::nummultirange;
2271  ?column? 
2272 ----------
2273  {[9,10)}
2274 (1 row)
2276 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange;
2277           ?column?          
2278 ----------------------------
2279  {[1,2),[3,4),[7,8),[9,10)}
2280 (1 row)
2282 SELECT '{[1,4), [7,10)}'::nummultirange * '{[0,2), [3,8), [9,12)}'::nummultirange;
2283           ?column?          
2284 ----------------------------
2285  {[1,2),[3,4),[7,8),[9,10)}
2286 (1 row)
2288 -- test GiST index
2289 create table test_multirange_gist(mr int4multirange);
2290 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;
2291 insert into test_multirange_gist select '{}'::int4multirange from generate_series(1,500) g;
2292 insert into test_multirange_gist select int4multirange(int4range(g, g+10000)) from generate_series(1,1000) g;
2293 insert into test_multirange_gist select int4multirange(int4range(NULL, g*10, '(]'), int4range(g*10, g*20, '(]')) from generate_series(1,100) g;
2294 insert into test_multirange_gist select int4multirange(int4range(g*10, g*20, '(]'), int4range(g*20, NULL, '(]')) from generate_series(1,100) g;
2295 create index test_mulrirange_gist_idx on test_multirange_gist using gist (mr);
2296 -- test statistics and selectivity estimation as well
2298 -- We don't check the accuracy of selectivity estimation, but at least check
2299 -- it doesn't fall.
2300 analyze test_multirange_gist;
2301 -- first, verify non-indexed results
2302 SET enable_seqscan    = t;
2303 SET enable_indexscan  = f;
2304 SET enable_bitmapscan = f;
2305 select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
2306  count 
2307 -------
2308    500
2309 (1 row)
2311 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2312  count 
2313 -------
2314   3700
2315 (1 row)
2317 select count(*) from test_multirange_gist where mr && 'empty'::int4range;
2318  count 
2319 -------
2320      0
2321 (1 row)
2323 select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
2324  count 
2325 -------
2326    500
2327 (1 row)
2329 select count(*) from test_multirange_gist where mr << 'empty'::int4range;
2330  count 
2331 -------
2332      0
2333 (1 row)
2335 select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
2336  count 
2337 -------
2338      0
2339 (1 row)
2341 select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
2342  count 
2343 -------
2344      0
2345 (1 row)
2347 select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
2348  count 
2349 -------
2350      0
2351 (1 row)
2353 select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
2354  count 
2355 -------
2356      0
2357 (1 row)
2359 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2360  count 
2361 -------
2362   3700
2363 (1 row)
2365 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2366  count 
2367 -------
2368   3700
2369 (1 row)
2371 select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
2372  count 
2373 -------
2374      0
2375 (1 row)
2377 select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
2378  count 
2379 -------
2380    500
2381 (1 row)
2383 select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
2384  count 
2385 -------
2386      0
2387 (1 row)
2389 select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
2390  count 
2391 -------
2392      0
2393 (1 row)
2395 select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
2396  count 
2397 -------
2398      0
2399 (1 row)
2401 select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
2402  count 
2403 -------
2404      0
2405 (1 row)
2407 select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
2408  count 
2409 -------
2410      0
2411 (1 row)
2413 select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
2414  count 
2415 -------
2416      1
2417 (1 row)
2419 select count(*) from test_multirange_gist where mr @> 10;
2420  count 
2421 -------
2422    120
2423 (1 row)
2425 select count(*) from test_multirange_gist where mr @> int4range(10,20);
2426  count 
2427 -------
2428    111
2429 (1 row)
2431 select count(*) from test_multirange_gist where mr && int4range(10,20);
2432  count 
2433 -------
2434    139
2435 (1 row)
2437 select count(*) from test_multirange_gist where mr <@ int4range(10,50);
2438  count 
2439 -------
2440    500
2441 (1 row)
2443 select count(*) from test_multirange_gist where mr << int4range(100,500);
2444  count 
2445 -------
2446     54
2447 (1 row)
2449 select count(*) from test_multirange_gist where mr >> int4range(100,500);
2450  count 
2451 -------
2452   2053
2453 (1 row)
2455 select count(*) from test_multirange_gist where mr &< int4range(100,500);
2456  count 
2457 -------
2458    474
2459 (1 row)
2461 select count(*) from test_multirange_gist where mr &> int4range(100,500);
2462  count 
2463 -------
2464   2893
2465 (1 row)
2467 select count(*) from test_multirange_gist where mr -|- int4range(100,500);
2468  count 
2469 -------
2470      3
2471 (1 row)
2473 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2474  count 
2475 -------
2476   3700
2477 (1 row)
2479 select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40));
2480  count 
2481 -------
2482    110
2483 (1 row)
2485 select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange;
2486  count 
2487 -------
2488    218
2489 (1 row)
2491 select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
2492  count 
2493 -------
2494    500
2495 (1 row)
2497 select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500));
2498  count 
2499 -------
2500     54
2501 (1 row)
2503 select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500));
2504  count 
2505 -------
2506   2053
2507 (1 row)
2509 select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500));
2510  count 
2511 -------
2512    474
2513 (1 row)
2515 select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500));
2516  count 
2517 -------
2518   2893
2519 (1 row)
2521 select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500));
2522  count 
2523 -------
2524      3
2525 (1 row)
2527 -- now check same queries using index
2528 SET enable_seqscan    = f;
2529 SET enable_indexscan  = t;
2530 SET enable_bitmapscan = f;
2531 select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
2532  count 
2533 -------
2534    500
2535 (1 row)
2537 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2538  count 
2539 -------
2540   3700
2541 (1 row)
2543 select count(*) from test_multirange_gist where mr && 'empty'::int4range;
2544  count 
2545 -------
2546      0
2547 (1 row)
2549 select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
2550  count 
2551 -------
2552    500
2553 (1 row)
2555 select count(*) from test_multirange_gist where mr << 'empty'::int4range;
2556  count 
2557 -------
2558      0
2559 (1 row)
2561 select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
2562  count 
2563 -------
2564      0
2565 (1 row)
2567 select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
2568  count 
2569 -------
2570      0
2571 (1 row)
2573 select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
2574  count 
2575 -------
2576      0
2577 (1 row)
2579 select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
2580  count 
2581 -------
2582      0
2583 (1 row)
2585 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2586  count 
2587 -------
2588   3700
2589 (1 row)
2591 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2592  count 
2593 -------
2594   3700
2595 (1 row)
2597 select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
2598  count 
2599 -------
2600      0
2601 (1 row)
2603 select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
2604  count 
2605 -------
2606    500
2607 (1 row)
2609 select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
2610  count 
2611 -------
2612      0
2613 (1 row)
2615 select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
2616  count 
2617 -------
2618      0
2619 (1 row)
2621 select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
2622  count 
2623 -------
2624      0
2625 (1 row)
2627 select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
2628  count 
2629 -------
2630      0
2631 (1 row)
2633 select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
2634  count 
2635 -------
2636      0
2637 (1 row)
2639 select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
2640  count 
2641 -------
2642   3700
2643 (1 row)
2645 select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
2646  count 
2647 -------
2648      1
2649 (1 row)
2651 select count(*) from test_multirange_gist where mr @> 10;
2652  count 
2653 -------
2654    120
2655 (1 row)
2657 select count(*) from test_multirange_gist where mr @> int4range(10,20);
2658  count 
2659 -------
2660    111
2661 (1 row)
2663 select count(*) from test_multirange_gist where mr && int4range(10,20);
2664  count 
2665 -------
2666    139
2667 (1 row)
2669 select count(*) from test_multirange_gist where mr <@ int4range(10,50);
2670  count 
2671 -------
2672    500
2673 (1 row)
2675 select count(*) from test_multirange_gist where mr << int4range(100,500);
2676  count 
2677 -------
2678     54
2679 (1 row)
2681 select count(*) from test_multirange_gist where mr >> int4range(100,500);
2682  count 
2683 -------
2684   2053
2685 (1 row)
2687 select count(*) from test_multirange_gist where mr &< int4range(100,500);
2688  count 
2689 -------
2690    474
2691 (1 row)
2693 select count(*) from test_multirange_gist where mr &> int4range(100,500);
2694  count 
2695 -------
2696   2893
2697 (1 row)
2699 select count(*) from test_multirange_gist where mr -|- int4range(100,500);
2700  count 
2701 -------
2702      3
2703 (1 row)
2705 select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
2706  count 
2707 -------
2708   3700
2709 (1 row)
2711 select count(*) from test_multirange_gist where mr @> int4multirange(int4range(10,20), int4range(30,40));
2712  count 
2713 -------
2714    110
2715 (1 row)
2717 select count(*) from test_multirange_gist where mr && '{(10,20),(30,40),(50,60)}'::int4multirange;
2718  count 
2719 -------
2720    218
2721 (1 row)
2723 select count(*) from test_multirange_gist where mr <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
2724  count 
2725 -------
2726    500
2727 (1 row)
2729 select count(*) from test_multirange_gist where mr << int4multirange(int4range(100,200), int4range(400,500));
2730  count 
2731 -------
2732     54
2733 (1 row)
2735 select count(*) from test_multirange_gist where mr >> int4multirange(int4range(100,200), int4range(400,500));
2736  count 
2737 -------
2738   2053
2739 (1 row)
2741 select count(*) from test_multirange_gist where mr &< int4multirange(int4range(100,200), int4range(400,500));
2742  count 
2743 -------
2744    474
2745 (1 row)
2747 select count(*) from test_multirange_gist where mr &> int4multirange(int4range(100,200), int4range(400,500));
2748  count 
2749 -------
2750   2893
2751 (1 row)
2753 select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(100,200), int4range(400,500));
2754  count 
2755 -------
2756      3
2757 (1 row)
2759 drop table test_multirange_gist;
2761 -- range_agg function
2763 create table reservations ( room_id integer not null, booked_during daterange );
2764 insert into reservations values
2765 -- 1: has a meets and a gap
2766 (1, daterange('2018-07-01', '2018-07-07')),
2767 (1, daterange('2018-07-07', '2018-07-14')),
2768 (1, daterange('2018-07-20', '2018-07-22')),
2769 -- 2: just a single row
2770 (2, daterange('2018-07-01', '2018-07-03')),
2771 -- 3: one null range
2772 (3, NULL),
2773 -- 4: two null ranges
2774 (4, NULL),
2775 (4, NULL),
2776 -- 5: a null range and a non-null range
2777 (5, NULL),
2778 (5, daterange('2018-07-01', '2018-07-03')),
2779 -- 6: has overlap
2780 (6, daterange('2018-07-01', '2018-07-07')),
2781 (6, daterange('2018-07-05', '2018-07-10')),
2782 -- 7: two ranges that meet: no gap or overlap
2783 (7, daterange('2018-07-01', '2018-07-07')),
2784 (7, daterange('2018-07-07', '2018-07-14')),
2785 -- 8: an empty range
2786 (8, 'empty'::daterange)
2788 SELECT   room_id, range_agg(booked_during)
2789 FROM     reservations
2790 GROUP BY room_id
2791 ORDER BY room_id;
2792  room_id |                     range_agg                     
2793 ---------+---------------------------------------------------
2794        1 | {[07-01-2018,07-14-2018),[07-20-2018,07-22-2018)}
2795        2 | {[07-01-2018,07-03-2018)}
2796        3 | 
2797        4 | 
2798        5 | {[07-01-2018,07-03-2018)}
2799        6 | {[07-01-2018,07-10-2018)}
2800        7 | {[07-01-2018,07-14-2018)}
2801        8 | {}
2802 (8 rows)
2804 -- range_agg on a custom range type too
2805 SELECT  range_agg(r)
2806 FROM    (VALUES
2807           ('[a,c]'::textrange),
2808           ('[b,b]'::textrange),
2809           ('[c,f]'::textrange),
2810           ('[g,h)'::textrange),
2811           ('[h,j)'::textrange)
2812         ) t(r);
2813    range_agg   
2814 ---------------
2815  {[a,f],[g,j)}
2816 (1 row)
2818 -- range_agg with multirange inputs
2819 select range_agg(nmr) from nummultirange_test;
2820  range_agg 
2821 -----------
2822  {(,)}
2823 (1 row)
2825 select range_agg(nmr) from nummultirange_test where false;
2826  range_agg 
2827 -----------
2829 (1 row)
2831 select range_agg(null::nummultirange) from nummultirange_test;
2832  range_agg 
2833 -----------
2835 (1 row)
2837 select range_agg(nmr) from (values ('{}'::nummultirange)) t(nmr);
2838  range_agg 
2839 -----------
2840  {}
2841 (1 row)
2843 select range_agg(nmr) from (values ('{}'::nummultirange), ('{}'::nummultirange)) t(nmr);
2844  range_agg 
2845 -----------
2846  {}
2847 (1 row)
2849 select range_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr);
2850  range_agg 
2851 -----------
2852  {[1,2]}
2853 (1 row)
2855 select range_agg(nmr) from (values ('{[1,2], [5,6]}'::nummultirange)) t(nmr);
2856    range_agg   
2857 ---------------
2858  {[1,2],[5,6]}
2859 (1 row)
2861 select range_agg(nmr) from (values ('{[1,2], [2,3]}'::nummultirange)) t(nmr);
2862  range_agg 
2863 -----------
2864  {[1,3]}
2865 (1 row)
2867 select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[5,6]}'::nummultirange)) t(nmr);
2868    range_agg   
2869 ---------------
2870  {[1,2],[5,6]}
2871 (1 row)
2873 select range_agg(nmr) from (values ('{[1,2]}'::nummultirange), ('{[2,3]}'::nummultirange)) t(nmr);
2874  range_agg 
2875 -----------
2876  {[1,3]}
2877 (1 row)
2880 -- range_intersect_agg function
2882 select range_intersect_agg(nmr) from nummultirange_test;
2883  range_intersect_agg 
2884 ---------------------
2885  {}
2886 (1 row)
2888 select range_intersect_agg(nmr) from nummultirange_test where false;
2889  range_intersect_agg 
2890 ---------------------
2892 (1 row)
2894 select range_intersect_agg(null::nummultirange) from nummultirange_test;
2895  range_intersect_agg 
2896 ---------------------
2898 (1 row)
2900 select range_intersect_agg(nmr) from (values ('{[1,3]}'::nummultirange), ('{[6,12]}'::nummultirange)) t(nmr);
2901  range_intersect_agg 
2902 ---------------------
2903  {}
2904 (1 row)
2906 select range_intersect_agg(nmr) from (values ('{[1,6]}'::nummultirange), ('{[3,12]}'::nummultirange)) t(nmr);
2907  range_intersect_agg 
2908 ---------------------
2909  {[3,6]}
2910 (1 row)
2912 select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange), ('{[4,14]}'::nummultirange)) t(nmr);
2913  range_intersect_agg 
2914 ---------------------
2915  {[4,6],[10,12]}
2916 (1 row)
2918 -- test with just one input:
2919 select range_intersect_agg(nmr) from (values ('{}'::nummultirange)) t(nmr);
2920  range_intersect_agg 
2921 ---------------------
2922  {}
2923 (1 row)
2925 select range_intersect_agg(nmr) from (values ('{[1,2]}'::nummultirange)) t(nmr);
2926  range_intersect_agg 
2927 ---------------------
2928  {[1,2]}
2929 (1 row)
2931 select range_intersect_agg(nmr) from (values ('{[1,6], [10,12]}'::nummultirange)) t(nmr);
2932  range_intersect_agg 
2933 ---------------------
2934  {[1,6],[10,12]}
2935 (1 row)
2937 select range_intersect_agg(nmr) from nummultirange_test where nmr @> 4.0;
2938  range_intersect_agg 
2939 ---------------------
2940  {[3,5)}
2941 (1 row)
2943 create table nummultirange_test2(nmr nummultirange);
2944 create index nummultirange_test2_hash_idx on nummultirange_test2 using hash (nmr);
2945 INSERT INTO nummultirange_test2 VALUES('{[, 5)}');
2946 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2)));
2947 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2)));
2948 INSERT INTO nummultirange_test2 VALUES(nummultirange(numrange(1.1, 2.2,'()')));
2949 INSERT INTO nummultirange_test2 VALUES('{}');
2950 select * from nummultirange_test2 where nmr = '{}';
2951  nmr 
2952 -----
2953  {}
2954 (1 row)
2956 select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.2));
2957      nmr     
2958 -------------
2959  {[1.1,2.2)}
2960  {[1.1,2.2)}
2961 (2 rows)
2963 select * from nummultirange_test2 where nmr = nummultirange(numrange(1.1, 2.3));
2964  nmr 
2965 -----
2966 (0 rows)
2968 set enable_nestloop=t;
2969 set enable_hashjoin=f;
2970 set enable_mergejoin=f;
2971 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
2972      nmr     
2973 -------------
2974  {}
2975  {}
2976  {}
2977  {}
2978  {(,5)}
2979  {[1.1,2.2)}
2980  {[1.1,2.2)}
2981 (7 rows)
2983 set enable_nestloop=f;
2984 set enable_hashjoin=t;
2985 set enable_mergejoin=f;
2986 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
2987      nmr     
2988 -------------
2989  {}
2990  {}
2991  {}
2992  {}
2993  {(,5)}
2994  {[1.1,2.2)}
2995  {[1.1,2.2)}
2996 (7 rows)
2998 set enable_nestloop=f;
2999 set enable_hashjoin=f;
3000 set enable_mergejoin=t;
3001 select * from nummultirange_test natural join nummultirange_test2 order by nmr;
3002      nmr     
3003 -------------
3004  {}
3005  {}
3006  {}
3007  {}
3008  {(,5)}
3009  {[1.1,2.2)}
3010  {[1.1,2.2)}
3011 (7 rows)
3013 set enable_nestloop to default;
3014 set enable_hashjoin to default;
3015 set enable_mergejoin to default;
3016 DROP TABLE nummultirange_test2;
3018 -- Test user-defined multirange of floats
3020 select '{[123.001, 5.e9)}'::float8multirange @> 888.882::float8;
3021  ?column? 
3022 ----------
3024 (1 row)
3026 create table float8multirange_test(f8mr float8multirange, i int);
3027 insert into float8multirange_test values(float8multirange(float8range(-100.00007, '1.111113e9')), 42);
3028 select * from float8multirange_test;
3029            f8mr            | i  
3030 ---------------------------+----
3031  {[-100.00007,1111113000)} | 42
3032 (1 row)
3034 drop table float8multirange_test;
3036 -- Test multirange types over domains
3038 create domain mydomain as int4;
3039 create type mydomainrange as range(subtype=mydomain);
3040 select '{[4,50)}'::mydomainmultirange @> 7::mydomain;
3041  ?column? 
3042 ----------
3044 (1 row)
3046 drop domain mydomain cascade;
3047 NOTICE:  drop cascades to type mydomainrange
3049 -- Test domains over multirange types
3051 create domain restrictedmultirange as int4multirange check (upper(value) < 10);
3052 select '{[4,5)}'::restrictedmultirange @> 7;
3053  ?column? 
3054 ----------
3056 (1 row)
3058 select '{[4,50)}'::restrictedmultirange @> 7; -- should fail
3059 ERROR:  value for domain restrictedmultirange violates check constraint "restrictedmultirange_check"
3060 drop domain restrictedmultirange;
3062 -- Check automatic naming of multiranges
3064 create type intr as range(subtype=int);
3065 select intr_multirange(intr(1,10));
3066  intr_multirange 
3067 -----------------
3068  {[1,10)}
3069 (1 row)
3071 drop type intr;
3072 create type intmultirange as (x int, y int);
3073 create type intrange as range(subtype=int); -- should fail
3074 ERROR:  type "intmultirange" already exists
3075 DETAIL:  Failed while creating a multirange type for type "intrange".
3076 HINT:  You can manually specify a multirange type name using the "multirange_type_name" attribute.
3077 drop type intmultirange;
3078 create type intr_multirange as (x int, y int);
3079 create type intr as range(subtype=int); -- should fail
3080 ERROR:  type "intr_multirange" already exists
3081 DETAIL:  Failed while creating a multirange type for type "intr".
3082 HINT:  You can manually specify a multirange type name using the "multirange_type_name" attribute.
3083 drop type intr_multirange;
3085 -- Test multiple multirange types over the same subtype and manual naming of
3086 -- the multirange type.
3088 -- should fail
3089 create type textrange1 as range(subtype=text, multirange_type_name=int, collation="C");
3090 ERROR:  type "int4" already exists
3091 -- should pass
3092 create type textrange1 as range(subtype=text, multirange_type_name=multirange_of_text, collation="C");
3093 -- should pass, because existing _textrange1 is automatically renamed
3094 create type textrange2 as range(subtype=text, multirange_type_name=_textrange1, collation="C");
3095 select multirange_of_text(textrange2('a','Z'));  -- should fail
3096 ERROR:  function multirange_of_text(textrange2) does not exist
3097 LINE 1: select multirange_of_text(textrange2('a','Z'));
3098                ^
3099 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3100 select multirange_of_text(textrange1('a','Z')) @> 'b'::text;
3101 ERROR:  range lower bound must be less than or equal to range upper bound
3102 select unnest(multirange_of_text(textrange1('a','b'), textrange1('d','e')));
3103  unnest 
3104 --------
3105  [a,b)
3106  [d,e)
3107 (2 rows)
3109 select _textrange1(textrange2('a','z')) @> 'b'::text;
3110  ?column? 
3111 ----------
3113 (1 row)
3115 drop type textrange1;
3116 drop type textrange2;
3118 -- Multiranges don't have their own ownership or permissions.
3120 create type textrange1 as range(subtype=text, multirange_type_name=multitextrange1, collation="C");
3121 create role regress_multirange_owner;
3122 alter type multitextrange1 owner to regress_multirange_owner;  -- fail
3123 ERROR:  cannot alter multirange type multitextrange1
3124 HINT:  You can alter type textrange1, which will alter the multirange type as well.
3125 alter type textrange1 owner to regress_multirange_owner;
3126 set role regress_multirange_owner;
3127 revoke usage on type multitextrange1 from public;  -- fail
3128 ERROR:  cannot set privileges of multirange types
3129 HINT:  Set the privileges of the range type instead.
3130 revoke usage on type textrange1 from public;
3131 \dT+ *textrange1*
3132                                                                      List of data types
3133  Schema |      Name       |  Internal name  | Size | Elements |          Owner           |                  Access privileges                  | Description 
3134 --------+-----------------+-----------------+------+----------+--------------------------+-----------------------------------------------------+-------------
3135  public | multitextrange1 | multitextrange1 | var  |          | regress_multirange_owner |                                                     | 
3136  public | textrange1      | textrange1      | var  |          | regress_multirange_owner | regress_multirange_owner=U/regress_multirange_owner | 
3137 (2 rows)
3139 create temp table test1(f1 multitextrange1[]);
3140 revoke usage on type textrange1 from regress_multirange_owner;
3141 create temp table test2(f1 multitextrange1[]);  -- fail
3142 ERROR:  permission denied for type multitextrange1
3143 drop table test1;
3144 drop type textrange1;
3145 reset role;
3146 drop role regress_multirange_owner;
3148 -- Test polymorphic type system
3150 create function anyarray_anymultirange_func(a anyarray, r anymultirange)
3151   returns anyelement as 'select $1[1] + lower($2);' language sql;
3152 select anyarray_anymultirange_func(ARRAY[1,2], int4multirange(int4range(10,20)));
3153  anyarray_anymultirange_func 
3154 -----------------------------
3155                           11
3156 (1 row)
3158 -- should fail
3159 select anyarray_anymultirange_func(ARRAY[1,2], nummultirange(numrange(10,20)));
3160 ERROR:  function anyarray_anymultirange_func(integer[], nummultirange) does not exist
3161 LINE 1: select anyarray_anymultirange_func(ARRAY[1,2], nummultirange...
3162                ^
3163 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3164 drop function anyarray_anymultirange_func(anyarray, anymultirange);
3165 -- should fail
3166 create function bogus_func(anyelement)
3167   returns anymultirange as 'select int4multirange(int4range(1,10))' language sql;
3168 ERROR:  cannot determine result data type
3169 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3170 -- should fail
3171 create function bogus_func(int)
3172   returns anymultirange as 'select int4multirange(int4range(1,10))' language sql;
3173 ERROR:  cannot determine result data type
3174 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3175 create function range_add_bounds(anymultirange)
3176   returns anyelement as 'select lower($1) + upper($1)' language sql;
3177 select range_add_bounds(int4multirange(int4range(1, 17)));
3178  range_add_bounds 
3179 ------------------
3180                18
3181 (1 row)
3183 select range_add_bounds(nummultirange(numrange(1.0001, 123.123)));
3184  range_add_bounds 
3185 ------------------
3186          124.1231
3187 (1 row)
3189 create function multirangetypes_sql(q anymultirange, b anyarray, out c anyelement)
3190   as $$ select upper($1) + $2[1] $$
3191   language sql;
3192 select multirangetypes_sql(int4multirange(int4range(1,10)), ARRAY[2,20]);
3193  multirangetypes_sql 
3194 ---------------------
3195                   12
3196 (1 row)
3198 select multirangetypes_sql(nummultirange(numrange(1,10)), ARRAY[2,20]);  -- match failure
3199 ERROR:  function multirangetypes_sql(nummultirange, integer[]) does not exist
3200 LINE 1: select multirangetypes_sql(nummultirange(numrange(1,10)), AR...
3201                ^
3202 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3203 create function anycompatiblearray_anycompatiblemultirange_func(a anycompatiblearray, mr anycompatiblemultirange)
3204   returns anycompatible as 'select $1[1] + lower($2);' language sql;
3205 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(int4range(10,20)));
3206  anycompatiblearray_anycompatiblemultirange_func 
3207 -------------------------------------------------
3208                                               11
3209 (1 row)
3211 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1,2], multirange(numrange(10,20)));
3212  anycompatiblearray_anycompatiblemultirange_func 
3213 -------------------------------------------------
3214                                               11
3215 (1 row)
3217 -- should fail
3218 select anycompatiblearray_anycompatiblemultirange_func(ARRAY[1.1,2], multirange(int4range(10,20)));
3219 ERROR:  function anycompatiblearray_anycompatiblemultirange_func(numeric[], int4multirange) does not exist
3220 LINE 1: select anycompatiblearray_anycompatiblemultirange_func(ARRAY...
3221                ^
3222 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3223 drop function anycompatiblearray_anycompatiblemultirange_func(anycompatiblearray, anycompatiblemultirange);
3224 create function anycompatiblerange_anycompatiblemultirange_func(r anycompatiblerange, mr anycompatiblemultirange)
3225   returns anycompatible as 'select lower($1) + lower($2);' language sql;
3226 select anycompatiblerange_anycompatiblemultirange_func(int4range(1,2), multirange(int4range(10,20)));
3227  anycompatiblerange_anycompatiblemultirange_func 
3228 -------------------------------------------------
3229                                               11
3230 (1 row)
3232 -- should fail
3233 select anycompatiblerange_anycompatiblemultirange_func(numrange(1,2), multirange(int4range(10,20)));
3234 ERROR:  function anycompatiblerange_anycompatiblemultirange_func(numrange, int4multirange) does not exist
3235 LINE 1: select anycompatiblerange_anycompatiblemultirange_func(numra...
3236                ^
3237 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
3238 drop function anycompatiblerange_anycompatiblemultirange_func(anycompatiblerange, anycompatiblemultirange);
3239 -- should fail
3240 create function bogus_func(anycompatible)
3241   returns anycompatiblerange as 'select int4range(1,10)' language sql;
3242 ERROR:  cannot determine result data type
3243 DETAIL:  A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange.
3245 -- Arrays of multiranges
3247 select ARRAY[nummultirange(numrange(1.1, 1.2)), nummultirange(numrange(12.3, 155.5))];
3248               array               
3249 ----------------------------------
3250  {"{[1.1,1.2)}","{[12.3,155.5)}"}
3251 (1 row)
3253 create table i8mr_array (f1 int, f2 int8multirange[]);
3254 insert into i8mr_array values (42, array[int8multirange(int8range(1,10)), int8multirange(int8range(2,20))]);
3255 select * from i8mr_array;
3256  f1 |           f2            
3257 ----+-------------------------
3258  42 | {"{[1,10)}","{[2,20)}"}
3259 (1 row)
3261 drop table i8mr_array;
3263 -- Multiranges of arrays
3265 select arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1]));
3266    arraymultirange   
3267 ---------------------
3268  {["{1,2}","{2,1}")}
3269 (1 row)
3271 select arraymultirange(arrayrange(ARRAY[2,1], ARRAY[1,2]));  -- fail
3272 ERROR:  range lower bound must be less than or equal to range upper bound
3273 select array[1,1] <@ arraymultirange(arrayrange(array[1,2], array[2,1]));
3274  ?column? 
3275 ----------
3277 (1 row)
3279 select array[1,3] <@ arraymultirange(arrayrange(array[1,2], array[2,1]));
3280  ?column? 
3281 ----------
3283 (1 row)
3286 -- Ranges of composites
3288 create type two_ints as (a int, b int);
3289 create type two_ints_range as range (subtype = two_ints);
3290 -- with debug_parallel_query on, this exercises tqueue.c's range remapping
3291 select *, row_to_json(upper(t)) as u from
3292   (values (two_ints_multirange(two_ints_range(row(1,2), row(3,4)))),
3293           (two_ints_multirange(two_ints_range(row(5,6), row(7,8))))) v(t);
3294           t          |       u       
3295 ---------------------+---------------
3296  {["(1,2)","(3,4)")} | {"a":3,"b":4}
3297  {["(5,6)","(7,8)")} | {"a":7,"b":8}
3298 (2 rows)
3300 drop type two_ints cascade;
3301 NOTICE:  drop cascades to type two_ints_range
3303 -- Check behavior when subtype lacks a hash function
3305 set enable_sort = off;  -- try to make it pick a hash setop implementation
3306 select '{(01,10)}'::varbitmultirange except select '{(10,11)}'::varbitmultirange;
3307  varbitmultirange 
3308 ------------------
3309  {(01,10)}
3310 (1 row)
3312 reset enable_sort;
3314 -- OUT/INOUT/TABLE functions
3316 -- infer anymultirange from anymultirange
3317 create function mr_outparam_succeed(i anymultirange, out r anymultirange, out t text)
3318   as $$ select $1, 'foo'::text $$ language sql;
3319 select * from mr_outparam_succeed(int4multirange(int4range(1,2)));
3320     r    |  t  
3321 ---------+-----
3322  {[1,2)} | foo
3323 (1 row)
3325 -- infer anyarray from anymultirange
3326 create function mr_outparam_succeed2(i anymultirange, out r anyarray, out t text)
3327   as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql;
3328 select * from mr_outparam_succeed2(int4multirange(int4range(1,2)));
3329   r  |  t  
3330 -----+-----
3331  {2} | foo
3332 (1 row)
3334 -- infer anyrange from anymultirange
3335 create function mr_outparam_succeed3(i anymultirange, out r anyrange, out t text)
3336   as $$ select range_merge($1), 'foo'::text $$ language sql;
3337 select * from mr_outparam_succeed3(int4multirange(int4range(1,2)));
3338    r   |  t  
3339 -------+-----
3340  [1,2) | foo
3341 (1 row)
3343 -- infer anymultirange from anyrange
3344 create function mr_outparam_succeed4(i anyrange, out r anymultirange, out t text)
3345   as $$ select multirange($1), 'foo'::text $$ language sql;
3346 select * from mr_outparam_succeed4(int4range(1,2));
3347     r    |  t  
3348 ---------+-----
3349  {[1,2)} | foo
3350 (1 row)
3352 -- infer anyelement from anymultirange
3353 create function mr_inoutparam_succeed(out i anyelement, inout r anymultirange)
3354   as $$ select upper($1), $1 $$ language sql;
3355 select * from mr_inoutparam_succeed(int4multirange(int4range(1,2)));
3356  i |    r    
3357 ---+---------
3358  2 | {[1,2)}
3359 (1 row)
3361 -- infer anyelement+anymultirange from anyelement+anymultirange
3362 create function mr_table_succeed(i anyelement, r anymultirange) returns table(i anyelement, r anymultirange)
3363   as $$ select $1, $2 $$ language sql;
3364 select * from mr_table_succeed(123, int4multirange(int4range(1,11)));
3365   i  |    r     
3366 -----+----------
3367  123 | {[1,11)}
3368 (1 row)
3370 -- use anymultirange in plpgsql
3371 create function mr_polymorphic(i anyrange) returns anymultirange
3372   as $$ begin return multirange($1); end; $$ language plpgsql;
3373 select mr_polymorphic(int4range(1, 4));
3374  mr_polymorphic 
3375 ----------------
3376  {[1,4)}
3377 (1 row)
3379 -- should fail
3380 create function mr_outparam_fail(i anyelement, out r anymultirange, out t text)
3381   as $$ select '[1,10]', 'foo' $$ language sql;
3382 ERROR:  cannot determine result data type
3383 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3384 --should fail
3385 create function mr_inoutparam_fail(inout i anyelement, out r anymultirange)
3386   as $$ select $1, '[1,10]' $$ language sql;
3387 ERROR:  cannot determine result data type
3388 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.
3389 --should fail
3390 create function mr_table_fail(i anyelement) returns table(i anyelement, r anymultirange)
3391   as $$ select $1, '[1,10]' $$ language sql;
3392 ERROR:  cannot determine result data type
3393 DETAIL:  A result of type anymultirange requires at least one input of type anyrange or anymultirange.