]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/aggregates.out
Remove the single-argument form of string_agg(). It added nothing much in
[postgresql] / src / test / regress / expected / aggregates.out
1 --
2 -- AGGREGATES
3 --
4 SELECT avg(four) AS avg_1 FROM onek;
5        avg_1        
6 --------------------
7  1.5000000000000000
8 (1 row)
9
10 SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
11        avg_32        
12 ---------------------
13  32.6666666666666667
14 (1 row)
15
16 -- In 7.1, avg(float4) is computed using float8 arithmetic.
17 -- Round the result to 3 digits to avoid platform-specific results.
18 SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
19  avg_107_943 
20 -------------
21      107.943
22 (1 row)
23
24 SELECT avg(gpa) AS avg_3_4 FROM ONLY student;
25  avg_3_4 
26 ---------
27      3.4
28 (1 row)
29
30 SELECT sum(four) AS sum_1500 FROM onek;
31  sum_1500 
32 ----------
33      1500
34 (1 row)
35
36 SELECT sum(a) AS sum_198 FROM aggtest;
37  sum_198 
38 ---------
39      198
40 (1 row)
41
42 SELECT sum(b) AS avg_431_773 FROM aggtest;
43  avg_431_773 
44 -------------
45      431.773
46 (1 row)
47
48 SELECT sum(gpa) AS avg_6_8 FROM ONLY student;
49  avg_6_8 
50 ---------
51      6.8
52 (1 row)
53
54 SELECT max(four) AS max_3 FROM onek;
55  max_3 
56 -------
57      3
58 (1 row)
59
60 SELECT max(a) AS max_100 FROM aggtest;
61  max_100 
62 ---------
63      100
64 (1 row)
65
66 SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
67  max_324_78 
68 ------------
69      324.78
70 (1 row)
71
72 SELECT max(student.gpa) AS max_3_7 FROM student;
73  max_3_7 
74 ---------
75      3.7
76 (1 row)
77
78 SELECT stddev_pop(b) FROM aggtest;
79    stddev_pop    
80 -----------------
81  131.10703231895
82 (1 row)
83
84 SELECT stddev_samp(b) FROM aggtest;
85    stddev_samp    
86 ------------------
87  151.389360803998
88 (1 row)
89
90 SELECT var_pop(b) FROM aggtest;
91      var_pop      
92 ------------------
93  17189.0539234823
94 (1 row)
95
96 SELECT var_samp(b) FROM aggtest;
97      var_samp     
98 ------------------
99  22918.7385646431
100 (1 row)
101
102 SELECT stddev_pop(b::numeric) FROM aggtest;
103     stddev_pop    
104 ------------------
105  131.107032862199
106 (1 row)
107
108 SELECT stddev_samp(b::numeric) FROM aggtest;
109    stddev_samp    
110 ------------------
111  151.389361431288
112 (1 row)
113
114 SELECT var_pop(b::numeric) FROM aggtest;
115       var_pop       
116 --------------------
117  17189.054065929769
118 (1 row)
119
120 SELECT var_samp(b::numeric) FROM aggtest;
121       var_samp      
122 --------------------
123  22918.738754573025
124 (1 row)
125
126 -- population variance is defined for a single tuple, sample variance
127 -- is not
128 SELECT var_pop(1.0), var_samp(2.0);
129  var_pop | var_samp 
130 ---------+----------
131        0 |         
132 (1 row)
133
134 SELECT stddev_pop(3.0::numeric), stddev_samp(4.0::numeric);
135  stddev_pop | stddev_samp 
136 ------------+-------------
137           0 |            
138 (1 row)
139
140 -- SQL2003 binary aggregates
141 SELECT regr_count(b, a) FROM aggtest;
142  regr_count 
143 ------------
144           4
145 (1 row)
146
147 SELECT regr_sxx(b, a) FROM aggtest;
148  regr_sxx 
149 ----------
150      5099
151 (1 row)
152
153 SELECT regr_syy(b, a) FROM aggtest;
154      regr_syy     
155 ------------------
156  68756.2156939293
157 (1 row)
158
159 SELECT regr_sxy(b, a) FROM aggtest;
160      regr_sxy     
161 ------------------
162  2614.51582155004
163 (1 row)
164
165 SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest;
166  regr_avgx |    regr_avgy     
167 -----------+------------------
168       49.5 | 107.943152273074
169 (1 row)
170
171 SELECT regr_r2(b, a) FROM aggtest;
172       regr_r2       
173 --------------------
174  0.0194977982031803
175 (1 row)
176
177 SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest;
178     regr_slope     |  regr_intercept  
179 -------------------+------------------
180  0.512750700441271 | 82.5619926012309
181 (1 row)
182
183 SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest;
184     covar_pop    |    covar_samp    
185 -----------------+------------------
186  653.62895538751 | 871.505273850014
187 (1 row)
188
189 SELECT corr(b, a) FROM aggtest;
190        corr        
191 -------------------
192  0.139634516517873
193 (1 row)
194
195 SELECT count(four) AS cnt_1000 FROM onek;
196  cnt_1000 
197 ----------
198      1000
199 (1 row)
200
201 SELECT count(DISTINCT four) AS cnt_4 FROM onek;
202  cnt_4 
203 -------
204      4
205 (1 row)
206
207 select ten, count(*), sum(four) from onek
208 group by ten order by ten;
209  ten | count | sum 
210 -----+-------+-----
211    0 |   100 | 100
212    1 |   100 | 200
213    2 |   100 | 100
214    3 |   100 | 200
215    4 |   100 | 100
216    5 |   100 | 200
217    6 |   100 | 100
218    7 |   100 | 200
219    8 |   100 | 100
220    9 |   100 | 200
221 (10 rows)
222
223 select ten, count(four), sum(DISTINCT four) from onek
224 group by ten order by ten;
225  ten | count | sum 
226 -----+-------+-----
227    0 |   100 |   2
228    1 |   100 |   4
229    2 |   100 |   2
230    3 |   100 |   4
231    4 |   100 |   2
232    5 |   100 |   4
233    6 |   100 |   2
234    7 |   100 |   4
235    8 |   100 |   2
236    9 |   100 |   4
237 (10 rows)
238
239 -- user-defined aggregates
240 SELECT newavg(four) AS avg_1 FROM onek;
241        avg_1        
242 --------------------
243  1.5000000000000000
244 (1 row)
245
246 SELECT newsum(four) AS sum_1500 FROM onek;
247  sum_1500 
248 ----------
249      1500
250 (1 row)
251
252 SELECT newcnt(four) AS cnt_1000 FROM onek;
253  cnt_1000 
254 ----------
255      1000
256 (1 row)
257
258 SELECT newcnt(*) AS cnt_1000 FROM onek;
259  cnt_1000 
260 ----------
261      1000
262 (1 row)
263
264 SELECT oldcnt(*) AS cnt_1000 FROM onek;
265  cnt_1000 
266 ----------
267      1000
268 (1 row)
269
270 SELECT sum2(q1,q2) FROM int8_tbl;
271        sum2        
272 -------------------
273  18271560493827981
274 (1 row)
275
276 -- test for outer-level aggregates
277 -- this should work
278 select ten, sum(distinct four) from onek a
279 group by ten
280 having exists (select 1 from onek b where sum(distinct a.four) = b.four);
281  ten | sum 
282 -----+-----
283    0 |   2
284    2 |   2
285    4 |   2
286    6 |   2
287    8 |   2
288 (5 rows)
289
290 -- this should fail because subquery has an agg of its own in WHERE
291 select ten, sum(distinct four) from onek a
292 group by ten
293 having exists (select 1 from onek b
294                where sum(distinct a.four + b.four) = b.four);
295 ERROR:  aggregates not allowed in WHERE clause
296 LINE 4:                where sum(distinct a.four + b.four) = b.four)...
297                              ^
298 -- Test handling of sublinks within outer-level aggregates.
299 -- Per bug report from Daniel Grace.
300 select
301   (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)))
302 from tenk1 o;
303  ?column? 
304 ----------
305      9999
306 (1 row)
307
308 --
309 -- test for bitwise integer aggregates
310 --
311 CREATE TEMPORARY TABLE bitwise_test(
312   i2 INT2,
313   i4 INT4,
314   i8 INT8,
315   i INTEGER,
316   x INT2,
317   y BIT(4)
318 );
319 -- empty case
320 SELECT 
321   BIT_AND(i2) AS "?",
322   BIT_OR(i4)  AS "?"
323 FROM bitwise_test;
324  ? | ? 
325 ---+---
326    |  
327 (1 row)
328
329 COPY bitwise_test FROM STDIN NULL 'null';
330 SELECT
331   BIT_AND(i2) AS "1",
332   BIT_AND(i4) AS "1",
333   BIT_AND(i8) AS "1",
334   BIT_AND(i)  AS "?",
335   BIT_AND(x)  AS "0",
336   BIT_AND(y)  AS "0100",
337   BIT_OR(i2)  AS "7",
338   BIT_OR(i4)  AS "7",
339   BIT_OR(i8)  AS "7",
340   BIT_OR(i)   AS "?",
341   BIT_OR(x)   AS "7",
342   BIT_OR(y)   AS "1101"
343 FROM bitwise_test;
344  1 | 1 | 1 | ? | 0 | 0100 | 7 | 7 | 7 | ? | 7 | 1101 
345 ---+---+---+---+---+------+---+---+---+---+---+------
346  1 | 1 | 1 | 1 | 0 | 0100 | 7 | 7 | 7 | 3 | 7 | 1101
347 (1 row)
348
349 --
350 -- test boolean aggregates
351 --
352 -- first test all possible transition and final states
353 SELECT
354   -- boolean and transitions
355   -- null because strict
356   booland_statefunc(NULL, NULL)  IS NULL AS "t",
357   booland_statefunc(TRUE, NULL)  IS NULL AS "t",
358   booland_statefunc(FALSE, NULL) IS NULL AS "t",
359   booland_statefunc(NULL, TRUE)  IS NULL AS "t",
360   booland_statefunc(NULL, FALSE) IS NULL AS "t",
361   -- and actual computations
362   booland_statefunc(TRUE, TRUE) AS "t",
363   NOT booland_statefunc(TRUE, FALSE) AS "t",
364   NOT booland_statefunc(FALSE, TRUE) AS "t",
365   NOT booland_statefunc(FALSE, FALSE) AS "t";
366  t | t | t | t | t | t | t | t | t 
367 ---+---+---+---+---+---+---+---+---
368  t | t | t | t | t | t | t | t | t
369 (1 row)
370
371 SELECT
372   -- boolean or transitions
373   -- null because strict
374   boolor_statefunc(NULL, NULL)  IS NULL AS "t",
375   boolor_statefunc(TRUE, NULL)  IS NULL AS "t",
376   boolor_statefunc(FALSE, NULL) IS NULL AS "t",
377   boolor_statefunc(NULL, TRUE)  IS NULL AS "t",
378   boolor_statefunc(NULL, FALSE) IS NULL AS "t",
379   -- actual computations
380   boolor_statefunc(TRUE, TRUE) AS "t",
381   boolor_statefunc(TRUE, FALSE) AS "t",
382   boolor_statefunc(FALSE, TRUE) AS "t",
383   NOT boolor_statefunc(FALSE, FALSE) AS "t";
384  t | t | t | t | t | t | t | t | t 
385 ---+---+---+---+---+---+---+---+---
386  t | t | t | t | t | t | t | t | t
387 (1 row)
388
389 CREATE TEMPORARY TABLE bool_test(  
390   b1 BOOL,
391   b2 BOOL,
392   b3 BOOL,
393   b4 BOOL);
394 -- empty case
395 SELECT
396   BOOL_AND(b1)   AS "n",
397   BOOL_OR(b3)    AS "n"
398 FROM bool_test;
399  n | n 
400 ---+---
401    | 
402 (1 row)
403
404 COPY bool_test FROM STDIN NULL 'null';
405 SELECT
406   BOOL_AND(b1)     AS "f",
407   BOOL_AND(b2)     AS "t",
408   BOOL_AND(b3)     AS "f",
409   BOOL_AND(b4)     AS "n",
410   BOOL_AND(NOT b2) AS "f",
411   BOOL_AND(NOT b3) AS "t"
412 FROM bool_test;
413  f | t | f | n | f | t 
414 ---+---+---+---+---+---
415  f | t | f |   | f | t
416 (1 row)
417
418 SELECT
419   EVERY(b1)     AS "f",
420   EVERY(b2)     AS "t",
421   EVERY(b3)     AS "f",
422   EVERY(b4)     AS "n",
423   EVERY(NOT b2) AS "f",
424   EVERY(NOT b3) AS "t"
425 FROM bool_test;
426  f | t | f | n | f | t 
427 ---+---+---+---+---+---
428  f | t | f |   | f | t
429 (1 row)
430
431 SELECT
432   BOOL_OR(b1)      AS "t",
433   BOOL_OR(b2)      AS "t",
434   BOOL_OR(b3)      AS "f",
435   BOOL_OR(b4)      AS "n",
436   BOOL_OR(NOT b2)  AS "f",
437   BOOL_OR(NOT b3)  AS "t"
438 FROM bool_test;
439  t | t | f | n | f | t 
440 ---+---+---+---+---+---
441  t | t | f |   | f | t
442 (1 row)
443
444 --
445 -- Test several cases that should be optimized into indexscans instead of
446 -- the generic aggregate implementation.  We can't actually verify that they
447 -- are done as indexscans, but we can check that the results are correct.
448 --
449 -- Basic cases
450 select max(unique1) from tenk1;
451  max  
452 ------
453  9999
454 (1 row)
455
456 select max(unique1) from tenk1 where unique1 < 42;
457  max 
458 -----
459   41
460 (1 row)
461
462 select max(unique1) from tenk1 where unique1 > 42;
463  max  
464 ------
465  9999
466 (1 row)
467
468 select max(unique1) from tenk1 where unique1 > 42000;
469  max 
470 -----
471     
472 (1 row)
473
474 -- multi-column index (uses tenk1_thous_tenthous)
475 select max(tenthous) from tenk1 where thousand = 33;
476  max  
477 ------
478  9033
479 (1 row)
480
481 select min(tenthous) from tenk1 where thousand = 33;
482  min 
483 -----
484   33
485 (1 row)
486
487 -- check parameter propagation into an indexscan subquery
488 select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
489 from int4_tbl;
490      f1      | gt 
491 -------------+----
492            0 |  1
493       123456 |   
494      -123456 |  0
495   2147483647 |   
496  -2147483647 |  0
497 (5 rows)
498
499 -- check some cases that were handled incorrectly in 8.3.0
500 select distinct max(unique2) from tenk1;
501  max  
502 ------
503  9999
504 (1 row)
505
506 select max(unique2) from tenk1 order by 1;
507  max  
508 ------
509  9999
510 (1 row)
511
512 select max(unique2) from tenk1 order by max(unique2);
513  max  
514 ------
515  9999
516 (1 row)
517
518 select max(unique2) from tenk1 order by max(unique2)+1;
519  max  
520 ------
521  9999
522 (1 row)
523
524 select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
525  max  | g 
526 ------+---
527  9999 | 3
528  9999 | 2
529  9999 | 1
530 (3 rows)
531
532 --
533 -- Test combinations of DISTINCT and/or ORDER BY
534 --
535 select array_agg(a order by b)
536   from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
537  array_agg 
538 -----------
539  {3,4,2,1}
540 (1 row)
541
542 select array_agg(a order by a)
543   from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
544  array_agg 
545 -----------
546  {1,2,3,4}
547 (1 row)
548
549 select array_agg(a order by a desc)
550   from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
551  array_agg 
552 -----------
553  {4,3,2,1}
554 (1 row)
555
556 select array_agg(b order by a desc)
557   from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
558  array_agg 
559 -----------
560  {2,1,3,4}
561 (1 row)
562
563 select array_agg(distinct a)
564   from (values (1),(2),(1),(3),(null),(2)) v(a);
565   array_agg   
566 --------------
567  {1,2,3,NULL}
568 (1 row)
569
570 select array_agg(distinct a order by a)
571   from (values (1),(2),(1),(3),(null),(2)) v(a);
572   array_agg   
573 --------------
574  {1,2,3,NULL}
575 (1 row)
576
577 select array_agg(distinct a order by a desc)
578   from (values (1),(2),(1),(3),(null),(2)) v(a);
579   array_agg   
580 --------------
581  {NULL,3,2,1}
582 (1 row)
583
584 select array_agg(distinct a order by a desc nulls last)
585   from (values (1),(2),(1),(3),(null),(2)) v(a);
586   array_agg   
587 --------------
588  {3,2,1,NULL}
589 (1 row)
590
591 -- multi-arg aggs, strict/nonstrict, distinct/order by
592 select aggfstr(a,b,c)
593   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
594                 aggfstr                
595 ---------------------------------------
596  {"(1,3,foo)","(2,2,bar)","(3,1,baz)"}
597 (1 row)
598
599 select aggfns(a,b,c)
600   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
601                     aggfns                     
602 -----------------------------------------------
603  {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"}
604 (1 row)
605
606 select aggfstr(distinct a,b,c)
607   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
608        generate_series(1,3) i;
609                 aggfstr                
610 ---------------------------------------
611  {"(1,3,foo)","(2,2,bar)","(3,1,baz)"}
612 (1 row)
613
614 select aggfns(distinct a,b,c)
615   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
616        generate_series(1,3) i;
617                     aggfns                     
618 -----------------------------------------------
619  {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
620 (1 row)
621
622 select aggfstr(distinct a,b,c order by b)
623   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
624        generate_series(1,3) i;
625                 aggfstr                
626 ---------------------------------------
627  {"(3,1,baz)","(2,2,bar)","(1,3,foo)"}
628 (1 row)
629
630 select aggfns(distinct a,b,c order by b)
631   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
632        generate_series(1,3) i;
633                     aggfns                     
634 -----------------------------------------------
635  {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
636 (1 row)
637
638 -- test specific code paths
639 select aggfns(distinct a,a,c order by c using ~<~,a)
640   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
641        generate_series(1,2) i;
642                      aggfns                     
643 ------------------------------------------------
644  {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"}
645 (1 row)
646
647 select aggfns(distinct a,a,c order by c using ~<~)
648   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
649        generate_series(1,2) i;
650                      aggfns                     
651 ------------------------------------------------
652  {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"}
653 (1 row)
654
655 select aggfns(distinct a,a,c order by a)
656   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
657        generate_series(1,2) i;
658                      aggfns                     
659 ------------------------------------------------
660  {"(0,0,)","(1,1,foo)","(2,2,bar)","(3,3,baz)"}
661 (1 row)
662
663 select aggfns(distinct a,b,c order by a,c using ~<~,b)
664   from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
665        generate_series(1,2) i;
666                     aggfns                     
667 -----------------------------------------------
668  {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
669 (1 row)
670
671 -- check node I/O via view creation and usage, also deparsing logic
672 create view agg_view1 as
673   select aggfns(a,b,c)
674     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
675 select * from agg_view1;
676                     aggfns                     
677 -----------------------------------------------
678  {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"}
679 (1 row)
680
681 select pg_get_viewdef('agg_view1'::regclass);
682                                                                      pg_get_viewdef                                                                     
683 --------------------------------------------------------------------------------------------------------------------------------------------------------
684  SELECT aggfns(v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
685 (1 row)
686
687 create or replace view agg_view1 as
688   select aggfns(distinct a,b,c)
689     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
690          generate_series(1,3) i;
691 select * from agg_view1;
692                     aggfns                     
693 -----------------------------------------------
694  {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
695 (1 row)
696
697 select pg_get_viewdef('agg_view1'::regclass);
698                                                                                        pg_get_viewdef                                                                                        
699 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
700  SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
701 (1 row)
702
703 create or replace view agg_view1 as
704   select aggfns(distinct a,b,c order by b)
705     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
706          generate_series(1,3) i;
707 select * from agg_view1;
708                     aggfns                     
709 -----------------------------------------------
710  {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
711 (1 row)
712
713 select pg_get_viewdef('agg_view1'::regclass);
714                                                                                               pg_get_viewdef                                                                                              
715 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
716  SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
717 (1 row)
718
719 create or replace view agg_view1 as
720   select aggfns(a,b,c order by b+1)
721     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
722 select * from agg_view1;
723                     aggfns                     
724 -----------------------------------------------
725  {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
726 (1 row)
727
728 select pg_get_viewdef('agg_view1'::regclass);
729                                                                               pg_get_viewdef                                                                               
730 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
731  SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
732 (1 row)
733
734 create or replace view agg_view1 as
735   select aggfns(a,a,c order by b)
736     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
737 select * from agg_view1;
738                      aggfns                     
739 ------------------------------------------------
740  {"(3,3,baz)","(2,2,bar)","(1,1,foo)","(0,0,)"}
741 (1 row)
742
743 select pg_get_viewdef('agg_view1'::regclass);
744                                                                            pg_get_viewdef                                                                            
745 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
746  SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
747 (1 row)
748
749 create or replace view agg_view1 as
750   select aggfns(a,b,c order by c using ~<~)
751     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
752 select * from agg_view1;
753                     aggfns                     
754 -----------------------------------------------
755  {"(2,2,bar)","(3,1,baz)","(1,3,foo)","(0,,)"}
756 (1 row)
757
758 select pg_get_viewdef('agg_view1'::regclass);
759                                                                                       pg_get_viewdef                                                                                      
760 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
761  SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
762 (1 row)
763
764 create or replace view agg_view1 as
765   select aggfns(distinct a,b,c order by a,c using ~<~,b)
766     from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
767          generate_series(1,2) i;
768 select * from agg_view1;
769                     aggfns                     
770 -----------------------------------------------
771  {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
772 (1 row)
773
774 select pg_get_viewdef('agg_view1'::regclass);
775                                                                                                              pg_get_viewdef                                                                                                              
776 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
777  SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 2) i(i);
778 (1 row)
779
780 drop view agg_view1;
781 -- incorrect DISTINCT usage errors
782 select aggfns(distinct a,b,c order by i)
783   from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
784 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
785 LINE 1: select aggfns(distinct a,b,c order by i)
786                                               ^
787 select aggfns(distinct a,b,c order by a,b+1)
788   from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
789 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
790 LINE 1: select aggfns(distinct a,b,c order by a,b+1)
791                                                 ^
792 select aggfns(distinct a,b,c order by a,b,i,c)
793   from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
794 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
795 LINE 1: select aggfns(distinct a,b,c order by a,b,i,c)
796                                                   ^
797 select aggfns(distinct a,a,c order by a,b)
798   from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
799 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
800 LINE 1: select aggfns(distinct a,a,c order by a,b)
801                                                 ^
802 -- string_agg tests
803 select string_agg(a,',') from (values('aaaa'),('bbbb'),('cccc')) g(a);
804    string_agg   
805 ----------------
806  aaaa,bbbb,cccc
807 (1 row)
808
809 select string_agg(a,',') from (values('aaaa'),(null),('bbbb'),('cccc')) g(a);
810    string_agg   
811 ----------------
812  aaaa,bbbb,cccc
813 (1 row)
814
815 select string_agg(a,'AB') from (values(null),(null),('bbbb'),('cccc')) g(a);
816  string_agg 
817 ------------
818  bbbbABcccc
819 (1 row)
820
821 select string_agg(a,',') from (values(null),(null)) g(a);
822  string_agg 
823 ------------
824  
825 (1 row)
826
827 -- check some implicit casting cases, as per bug #5564
828 select string_agg(distinct f1, ',' order by f1) from varchar_tbl;  -- ok
829  string_agg 
830 ------------
831  a,ab,abcd
832 (1 row)
833
834 select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl;  -- not ok
835 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
836 LINE 1: select string_agg(distinct f1::text, ',' order by f1) from v...
837                                                           ^
838 select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl;  -- not ok
839 ERROR:  in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
840 LINE 1: select string_agg(distinct f1, ',' order by f1::text) from v...
841                                                     ^
842 select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl;  -- ok
843  string_agg 
844 ------------
845  a,ab,abcd
846 (1 row)
847