Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / rangetypes.out
blobe6ca99d43dc9ac31cda8247dbed63b4e2097e47b
1 -- Tests for range data types.
2 create type textrange as range (subtype=text, collation="C");
3 --
4 -- test input parser
5 --
6 -- negative tests; should fail
7 select ''::textrange;
8 ERROR:  malformed range literal: ""
9 LINE 1: select ''::textrange;
10                ^
11 DETAIL:  Missing left parenthesis or bracket.
12 select '-[a,z)'::textrange;
13 ERROR:  malformed range literal: "-[a,z)"
14 LINE 1: select '-[a,z)'::textrange;
15                ^
16 DETAIL:  Missing left parenthesis or bracket.
17 select '[a,z) - '::textrange;
18 ERROR:  malformed range literal: "[a,z) - "
19 LINE 1: select '[a,z) - '::textrange;
20                ^
21 DETAIL:  Junk after right parenthesis or bracket.
22 select '(",a)'::textrange;
23 ERROR:  malformed range literal: "(",a)"
24 LINE 1: select '(",a)'::textrange;
25                ^
26 DETAIL:  Unexpected end of input.
27 select '(,,a)'::textrange;
28 ERROR:  malformed range literal: "(,,a)"
29 LINE 1: select '(,,a)'::textrange;
30                ^
31 DETAIL:  Too many commas.
32 select '(),a)'::textrange;
33 ERROR:  malformed range literal: "(),a)"
34 LINE 1: select '(),a)'::textrange;
35                ^
36 DETAIL:  Missing comma after lower bound.
37 select '(a,))'::textrange;
38 ERROR:  malformed range literal: "(a,))"
39 LINE 1: select '(a,))'::textrange;
40                ^
41 DETAIL:  Junk after right parenthesis or bracket.
42 select '(],a)'::textrange;
43 ERROR:  malformed range literal: "(],a)"
44 LINE 1: select '(],a)'::textrange;
45                ^
46 DETAIL:  Missing comma after lower bound.
47 select '(a,])'::textrange;
48 ERROR:  malformed range literal: "(a,])"
49 LINE 1: select '(a,])'::textrange;
50                ^
51 DETAIL:  Junk after right parenthesis or bracket.
52 select '[z,a]'::textrange;
53 ERROR:  range lower bound must be less than or equal to range upper bound
54 LINE 1: select '[z,a]'::textrange;
55                ^
56 -- should succeed
57 select '  empty  '::textrange;
58  textrange 
59 -----------
60  empty
61 (1 row)
63 select ' ( empty, empty )  '::textrange;
64       textrange       
65 ----------------------
66  (" empty"," empty ")
67 (1 row)
69 select ' ( " a " " a ", " z " " z " )  '::textrange;
70         textrange         
71 --------------------------
72  ("  a   a ","  z   z  ")
73 (1 row)
75 select '(,z)'::textrange;
76  textrange 
77 -----------
78  (,z)
79 (1 row)
81 select '(a,)'::textrange;
82  textrange 
83 -----------
84  (a,)
85 (1 row)
87 select '[,z]'::textrange;
88  textrange 
89 -----------
90  (,z]
91 (1 row)
93 select '[a,]'::textrange;
94  textrange 
95 -----------
96  [a,)
97 (1 row)
99 select '(,)'::textrange;
100  textrange 
101 -----------
102  (,)
103 (1 row)
105 select '[ , ]'::textrange;
106  textrange 
107 -----------
108  [" "," "]
109 (1 row)
111 select '["",""]'::textrange;
112  textrange 
113 -----------
114  ["",""]
115 (1 row)
117 select '[",",","]'::textrange;
118  textrange 
119 -----------
120  [",",","]
121 (1 row)
123 select '["\\","\\"]'::textrange;
124   textrange  
125 -------------
126  ["\\","\\"]
127 (1 row)
129 select '(\\,a)'::textrange;
130  textrange 
131 -----------
132  ("\\",a)
133 (1 row)
135 select '((,z)'::textrange;
136  textrange 
137 -----------
138  ("(",z)
139 (1 row)
141 select '([,z)'::textrange;
142  textrange 
143 -----------
144  ("[",z)
145 (1 row)
147 select '(!,()'::textrange;
148  textrange 
149 -----------
150  (!,"(")
151 (1 row)
153 select '(!,[)'::textrange;
154  textrange 
155 -----------
156  (!,"[")
157 (1 row)
159 select '[a,a]'::textrange;
160  textrange 
161 -----------
162  [a,a]
163 (1 row)
165 -- these are allowed but normalize to empty:
166 select '[a,a)'::textrange;
167  textrange 
168 -----------
169  empty
170 (1 row)
172 select '(a,a]'::textrange;
173  textrange 
174 -----------
175  empty
176 (1 row)
178 select '(a,a)'::textrange;
179  textrange 
180 -----------
181  empty
182 (1 row)
185 -- create some test data and test the operators
187 CREATE TABLE numrange_test (nr NUMRANGE);
188 create index numrange_test_btree on numrange_test(nr);
189 INSERT INTO numrange_test VALUES('[,)');
190 INSERT INTO numrange_test VALUES('[3,]');
191 INSERT INTO numrange_test VALUES('[, 5)');
192 INSERT INTO numrange_test VALUES(numrange(1.1, 2.2));
193 INSERT INTO numrange_test VALUES('empty');
194 INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]'));
195 SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test;
196     nr     | isempty | lower | upper 
197 -----------+---------+-------+-------
198  (,)       | f       |       |      
199  [3,)      | f       |     3 |      
200  (,5)      | f       |       |     5
201  [1.1,2.2) | f       |   1.1 |   2.2
202  empty     | t       |       |      
203  [1.7,1.7] | f       |   1.7 |   1.7
204 (6 rows)
206 SELECT nr, lower_inc(nr), lower_inf(nr), upper_inc(nr), upper_inf(nr) FROM numrange_test;
207     nr     | lower_inc | lower_inf | upper_inc | upper_inf 
208 -----------+-----------+-----------+-----------+-----------
209  (,)       | f         | t         | f         | t
210  [3,)      | t         | f         | f         | t
211  (,5)      | f         | t         | f         | f
212  [1.1,2.2) | t         | f         | f         | f
213  empty     | f         | f         | f         | f
214  [1.7,1.7] | t         | f         | t         | f
215 (6 rows)
217 SELECT * FROM numrange_test WHERE range_contains(nr, numrange(1.9,1.91));
218     nr     
219 -----------
220  (,)
221  (,5)
222  [1.1,2.2)
223 (3 rows)
225 SELECT * FROM numrange_test WHERE nr @> numrange(1.0,10000.1);
226  nr  
227 -----
228  (,)
229 (1 row)
231 SELECT * FROM numrange_test WHERE range_contained_by(numrange(-1e7,-10000.1), nr);
232   nr  
233 ------
234  (,)
235  (,5)
236 (2 rows)
238 SELECT * FROM numrange_test WHERE 1.9 <@ nr;
239     nr     
240 -----------
241  (,)
242  (,5)
243  [1.1,2.2)
244 (3 rows)
246 select * from numrange_test where nr = 'empty';
247   nr   
248 -------
249  empty
250 (1 row)
252 select * from numrange_test where nr = '(1.1, 2.2)';
253  nr 
254 ----
255 (0 rows)
257 select * from numrange_test where nr = '[1.1, 2.2)';
258     nr     
259 -----------
260  [1.1,2.2)
261 (1 row)
263 select * from numrange_test where nr < 'empty';
264  nr 
265 ----
266 (0 rows)
268 select * from numrange_test where nr < numrange(-1000.0, -1000.0,'[]');
269   nr   
270 -------
271  (,)
272  (,5)
273  empty
274 (3 rows)
276 select * from numrange_test where nr < numrange(0.0, 1.0,'[]');
277   nr   
278 -------
279  (,)
280  (,5)
281  empty
282 (3 rows)
284 select * from numrange_test where nr < numrange(1000.0, 1001.0,'[]');
285     nr     
286 -----------
287  (,)
288  [3,)
289  (,5)
290  [1.1,2.2)
291  empty
292  [1.7,1.7]
293 (6 rows)
295 select * from numrange_test where nr <= 'empty';
296   nr   
297 -------
298  empty
299 (1 row)
301 select * from numrange_test where nr >= 'empty';
302     nr     
303 -----------
304  (,)
305  [3,)
306  (,5)
307  [1.1,2.2)
308  empty
309  [1.7,1.7]
310 (6 rows)
312 select * from numrange_test where nr > 'empty';
313     nr     
314 -----------
315  (,)
316  [3,)
317  (,5)
318  [1.1,2.2)
319  [1.7,1.7]
320 (5 rows)
322 select * from numrange_test where nr > numrange(-1001.0, -1000.0,'[]');
323     nr     
324 -----------
325  [3,)
326  [1.1,2.2)
327  [1.7,1.7]
328 (3 rows)
330 select * from numrange_test where nr > numrange(0.0, 1.0,'[]');
331     nr     
332 -----------
333  [3,)
334  [1.1,2.2)
335  [1.7,1.7]
336 (3 rows)
338 select * from numrange_test where nr > numrange(1000.0, 1000.0,'[]');
339  nr 
340 ----
341 (0 rows)
343 select numrange(2.0, 1.0);
344 ERROR:  range lower bound must be less than or equal to range upper bound
345 select numrange(2.0, 3.0) -|- numrange(3.0, 4.0);
346  ?column? 
347 ----------
349 (1 row)
351 select range_adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0));
352  range_adjacent 
353 ----------------
355 (1 row)
357 select range_adjacent(numrange(2.0, 3.0), numrange(3.1, null));
358  range_adjacent 
359 ----------------
361 (1 row)
363 select numrange(2.0, 3.0, '[]') -|- numrange(3.0, 4.0, '()');
364  ?column? 
365 ----------
367 (1 row)
369 select numrange(1.0, 2.0) -|- numrange(2.0, 3.0,'[]');
370  ?column? 
371 ----------
373 (1 row)
375 select range_adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]'));
376  range_adjacent 
377 ----------------
379 (1 row)
381 select numrange(1.1, 3.3) <@ numrange(0.1,10.1);
382  ?column? 
383 ----------
385 (1 row)
387 select numrange(0.1, 10.1) <@ numrange(1.1,3.3);
388  ?column? 
389 ----------
391 (1 row)
393 select numrange(1.1, 2.2) - numrange(2.0, 3.0);
394  ?column?  
395 -----------
396  [1.1,2.0)
397 (1 row)
399 select numrange(1.1, 2.2) - numrange(2.2, 3.0);
400  ?column?  
401 -----------
402  [1.1,2.2)
403 (1 row)
405 select numrange(1.1, 2.2,'[]') - numrange(2.0, 3.0);
406  ?column?  
407 -----------
408  [1.1,2.0)
409 (1 row)
411 select range_minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]'));
412  range_minus 
413 -------------
414  [10.1,12.2]
415 (1 row)
417 select range_minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]'));
418  range_minus 
419 -------------
420  empty
421 (1 row)
423 select numrange(4.5, 5.5, '[]') && numrange(5.5, 6.5);
424  ?column? 
425 ----------
427 (1 row)
429 select numrange(1.0, 2.0) << numrange(3.0, 4.0);
430  ?column? 
431 ----------
433 (1 row)
435 select numrange(1.0, 3.0,'[]') << numrange(3.0, 4.0,'[]');
436  ?column? 
437 ----------
439 (1 row)
441 select numrange(1.0, 3.0,'()') << numrange(3.0, 4.0,'()');
442  ?column? 
443 ----------
445 (1 row)
447 select numrange(1.0, 2.0) >> numrange(3.0, 4.0);
448  ?column? 
449 ----------
451 (1 row)
453 select numrange(3.0, 70.0) &< numrange(6.6, 100.0);
454  ?column? 
455 ----------
457 (1 row)
459 select numrange(1.1, 2.2) < numrange(1.0, 200.2);
460  ?column? 
461 ----------
463 (1 row)
465 select numrange(1.1, 2.2) < numrange(1.1, 1.2);
466  ?column? 
467 ----------
469 (1 row)
471 select numrange(1.0, 2.0) + numrange(2.0, 3.0);
472  ?column?  
473 -----------
474  [1.0,3.0)
475 (1 row)
477 select numrange(1.0, 2.0) + numrange(1.5, 3.0);
478  ?column?  
479 -----------
480  [1.0,3.0)
481 (1 row)
483 select numrange(1.0, 2.0) + numrange(2.5, 3.0); -- should fail
484 ERROR:  result of range union would not be contiguous
485 select range_merge(numrange(1.0, 2.0), numrange(2.0, 3.0));
486  range_merge 
487 -------------
488  [1.0,3.0)
489 (1 row)
491 select range_merge(numrange(1.0, 2.0), numrange(1.5, 3.0));
492  range_merge 
493 -------------
494  [1.0,3.0)
495 (1 row)
497 select range_merge(numrange(1.0, 2.0), numrange(2.5, 3.0)); -- shouldn't fail
498  range_merge 
499 -------------
500  [1.0,3.0)
501 (1 row)
503 select numrange(1.0, 2.0) * numrange(2.0, 3.0);
504  ?column? 
505 ----------
506  empty
507 (1 row)
509 select numrange(1.0, 2.0) * numrange(1.5, 3.0);
510  ?column?  
511 -----------
512  [1.5,2.0)
513 (1 row)
515 select numrange(1.0, 2.0) * numrange(2.5, 3.0);
516  ?column? 
517 ----------
518  empty
519 (1 row)
521 select range_intersect_agg(nr) from numrange_test;
522  range_intersect_agg 
523 ---------------------
524  empty
525 (1 row)
527 select range_intersect_agg(nr) from numrange_test where false;
528  range_intersect_agg 
529 ---------------------
531 (1 row)
533 select range_intersect_agg(nr) from numrange_test where nr @> 4.0;
534  range_intersect_agg 
535 ---------------------
536  [3,5)
537 (1 row)
539 analyze numrange_test;
540 create table numrange_test2(nr numrange);
541 create index numrange_test2_hash_idx on numrange_test2 using hash (nr);
542 INSERT INTO numrange_test2 VALUES('[, 5)');
543 INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2));
544 INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2));
545 INSERT INTO numrange_test2 VALUES(numrange(1.1, 2.2,'()'));
546 INSERT INTO numrange_test2 VALUES('empty');
547 select * from numrange_test2 where nr = 'empty'::numrange;
548   nr   
549 -------
550  empty
551 (1 row)
553 select * from numrange_test2 where nr = numrange(1.1, 2.2);
554     nr     
555 -----------
556  [1.1,2.2)
557  [1.1,2.2)
558 (2 rows)
560 select * from numrange_test2 where nr = numrange(1.1, 2.3);
561  nr 
562 ----
563 (0 rows)
565 set enable_nestloop=t;
566 set enable_hashjoin=f;
567 set enable_mergejoin=f;
568 select * from numrange_test natural join numrange_test2 order by nr;
569     nr     
570 -----------
571  empty
572  (,5)
573  [1.1,2.2)
574  [1.1,2.2)
575 (4 rows)
577 set enable_nestloop=f;
578 set enable_hashjoin=t;
579 set enable_mergejoin=f;
580 select * from numrange_test natural join numrange_test2 order by nr;
581     nr     
582 -----------
583  empty
584  (,5)
585  [1.1,2.2)
586  [1.1,2.2)
587 (4 rows)
589 set enable_nestloop=f;
590 set enable_hashjoin=f;
591 set enable_mergejoin=t;
592 select * from numrange_test natural join numrange_test2 order by nr;
593     nr     
594 -----------
595  empty
596  (,5)
597  [1.1,2.2)
598  [1.1,2.2)
599 (4 rows)
601 set enable_nestloop to default;
602 set enable_hashjoin to default;
603 set enable_mergejoin to default;
604 -- keep numrange_test around to help exercise dump/reload
605 DROP TABLE numrange_test2;
607 -- Apply a subset of the above tests on a collatable type, too
609 CREATE TABLE textrange_test (tr textrange);
610 create index textrange_test_btree on textrange_test(tr);
611 INSERT INTO textrange_test VALUES('[,)');
612 INSERT INTO textrange_test VALUES('["a",]');
613 INSERT INTO textrange_test VALUES('[,"q")');
614 INSERT INTO textrange_test VALUES(textrange('b', 'g'));
615 INSERT INTO textrange_test VALUES('empty');
616 INSERT INTO textrange_test VALUES(textrange('d', 'd', '[]'));
617 SELECT tr, isempty(tr), lower(tr), upper(tr) FROM textrange_test;
618   tr   | isempty | lower | upper 
619 -------+---------+-------+-------
620  (,)   | f       |       | 
621  [a,)  | f       | a     | 
622  (,q)  | f       |       | q
623  [b,g) | f       | b     | g
624  empty | t       |       | 
625  [d,d] | f       | d     | d
626 (6 rows)
628 SELECT tr, lower_inc(tr), lower_inf(tr), upper_inc(tr), upper_inf(tr) FROM textrange_test;
629   tr   | lower_inc | lower_inf | upper_inc | upper_inf 
630 -------+-----------+-----------+-----------+-----------
631  (,)   | f         | t         | f         | t
632  [a,)  | t         | f         | f         | t
633  (,q)  | f         | t         | f         | f
634  [b,g) | t         | f         | f         | f
635  empty | f         | f         | f         | f
636  [d,d] | t         | f         | t         | f
637 (6 rows)
639 SELECT * FROM textrange_test WHERE range_contains(tr, textrange('f', 'fx'));
640   tr   
641 -------
642  (,)
643  [a,)
644  (,q)
645  [b,g)
646 (4 rows)
648 SELECT * FROM textrange_test WHERE tr @> textrange('a', 'z');
649   tr  
650 ------
651  (,)
652  [a,)
653 (2 rows)
655 SELECT * FROM textrange_test WHERE range_contained_by(textrange('0','9'), tr);
656   tr  
657 ------
658  (,)
659  (,q)
660 (2 rows)
662 SELECT * FROM textrange_test WHERE 'e'::text <@ tr;
663   tr   
664 -------
665  (,)
666  [a,)
667  (,q)
668  [b,g)
669 (4 rows)
671 select * from textrange_test where tr = 'empty';
672   tr   
673 -------
674  empty
675 (1 row)
677 select * from textrange_test where tr = '("b","g")';
678  tr 
679 ----
680 (0 rows)
682 select * from textrange_test where tr = '["b","g")';
683   tr   
684 -------
685  [b,g)
686 (1 row)
688 select * from textrange_test where tr < 'empty';
689  tr 
690 ----
691 (0 rows)
693 -- test canonical form for int4range
694 select int4range(1, 10, '[]');
695  int4range 
696 -----------
697  [1,11)
698 (1 row)
700 select int4range(1, 10, '[)');
701  int4range 
702 -----------
703  [1,10)
704 (1 row)
706 select int4range(1, 10, '(]');
707  int4range 
708 -----------
709  [2,11)
710 (1 row)
712 select int4range(1, 10, '()');
713  int4range 
714 -----------
715  [2,10)
716 (1 row)
718 select int4range(1, 2, '()');
719  int4range 
720 -----------
721  empty
722 (1 row)
724 -- test canonical form for daterange
725 select daterange('2000-01-10'::date, '2000-01-20'::date, '[]');
726         daterange        
727 -------------------------
728  [01-10-2000,01-21-2000)
729 (1 row)
731 select daterange('2000-01-10'::date, '2000-01-20'::date, '[)');
732         daterange        
733 -------------------------
734  [01-10-2000,01-20-2000)
735 (1 row)
737 select daterange('2000-01-10'::date, '2000-01-20'::date, '(]');
738         daterange        
739 -------------------------
740  [01-11-2000,01-21-2000)
741 (1 row)
743 select daterange('2000-01-10'::date, '2000-01-20'::date, '()');
744         daterange        
745 -------------------------
746  [01-11-2000,01-20-2000)
747 (1 row)
749 select daterange('2000-01-10'::date, '2000-01-11'::date, '()');
750  daterange 
751 -----------
752  empty
753 (1 row)
755 select daterange('2000-01-10'::date, '2000-01-11'::date, '(]');
756         daterange        
757 -------------------------
758  [01-11-2000,01-12-2000)
759 (1 row)
761 select daterange('-infinity'::date, '2000-01-01'::date, '()');
762        daterange        
763 ------------------------
764  (-infinity,01-01-2000)
765 (1 row)
767 select daterange('-infinity'::date, '2000-01-01'::date, '[)');
768        daterange        
769 ------------------------
770  [-infinity,01-01-2000)
771 (1 row)
773 select daterange('2000-01-01'::date, 'infinity'::date, '[)');
774        daterange       
775 -----------------------
776  [01-01-2000,infinity)
777 (1 row)
779 select daterange('2000-01-01'::date, 'infinity'::date, '[]');
780        daterange       
781 -----------------------
782  [01-01-2000,infinity]
783 (1 row)
785 -- test GiST index that's been built incrementally
786 create table test_range_gist(ir int4range);
787 create index test_range_gist_idx on test_range_gist using gist (ir);
788 insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g;
789 insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g;
790 insert into test_range_gist select int4range(g, g+10000) from generate_series(1,1000) g;
791 insert into test_range_gist select 'empty'::int4range from generate_series(1,500) g;
792 insert into test_range_gist select int4range(NULL,g*10,'(]') from generate_series(1,100) g;
793 insert into test_range_gist select int4range(g*10,NULL,'(]') from generate_series(1,100) g;
794 insert into test_range_gist select int4range(g, g+10) from generate_series(1,2000) g;
795 -- test statistics and selectivity estimation as well
797 -- We don't check the accuracy of selectivity estimation, but at least check
798 -- it doesn't fall.
799 analyze test_range_gist;
800 -- first, verify non-indexed results
801 SET enable_seqscan    = t;
802 SET enable_indexscan  = f;
803 SET enable_bitmapscan = f;
804 select count(*) from test_range_gist where ir @> 'empty'::int4range;
805  count 
806 -------
807   6200
808 (1 row)
810 select count(*) from test_range_gist where ir = int4range(10,20);
811  count 
812 -------
813      2
814 (1 row)
816 select count(*) from test_range_gist where ir @> 10;
817  count 
818 -------
819    130
820 (1 row)
822 select count(*) from test_range_gist where ir @> int4range(10,20);
823  count 
824 -------
825    111
826 (1 row)
828 select count(*) from test_range_gist where ir && int4range(10,20);
829  count 
830 -------
831    158
832 (1 row)
834 select count(*) from test_range_gist where ir <@ int4range(10,50);
835  count 
836 -------
837   1062
838 (1 row)
840 select count(*) from test_range_gist where ir << int4range(100,500);
841  count 
842 -------
843    189
844 (1 row)
846 select count(*) from test_range_gist where ir >> int4range(100,500);
847  count 
848 -------
849   3554
850 (1 row)
852 select count(*) from test_range_gist where ir &< int4range(100,500);
853  count 
854 -------
855   1029
856 (1 row)
858 select count(*) from test_range_gist where ir &> int4range(100,500);
859  count 
860 -------
861   4794
862 (1 row)
864 select count(*) from test_range_gist where ir -|- int4range(100,500);
865  count 
866 -------
867      5
868 (1 row)
870 select count(*) from test_range_gist where ir @> '{}'::int4multirange;
871  count 
872 -------
873   6200
874 (1 row)
876 select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40));
877  count 
878 -------
879    107
880 (1 row)
882 select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange;
883  count 
884 -------
885    271
886 (1 row)
888 select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
889  count 
890 -------
891   1060
892 (1 row)
894 select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500));
895  count 
896 -------
897    189
898 (1 row)
900 select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500));
901  count 
902 -------
903   3554
904 (1 row)
906 select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500));
907  count 
908 -------
909   1029
910 (1 row)
912 select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500));
913  count 
914 -------
915   4794
916 (1 row)
918 select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500));
919  count 
920 -------
921      5
922 (1 row)
924 -- now check same queries using index
925 SET enable_seqscan    = f;
926 SET enable_indexscan  = t;
927 SET enable_bitmapscan = f;
928 select count(*) from test_range_gist where ir @> 'empty'::int4range;
929  count 
930 -------
931   6200
932 (1 row)
934 select count(*) from test_range_gist where ir = int4range(10,20);
935  count 
936 -------
937      2
938 (1 row)
940 select count(*) from test_range_gist where ir @> 10;
941  count 
942 -------
943    130
944 (1 row)
946 select count(*) from test_range_gist where ir @> int4range(10,20);
947  count 
948 -------
949    111
950 (1 row)
952 select count(*) from test_range_gist where ir && int4range(10,20);
953  count 
954 -------
955    158
956 (1 row)
958 select count(*) from test_range_gist where ir <@ int4range(10,50);
959  count 
960 -------
961   1062
962 (1 row)
964 select count(*) from test_range_gist where ir << int4range(100,500);
965  count 
966 -------
967    189
968 (1 row)
970 select count(*) from test_range_gist where ir >> int4range(100,500);
971  count 
972 -------
973   3554
974 (1 row)
976 select count(*) from test_range_gist where ir &< int4range(100,500);
977  count 
978 -------
979   1029
980 (1 row)
982 select count(*) from test_range_gist where ir &> int4range(100,500);
983  count 
984 -------
985   4794
986 (1 row)
988 select count(*) from test_range_gist where ir -|- int4range(100,500);
989  count 
990 -------
991      5
992 (1 row)
994 select count(*) from test_range_gist where ir @> '{}'::int4multirange;
995  count 
996 -------
997   6200
998 (1 row)
1000 select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40));
1001  count 
1002 -------
1003    107
1004 (1 row)
1006 select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange;
1007  count 
1008 -------
1009    271
1010 (1 row)
1012 select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
1013  count 
1014 -------
1015   1060
1016 (1 row)
1018 select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500));
1019  count 
1020 -------
1021    189
1022 (1 row)
1024 select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500));
1025  count 
1026 -------
1027   3554
1028 (1 row)
1030 select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500));
1031  count 
1032 -------
1033   1029
1034 (1 row)
1036 select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500));
1037  count 
1038 -------
1039   4794
1040 (1 row)
1042 select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500));
1043  count 
1044 -------
1045      5
1046 (1 row)
1048 -- now check same queries using a bulk-loaded index
1049 drop index test_range_gist_idx;
1050 create index test_range_gist_idx on test_range_gist using gist (ir);
1051 select count(*) from test_range_gist where ir @> 'empty'::int4range;
1052  count 
1053 -------
1054   6200
1055 (1 row)
1057 select count(*) from test_range_gist where ir = int4range(10,20);
1058  count 
1059 -------
1060      2
1061 (1 row)
1063 select count(*) from test_range_gist where ir @> 10;
1064  count 
1065 -------
1066    130
1067 (1 row)
1069 select count(*) from test_range_gist where ir @> int4range(10,20);
1070  count 
1071 -------
1072    111
1073 (1 row)
1075 select count(*) from test_range_gist where ir && int4range(10,20);
1076  count 
1077 -------
1078    158
1079 (1 row)
1081 select count(*) from test_range_gist where ir <@ int4range(10,50);
1082  count 
1083 -------
1084   1062
1085 (1 row)
1087 select count(*) from test_range_gist where ir << int4range(100,500);
1088  count 
1089 -------
1090    189
1091 (1 row)
1093 select count(*) from test_range_gist where ir >> int4range(100,500);
1094  count 
1095 -------
1096   3554
1097 (1 row)
1099 select count(*) from test_range_gist where ir &< int4range(100,500);
1100  count 
1101 -------
1102   1029
1103 (1 row)
1105 select count(*) from test_range_gist where ir &> int4range(100,500);
1106  count 
1107 -------
1108   4794
1109 (1 row)
1111 select count(*) from test_range_gist where ir -|- int4range(100,500);
1112  count 
1113 -------
1114      5
1115 (1 row)
1117 select count(*) from test_range_gist where ir @> '{}'::int4multirange;
1118  count 
1119 -------
1120   6200
1121 (1 row)
1123 select count(*) from test_range_gist where ir @> int4multirange(int4range(10,20), int4range(30,40));
1124  count 
1125 -------
1126    107
1127 (1 row)
1129 select count(*) from test_range_gist where ir && '{(10,20),(30,40),(50,60)}'::int4multirange;
1130  count 
1131 -------
1132    271
1133 (1 row)
1135 select count(*) from test_range_gist where ir <@ '{(10,30),(40,60),(70,90)}'::int4multirange;
1136  count 
1137 -------
1138   1060
1139 (1 row)
1141 select count(*) from test_range_gist where ir << int4multirange(int4range(100,200), int4range(400,500));
1142  count 
1143 -------
1144    189
1145 (1 row)
1147 select count(*) from test_range_gist where ir >> int4multirange(int4range(100,200), int4range(400,500));
1148  count 
1149 -------
1150   3554
1151 (1 row)
1153 select count(*) from test_range_gist where ir &< int4multirange(int4range(100,200), int4range(400,500));
1154  count 
1155 -------
1156   1029
1157 (1 row)
1159 select count(*) from test_range_gist where ir &> int4multirange(int4range(100,200), int4range(400,500));
1160  count 
1161 -------
1162   4794
1163 (1 row)
1165 select count(*) from test_range_gist where ir -|- int4multirange(int4range(100,200), int4range(400,500));
1166  count 
1167 -------
1168      5
1169 (1 row)
1171 -- test SP-GiST index that's been built incrementally
1172 create table test_range_spgist(ir int4range);
1173 create index test_range_spgist_idx on test_range_spgist using spgist (ir);
1174 insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g;
1175 insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g;
1176 insert into test_range_spgist select int4range(g, g+10000) from generate_series(1,1000) g;
1177 insert into test_range_spgist select 'empty'::int4range from generate_series(1,500) g;
1178 insert into test_range_spgist select int4range(NULL,g*10,'(]') from generate_series(1,100) g;
1179 insert into test_range_spgist select int4range(g*10,NULL,'(]') from generate_series(1,100) g;
1180 insert into test_range_spgist select int4range(g, g+10) from generate_series(1,2000) g;
1181 -- first, verify non-indexed results
1182 SET enable_seqscan    = t;
1183 SET enable_indexscan  = f;
1184 SET enable_bitmapscan = f;
1185 select count(*) from test_range_spgist where ir @> 'empty'::int4range;
1186  count 
1187 -------
1188   6200
1189 (1 row)
1191 select count(*) from test_range_spgist where ir = int4range(10,20);
1192  count 
1193 -------
1194      2
1195 (1 row)
1197 select count(*) from test_range_spgist where ir @> 10;
1198  count 
1199 -------
1200    130
1201 (1 row)
1203 select count(*) from test_range_spgist where ir @> int4range(10,20);
1204  count 
1205 -------
1206    111
1207 (1 row)
1209 select count(*) from test_range_spgist where ir && int4range(10,20);
1210  count 
1211 -------
1212    158
1213 (1 row)
1215 select count(*) from test_range_spgist where ir <@ int4range(10,50);
1216  count 
1217 -------
1218   1062
1219 (1 row)
1221 select count(*) from test_range_spgist where ir << int4range(100,500);
1222  count 
1223 -------
1224    189
1225 (1 row)
1227 select count(*) from test_range_spgist where ir >> int4range(100,500);
1228  count 
1229 -------
1230   3554
1231 (1 row)
1233 select count(*) from test_range_spgist where ir &< int4range(100,500);
1234  count 
1235 -------
1236   1029
1237 (1 row)
1239 select count(*) from test_range_spgist where ir &> int4range(100,500);
1240  count 
1241 -------
1242   4794
1243 (1 row)
1245 select count(*) from test_range_spgist where ir -|- int4range(100,500);
1246  count 
1247 -------
1248      5
1249 (1 row)
1251 -- now check same queries using index
1252 SET enable_seqscan    = f;
1253 SET enable_indexscan  = t;
1254 SET enable_bitmapscan = f;
1255 select count(*) from test_range_spgist where ir @> 'empty'::int4range;
1256  count 
1257 -------
1258   6200
1259 (1 row)
1261 select count(*) from test_range_spgist where ir = int4range(10,20);
1262  count 
1263 -------
1264      2
1265 (1 row)
1267 select count(*) from test_range_spgist where ir @> 10;
1268  count 
1269 -------
1270    130
1271 (1 row)
1273 select count(*) from test_range_spgist where ir @> int4range(10,20);
1274  count 
1275 -------
1276    111
1277 (1 row)
1279 select count(*) from test_range_spgist where ir && int4range(10,20);
1280  count 
1281 -------
1282    158
1283 (1 row)
1285 select count(*) from test_range_spgist where ir <@ int4range(10,50);
1286  count 
1287 -------
1288   1062
1289 (1 row)
1291 select count(*) from test_range_spgist where ir << int4range(100,500);
1292  count 
1293 -------
1294    189
1295 (1 row)
1297 select count(*) from test_range_spgist where ir >> int4range(100,500);
1298  count 
1299 -------
1300   3554
1301 (1 row)
1303 select count(*) from test_range_spgist where ir &< int4range(100,500);
1304  count 
1305 -------
1306   1029
1307 (1 row)
1309 select count(*) from test_range_spgist where ir &> int4range(100,500);
1310  count 
1311 -------
1312   4794
1313 (1 row)
1315 select count(*) from test_range_spgist where ir -|- int4range(100,500);
1316  count 
1317 -------
1318      5
1319 (1 row)
1321 -- now check same queries using a bulk-loaded index
1322 drop index test_range_spgist_idx;
1323 create index test_range_spgist_idx on test_range_spgist using spgist (ir);
1324 select count(*) from test_range_spgist where ir @> 'empty'::int4range;
1325  count 
1326 -------
1327   6200
1328 (1 row)
1330 select count(*) from test_range_spgist where ir = int4range(10,20);
1331  count 
1332 -------
1333      2
1334 (1 row)
1336 select count(*) from test_range_spgist where ir @> 10;
1337  count 
1338 -------
1339    130
1340 (1 row)
1342 select count(*) from test_range_spgist where ir @> int4range(10,20);
1343  count 
1344 -------
1345    111
1346 (1 row)
1348 select count(*) from test_range_spgist where ir && int4range(10,20);
1349  count 
1350 -------
1351    158
1352 (1 row)
1354 select count(*) from test_range_spgist where ir <@ int4range(10,50);
1355  count 
1356 -------
1357   1062
1358 (1 row)
1360 select count(*) from test_range_spgist where ir << int4range(100,500);
1361  count 
1362 -------
1363    189
1364 (1 row)
1366 select count(*) from test_range_spgist where ir >> int4range(100,500);
1367  count 
1368 -------
1369   3554
1370 (1 row)
1372 select count(*) from test_range_spgist where ir &< int4range(100,500);
1373  count 
1374 -------
1375   1029
1376 (1 row)
1378 select count(*) from test_range_spgist where ir &> int4range(100,500);
1379  count 
1380 -------
1381   4794
1382 (1 row)
1384 select count(*) from test_range_spgist where ir -|- int4range(100,500);
1385  count 
1386 -------
1387      5
1388 (1 row)
1390 -- test index-only scans
1391 explain (costs off)
1392 select ir from test_range_spgist where ir -|- int4range(10,20) order by ir;
1393                                QUERY PLAN                               
1394 ------------------------------------------------------------------------
1395  Sort
1396    Sort Key: ir
1397    ->  Index Only Scan using test_range_spgist_idx on test_range_spgist
1398          Index Cond: (ir -|- '[10,20)'::int4range)
1399 (4 rows)
1401 select ir from test_range_spgist where ir -|- int4range(10,20) order by ir;
1402      ir     
1403 ------------
1404  [20,30)
1405  [20,30)
1406  [20,10020)
1407 (3 rows)
1409 RESET enable_seqscan;
1410 RESET enable_indexscan;
1411 RESET enable_bitmapscan;
1412 -- test elem <@ range operator
1413 create table test_range_elem(i int4);
1414 create index test_range_elem_idx on test_range_elem (i);
1415 insert into test_range_elem select i from generate_series(1,100) i;
1416 SET enable_seqscan    = f;
1417 select count(*) from test_range_elem where i <@ int4range(10,50);
1418  count 
1419 -------
1420     40
1421 (1 row)
1423 -- also test spgist index on anyrange expression
1424 create index on test_range_elem using spgist(int4range(i,i+10));
1425 explain (costs off)
1426 select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30);
1427                                QUERY PLAN                                
1428 -------------------------------------------------------------------------
1429  Aggregate
1430    ->  Index Scan using test_range_elem_int4range_idx on test_range_elem
1431          Index Cond: (int4range(i, (i + 10)) <@ '[10,30)'::int4range)
1432 (3 rows)
1434 select count(*) from test_range_elem where int4range(i,i+10) <@ int4range(10,30);
1435  count 
1436 -------
1437     11
1438 (1 row)
1440 RESET enable_seqscan;
1441 drop table test_range_elem;
1443 -- Btree_gist is not included by default, so to test exclusion
1444 -- constraints with range types, use singleton int ranges for the "="
1445 -- portion of the constraint.
1447 create table test_range_excl(
1448   room int4range,
1449   speaker int4range,
1450   during tsrange,
1451   exclude using gist (room with =, during with &&),
1452   exclude using gist (speaker with =, during with &&)
1454 insert into test_range_excl
1455   values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)');
1456 insert into test_range_excl
1457   values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)');
1458 insert into test_range_excl
1459   values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
1460 ERROR:  conflicting key value violates exclusion constraint "test_range_excl_room_during_excl"
1461 DETAIL:  Key (room, during)=([123,124), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (room, during)=([123,124), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")).
1462 insert into test_range_excl
1463   values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)');
1464 insert into test_range_excl
1465   values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
1466 ERROR:  conflicting key value violates exclusion constraint "test_range_excl_speaker_during_excl"
1467 DETAIL:  Key (speaker, during)=([1,2), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (speaker, during)=([1,2), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")).
1468 -- test bigint ranges
1469 select int8range(10000000000::int8, 20000000000::int8,'(]');
1470          int8range         
1471 ---------------------------
1472  [10000000001,20000000001)
1473 (1 row)
1475 -- test tstz ranges
1476 set timezone to '-08';
1477 select '[2010-01-01 01:00:00 -05, 2010-01-01 02:00:00 -08)'::tstzrange;
1478                             tstzrange                            
1479 -----------------------------------------------------------------
1480  ["Thu Dec 31 22:00:00 2009 -08","Fri Jan 01 02:00:00 2010 -08")
1481 (1 row)
1483 -- should fail
1484 select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)'::tstzrange;
1485 ERROR:  range lower bound must be less than or equal to range upper bound
1486 LINE 1: select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)':...
1487                ^
1488 set timezone to default;
1490 -- Test user-defined range of floats
1492 --should fail
1493 create type float8range as range (subtype=float8, subtype_diff=float4mi);
1494 ERROR:  function float4mi(double precision, double precision) does not exist
1495 --should succeed
1496 create type float8range as range (subtype=float8, subtype_diff=float8mi);
1497 select '[123.001, 5.e9)'::float8range @> 888.882::float8;
1498  ?column? 
1499 ----------
1501 (1 row)
1503 create table float8range_test(f8r float8range, i int);
1504 insert into float8range_test values(float8range(-100.00007, '1.111113e9'), 42);
1505 select * from float8range_test;
1506            f8r           | i  
1507 -------------------------+----
1508  [-100.00007,1111113000) | 42
1509 (1 row)
1511 drop table float8range_test;
1513 -- Test range types over domains
1515 create domain mydomain as int4;
1516 create type mydomainrange as range(subtype=mydomain);
1517 select '[4,50)'::mydomainrange @> 7::mydomain;
1518  ?column? 
1519 ----------
1521 (1 row)
1523 drop domain mydomain;  -- fail
1524 ERROR:  cannot drop type mydomain because other objects depend on it
1525 DETAIL:  type mydomainrange depends on type mydomain
1526 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
1527 drop domain mydomain cascade;
1528 NOTICE:  drop cascades to type mydomainrange
1530 -- Test domains over range types
1532 create domain restrictedrange as int4range check (upper(value) < 10);
1533 select '[4,5)'::restrictedrange @> 7;
1534  ?column? 
1535 ----------
1537 (1 row)
1539 select '[4,50)'::restrictedrange @> 7; -- should fail
1540 ERROR:  value for domain restrictedrange violates check constraint "restrictedrange_check"
1541 drop domain restrictedrange;
1543 -- Test multiple range types over the same subtype
1545 create type textrange1 as range(subtype=text, collation="C");
1546 create type textrange2 as range(subtype=text, collation="C");
1547 select textrange1('a','Z') @> 'b'::text;
1548 ERROR:  range lower bound must be less than or equal to range upper bound
1549 select textrange2('a','z') @> 'b'::text;
1550  ?column? 
1551 ----------
1553 (1 row)
1555 drop type textrange1;
1556 drop type textrange2;
1558 -- Test polymorphic type system
1560 create function anyarray_anyrange_func(a anyarray, r anyrange)
1561   returns anyelement as 'select $1[1] + lower($2);' language sql;
1562 select anyarray_anyrange_func(ARRAY[1,2], int4range(10,20));
1563  anyarray_anyrange_func 
1564 ------------------------
1565                      11
1566 (1 row)
1568 -- should fail
1569 select anyarray_anyrange_func(ARRAY[1,2], numrange(10,20));
1570 ERROR:  function anyarray_anyrange_func(integer[], numrange) does not exist
1571 LINE 1: select anyarray_anyrange_func(ARRAY[1,2], numrange(10,20));
1572                ^
1573 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
1574 drop function anyarray_anyrange_func(anyarray, anyrange);
1575 -- should fail
1576 create function bogus_func(anyelement)
1577   returns anyrange as 'select int4range(1,10)' language sql;
1578 ERROR:  cannot determine result data type
1579 DETAIL:  A result of type anyrange requires at least one input of type anyrange or anymultirange.
1580 -- should fail
1581 create function bogus_func(int)
1582   returns anyrange as 'select int4range(1,10)' language sql;
1583 ERROR:  cannot determine result data type
1584 DETAIL:  A result of type anyrange requires at least one input of type anyrange or anymultirange.
1585 create function range_add_bounds(anyrange)
1586   returns anyelement as 'select lower($1) + upper($1)' language sql;
1587 select range_add_bounds(int4range(1, 17));
1588  range_add_bounds 
1589 ------------------
1590                18
1591 (1 row)
1593 select range_add_bounds(numrange(1.0001, 123.123));
1594  range_add_bounds 
1595 ------------------
1596          124.1231
1597 (1 row)
1599 create function rangetypes_sql(q anyrange, b anyarray, out c anyelement)
1600   as $$ select upper($1) + $2[1] $$
1601   language sql;
1602 select rangetypes_sql(int4range(1,10), ARRAY[2,20]);
1603  rangetypes_sql 
1604 ----------------
1605              12
1606 (1 row)
1608 select rangetypes_sql(numrange(1,10), ARRAY[2,20]);  -- match failure
1609 ERROR:  function rangetypes_sql(numrange, integer[]) does not exist
1610 LINE 1: select rangetypes_sql(numrange(1,10), ARRAY[2,20]);
1611                ^
1612 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
1613 create function anycompatiblearray_anycompatiblerange_func(a anycompatiblearray, r anycompatiblerange)
1614   returns anycompatible as 'select $1[1] + lower($2);' language sql;
1615 select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], int4range(10,20));
1616  anycompatiblearray_anycompatiblerange_func 
1617 --------------------------------------------
1618                                          11
1619 (1 row)
1621 select anycompatiblearray_anycompatiblerange_func(ARRAY[1,2], numrange(10,20));
1622  anycompatiblearray_anycompatiblerange_func 
1623 --------------------------------------------
1624                                          11
1625 (1 row)
1627 -- should fail
1628 select anycompatiblearray_anycompatiblerange_func(ARRAY[1.1,2], int4range(10,20));
1629 ERROR:  function anycompatiblearray_anycompatiblerange_func(numeric[], int4range) does not exist
1630 LINE 1: select anycompatiblearray_anycompatiblerange_func(ARRAY[1.1,...
1631                ^
1632 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
1633 drop function anycompatiblearray_anycompatiblerange_func(anycompatiblearray, anycompatiblerange);
1634 -- should fail
1635 create function bogus_func(anycompatible)
1636   returns anycompatiblerange as 'select int4range(1,10)' language sql;
1637 ERROR:  cannot determine result data type
1638 DETAIL:  A result of type anycompatiblerange requires at least one input of type anycompatiblerange or anycompatiblemultirange.
1640 -- Arrays of ranges
1642 select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)];
1643             array             
1644 ------------------------------
1645  {"[1.1,1.2)","[12.3,155.5)"}
1646 (1 row)
1648 create table i8r_array (f1 int, f2 int8range[]);
1649 insert into i8r_array values (42, array[int8range(1,10), int8range(2,20)]);
1650 select * from i8r_array;
1651  f1 |         f2          
1652 ----+---------------------
1653  42 | {"[1,10)","[2,20)"}
1654 (1 row)
1656 drop table i8r_array;
1658 -- Ranges of arrays
1660 create type arrayrange as range (subtype=int4[]);
1661 select arrayrange(ARRAY[1,2], ARRAY[2,1]);
1662     arrayrange     
1663 -------------------
1664  ["{1,2}","{2,1}")
1665 (1 row)
1667 select arrayrange(ARRAY[2,1], ARRAY[1,2]);  -- fail
1668 ERROR:  range lower bound must be less than or equal to range upper bound
1669 select array[1,1] <@ arrayrange(array[1,2], array[2,1]);
1670  ?column? 
1671 ----------
1673 (1 row)
1675 select array[1,3] <@ arrayrange(array[1,2], array[2,1]);
1676  ?column? 
1677 ----------
1679 (1 row)
1682 -- Ranges of composites
1684 create type two_ints as (a int, b int);
1685 create type two_ints_range as range (subtype = two_ints);
1686 -- with force_parallel_mode on, this exercises tqueue.c's range remapping
1687 select *, row_to_json(upper(t)) as u from
1688   (values (two_ints_range(row(1,2), row(3,4))),
1689           (two_ints_range(row(5,6), row(7,8)))) v(t);
1690          t         |       u       
1691 -------------------+---------------
1692  ["(1,2)","(3,4)") | {"a":3,"b":4}
1693  ["(5,6)","(7,8)") | {"a":7,"b":8}
1694 (2 rows)
1696 -- this must be rejected to avoid self-inclusion issues:
1697 alter type two_ints add attribute c two_ints_range;
1698 ERROR:  composite type two_ints cannot be made a member of itself
1699 drop type two_ints cascade;
1700 NOTICE:  drop cascades to type two_ints_range
1702 -- Check behavior when subtype lacks a hash function
1704 create type cashrange as range (subtype = money);
1705 set enable_sort = off;  -- try to make it pick a hash setop implementation
1706 select '(2,5)'::cashrange except select '(5,6)'::cashrange;
1707    cashrange   
1708 ---------------
1709  ($2.00,$5.00)
1710 (1 row)
1712 reset enable_sort;
1714 -- OUT/INOUT/TABLE functions
1716 -- infer anyrange from anyrange
1717 create function outparam_succeed(i anyrange, out r anyrange, out t text)
1718   as $$ select $1, 'foo'::text $$ language sql;
1719 select * from outparam_succeed(int4range(1,2));
1720    r   |  t  
1721 -------+-----
1722  [1,2) | foo
1723 (1 row)
1725 create function outparam2_succeed(r anyrange, out lu anyarray, out ul anyarray)
1726   as $$ select array[lower($1), upper($1)], array[upper($1), lower($1)] $$
1727   language sql;
1728 select * from outparam2_succeed(int4range(1,11));
1729    lu   |   ul   
1730 --------+--------
1731  {1,11} | {11,1}
1732 (1 row)
1734 -- infer anyarray from anyrange
1735 create function outparam_succeed2(i anyrange, out r anyarray, out t text)
1736   as $$ select ARRAY[upper($1)], 'foo'::text $$ language sql;
1737 select * from outparam_succeed2(int4range(int4range(1,2)));
1738   r  |  t  
1739 -----+-----
1740  {2} | foo
1741 (1 row)
1743 -- infer anyelement from anyrange
1744 create function inoutparam_succeed(out i anyelement, inout r anyrange)
1745   as $$ select upper($1), $1 $$ language sql;
1746 select * from inoutparam_succeed(int4range(1,2));
1747  i |   r   
1748 ---+-------
1749  2 | [1,2)
1750 (1 row)
1752 create function table_succeed(r anyrange)
1753   returns table(l anyelement, u anyelement)
1754   as $$ select lower($1), upper($1) $$
1755   language sql;
1756 select * from table_succeed(int4range(1,11));
1757  l | u  
1758 ---+----
1759  1 | 11
1760 (1 row)
1762 -- should fail
1763 create function outparam_fail(i anyelement, out r anyrange, out t text)
1764   as $$ select '[1,10]', 'foo' $$ language sql;
1765 ERROR:  cannot determine result data type
1766 DETAIL:  A result of type anyrange requires at least one input of type anyrange or anymultirange.
1767 --should fail
1768 create function inoutparam_fail(inout i anyelement, out r anyrange)
1769   as $$ select $1, '[1,10]' $$ language sql;
1770 ERROR:  cannot determine result data type
1771 DETAIL:  A result of type anyrange requires at least one input of type anyrange or anymultirange.
1772 --should fail
1773 create function table_fail(i anyelement) returns table(i anyelement, r anyrange)
1774   as $$ select $1, '[1,10]' $$ language sql;
1775 ERROR:  cannot determine result data type
1776 DETAIL:  A result of type anyrange requires at least one input of type anyrange or anymultirange.