aggregates.out 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815
  1. --
  2. -- AGGREGATES
  3. --
  4. -- avoid bit-exact output here because operations may not be bit-exact.
  5. SET extra_float_digits = 0;
  6. SELECT avg(four) AS avg_1 FROM onek;
  7. avg_1
  8. --------------------
  9. 1.5000000000000000
  10. (1 row)
  11. SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
  12. avg_32
  13. ---------------------
  14. 32.6666666666666667
  15. (1 row)
  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. SELECT avg(gpa) AS avg_3_4 FROM ONLY student;
  24. avg_3_4
  25. ---------
  26. 3.4
  27. (1 row)
  28. SELECT sum(four) AS sum_1500 FROM onek;
  29. sum_1500
  30. ----------
  31. 1500
  32. (1 row)
  33. SELECT sum(a) AS sum_198 FROM aggtest;
  34. sum_198
  35. ---------
  36. 198
  37. (1 row)
  38. SELECT sum(b) AS avg_431_773 FROM aggtest;
  39. avg_431_773
  40. -------------
  41. 431.773
  42. (1 row)
  43. SELECT sum(gpa) AS avg_6_8 FROM ONLY student;
  44. avg_6_8
  45. ---------
  46. 6.8
  47. (1 row)
  48. SELECT max(four) AS max_3 FROM onek;
  49. max_3
  50. -------
  51. 3
  52. (1 row)
  53. SELECT max(a) AS max_100 FROM aggtest;
  54. max_100
  55. ---------
  56. 100
  57. (1 row)
  58. SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
  59. max_324_78
  60. ------------
  61. 324.78
  62. (1 row)
  63. SELECT max(student.gpa) AS max_3_7 FROM student;
  64. max_3_7
  65. ---------
  66. 3.7
  67. (1 row)
  68. SELECT stddev_pop(b) FROM aggtest;
  69. stddev_pop
  70. -----------------
  71. 131.10703231895
  72. (1 row)
  73. SELECT stddev_samp(b) FROM aggtest;
  74. stddev_samp
  75. ------------------
  76. 151.389360803998
  77. (1 row)
  78. SELECT var_pop(b) FROM aggtest;
  79. var_pop
  80. ------------------
  81. 17189.0539234823
  82. (1 row)
  83. SELECT var_samp(b) FROM aggtest;
  84. var_samp
  85. ------------------
  86. 22918.7385646431
  87. (1 row)
  88. SELECT stddev_pop(b::numeric) FROM aggtest;
  89. stddev_pop
  90. ------------------
  91. 131.107032862199
  92. (1 row)
  93. SELECT stddev_samp(b::numeric) FROM aggtest;
  94. stddev_samp
  95. ------------------
  96. 151.389361431288
  97. (1 row)
  98. SELECT var_pop(b::numeric) FROM aggtest;
  99. var_pop
  100. --------------------
  101. 17189.054065929769
  102. (1 row)
  103. SELECT var_samp(b::numeric) FROM aggtest;
  104. var_samp
  105. --------------------
  106. 22918.738754573025
  107. (1 row)
  108. -- population variance is defined for a single tuple, sample variance
  109. -- is not
  110. SELECT var_pop(1.0::float8), var_samp(2.0::float8);
  111. var_pop | var_samp
  112. ---------+----------
  113. 0 |
  114. (1 row)
  115. SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8);
  116. stddev_pop | stddev_samp
  117. ------------+-------------
  118. 0 |
  119. (1 row)
  120. SELECT var_pop('inf'::float8), var_samp('inf'::float8);
  121. var_pop | var_samp
  122. ---------+----------
  123. NaN |
  124. (1 row)
  125. SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8);
  126. stddev_pop | stddev_samp
  127. ------------+-------------
  128. NaN |
  129. (1 row)
  130. SELECT var_pop('nan'::float8), var_samp('nan'::float8);
  131. var_pop | var_samp
  132. ---------+----------
  133. NaN |
  134. (1 row)
  135. SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8);
  136. stddev_pop | stddev_samp
  137. ------------+-------------
  138. NaN |
  139. (1 row)
  140. SELECT var_pop(1.0::float4), var_samp(2.0::float4);
  141. var_pop | var_samp
  142. ---------+----------
  143. 0 |
  144. (1 row)
  145. SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4);
  146. stddev_pop | stddev_samp
  147. ------------+-------------
  148. 0 |
  149. (1 row)
  150. SELECT var_pop('inf'::float4), var_samp('inf'::float4);
  151. var_pop | var_samp
  152. ---------+----------
  153. NaN |
  154. (1 row)
  155. SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4);
  156. stddev_pop | stddev_samp
  157. ------------+-------------
  158. NaN |
  159. (1 row)
  160. SELECT var_pop('nan'::float4), var_samp('nan'::float4);
  161. var_pop | var_samp
  162. ---------+----------
  163. NaN |
  164. (1 row)
  165. SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4);
  166. stddev_pop | stddev_samp
  167. ------------+-------------
  168. NaN |
  169. (1 row)
  170. SELECT var_pop(1.0::numeric), var_samp(2.0::numeric);
  171. var_pop | var_samp
  172. ---------+----------
  173. 0 |
  174. (1 row)
  175. SELECT stddev_pop(3.0::numeric), stddev_samp(4.0::numeric);
  176. stddev_pop | stddev_samp
  177. ------------+-------------
  178. 0 |
  179. (1 row)
  180. SELECT var_pop('inf'::numeric), var_samp('inf'::numeric);
  181. var_pop | var_samp
  182. ---------+----------
  183. NaN |
  184. (1 row)
  185. SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric);
  186. stddev_pop | stddev_samp
  187. ------------+-------------
  188. NaN |
  189. (1 row)
  190. SELECT var_pop('nan'::numeric), var_samp('nan'::numeric);
  191. var_pop | var_samp
  192. ---------+----------
  193. NaN |
  194. (1 row)
  195. SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric);
  196. stddev_pop | stddev_samp
  197. ------------+-------------
  198. NaN |
  199. (1 row)
  200. -- verify correct results for null and NaN inputs
  201. select sum(null::int4) from generate_series(1,3);
  202. sum
  203. -----
  204. (1 row)
  205. select sum(null::int8) from generate_series(1,3);
  206. sum
  207. -----
  208. (1 row)
  209. select sum(null::numeric) from generate_series(1,3);
  210. sum
  211. -----
  212. (1 row)
  213. select sum(null::float8) from generate_series(1,3);
  214. sum
  215. -----
  216. (1 row)
  217. select avg(null::int4) from generate_series(1,3);
  218. avg
  219. -----
  220. (1 row)
  221. select avg(null::int8) from generate_series(1,3);
  222. avg
  223. -----
  224. (1 row)
  225. select avg(null::numeric) from generate_series(1,3);
  226. avg
  227. -----
  228. (1 row)
  229. select avg(null::float8) from generate_series(1,3);
  230. avg
  231. -----
  232. (1 row)
  233. select sum('NaN'::numeric) from generate_series(1,3);
  234. sum
  235. -----
  236. NaN
  237. (1 row)
  238. select avg('NaN'::numeric) from generate_series(1,3);
  239. avg
  240. -----
  241. NaN
  242. (1 row)
  243. -- verify correct results for infinite inputs
  244. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  245. FROM (VALUES ('1'), ('infinity')) v(x);
  246. sum | avg | var_pop
  247. ----------+----------+---------
  248. Infinity | Infinity | NaN
  249. (1 row)
  250. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  251. FROM (VALUES ('infinity'), ('1')) v(x);
  252. sum | avg | var_pop
  253. ----------+----------+---------
  254. Infinity | Infinity | NaN
  255. (1 row)
  256. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  257. FROM (VALUES ('infinity'), ('infinity')) v(x);
  258. sum | avg | var_pop
  259. ----------+----------+---------
  260. Infinity | Infinity | NaN
  261. (1 row)
  262. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  263. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  264. sum | avg | var_pop
  265. -----+-----+---------
  266. NaN | NaN | NaN
  267. (1 row)
  268. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  269. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  270. sum | avg | var_pop
  271. -----------+-----------+---------
  272. -Infinity | -Infinity | NaN
  273. (1 row)
  274. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  275. FROM (VALUES ('1'), ('infinity')) v(x);
  276. sum | avg | var_pop
  277. ----------+----------+---------
  278. Infinity | Infinity | NaN
  279. (1 row)
  280. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  281. FROM (VALUES ('infinity'), ('1')) v(x);
  282. sum | avg | var_pop
  283. ----------+----------+---------
  284. Infinity | Infinity | NaN
  285. (1 row)
  286. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  287. FROM (VALUES ('infinity'), ('infinity')) v(x);
  288. sum | avg | var_pop
  289. ----------+----------+---------
  290. Infinity | Infinity | NaN
  291. (1 row)
  292. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  293. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  294. sum | avg | var_pop
  295. -----+-----+---------
  296. NaN | NaN | NaN
  297. (1 row)
  298. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  299. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  300. sum | avg | var_pop
  301. -----------+-----------+---------
  302. -Infinity | -Infinity | NaN
  303. (1 row)
  304. -- test accuracy with a large input offset
  305. SELECT avg(x::float8), var_pop(x::float8)
  306. FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x);
  307. avg | var_pop
  308. -----------+---------
  309. 100000005 | 2.5
  310. (1 row)
  311. SELECT avg(x::float8), var_pop(x::float8)
  312. FROM (VALUES (7000000000005), (7000000000007)) v(x);
  313. avg | var_pop
  314. ---------------+---------
  315. 7000000000006 | 1
  316. (1 row)
  317. -- SQL2003 binary aggregates
  318. SELECT regr_count(b, a) FROM aggtest;
  319. regr_count
  320. ------------
  321. 4
  322. (1 row)
  323. SELECT regr_sxx(b, a) FROM aggtest;
  324. regr_sxx
  325. ----------
  326. 5099
  327. (1 row)
  328. SELECT regr_syy(b, a) FROM aggtest;
  329. regr_syy
  330. ------------------
  331. 68756.2156939293
  332. (1 row)
  333. SELECT regr_sxy(b, a) FROM aggtest;
  334. regr_sxy
  335. ------------------
  336. 2614.51582155004
  337. (1 row)
  338. SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest;
  339. regr_avgx | regr_avgy
  340. -----------+------------------
  341. 49.5 | 107.943152273074
  342. (1 row)
  343. SELECT regr_r2(b, a) FROM aggtest;
  344. regr_r2
  345. --------------------
  346. 0.0194977982031803
  347. (1 row)
  348. SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest;
  349. regr_slope | regr_intercept
  350. -------------------+------------------
  351. 0.512750700441271 | 82.5619926012309
  352. (1 row)
  353. SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest;
  354. covar_pop | covar_samp
  355. -----------------+------------------
  356. 653.62895538751 | 871.505273850014
  357. (1 row)
  358. SELECT corr(b, a) FROM aggtest;
  359. corr
  360. -------------------
  361. 0.139634516517873
  362. (1 row)
  363. -- check single-tuple behavior
  364. SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8);
  365. covar_pop | covar_samp
  366. -----------+------------
  367. 0 |
  368. (1 row)
  369. SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8);
  370. covar_pop | covar_samp
  371. -----------+------------
  372. NaN |
  373. (1 row)
  374. SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8);
  375. covar_pop | covar_samp
  376. -----------+------------
  377. NaN |
  378. (1 row)
  379. -- test accum and combine functions directly
  380. CREATE TABLE regr_test (x float8, y float8);
  381. INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
  382. SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
  383. FROM regr_test WHERE x IN (10,20,30,80);
  384. count | sum | regr_sxx | sum | regr_syy | regr_sxy
  385. -------+-----+----------+------+----------+----------
  386. 4 | 140 | 2900 | 1290 | 83075 | 15050
  387. (1 row)
  388. SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
  389. FROM regr_test;
  390. count | sum | regr_sxx | sum | regr_syy | regr_sxy
  391. -------+-----+----------+------+----------+----------
  392. 5 | 240 | 6280 | 1490 | 95080 | 8680
  393. (1 row)
  394. SELECT float8_accum('{4,140,2900}'::float8[], 100);
  395. float8_accum
  396. --------------
  397. {5,240,6280}
  398. (1 row)
  399. SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100);
  400. float8_regr_accum
  401. ------------------------------
  402. {5,240,6280,1490,95080,8680}
  403. (1 row)
  404. SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
  405. FROM regr_test WHERE x IN (10,20,30);
  406. count | sum | regr_sxx | sum | regr_syy | regr_sxy
  407. -------+-----+----------+-----+----------+----------
  408. 3 | 60 | 200 | 750 | 20000 | 2000
  409. (1 row)
  410. SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
  411. FROM regr_test WHERE x IN (80,100);
  412. count | sum | regr_sxx | sum | regr_syy | regr_sxy
  413. -------+-----+----------+-----+----------+----------
  414. 2 | 180 | 200 | 740 | 57800 | -3400
  415. (1 row)
  416. SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]);
  417. float8_combine
  418. ----------------
  419. {3,60,200}
  420. (1 row)
  421. SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]);
  422. float8_combine
  423. ----------------
  424. {2,180,200}
  425. (1 row)
  426. SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]);
  427. float8_combine
  428. ----------------
  429. {5,240,6280}
  430. (1 row)
  431. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  432. '{0,0,0,0,0,0}'::float8[]);
  433. float8_regr_combine
  434. ---------------------------
  435. {3,60,200,750,20000,2000}
  436. (1 row)
  437. SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[],
  438. '{2,180,200,740,57800,-3400}'::float8[]);
  439. float8_regr_combine
  440. -----------------------------
  441. {2,180,200,740,57800,-3400}
  442. (1 row)
  443. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  444. '{2,180,200,740,57800,-3400}'::float8[]);
  445. float8_regr_combine
  446. ------------------------------
  447. {5,240,6280,1490,95080,8680}
  448. (1 row)
  449. DROP TABLE regr_test;
  450. -- test count, distinct
  451. SELECT count(four) AS cnt_1000 FROM onek;
  452. cnt_1000
  453. ----------
  454. 1000
  455. (1 row)
  456. SELECT count(DISTINCT four) AS cnt_4 FROM onek;
  457. cnt_4
  458. -------
  459. 4
  460. (1 row)
  461. select ten, count(*), sum(four) from onek
  462. group by ten order by ten;
  463. ten | count | sum
  464. -----+-------+-----
  465. 0 | 100 | 100
  466. 1 | 100 | 200
  467. 2 | 100 | 100
  468. 3 | 100 | 200
  469. 4 | 100 | 100
  470. 5 | 100 | 200
  471. 6 | 100 | 100
  472. 7 | 100 | 200
  473. 8 | 100 | 100
  474. 9 | 100 | 200
  475. (10 rows)
  476. select ten, count(four), sum(DISTINCT four) from onek
  477. group by ten order by ten;
  478. ten | count | sum
  479. -----+-------+-----
  480. 0 | 100 | 2
  481. 1 | 100 | 4
  482. 2 | 100 | 2
  483. 3 | 100 | 4
  484. 4 | 100 | 2
  485. 5 | 100 | 4
  486. 6 | 100 | 2
  487. 7 | 100 | 4
  488. 8 | 100 | 2
  489. 9 | 100 | 4
  490. (10 rows)
  491. -- user-defined aggregates
  492. SELECT newavg(four) AS avg_1 FROM onek;
  493. avg_1
  494. --------------------
  495. 1.5000000000000000
  496. (1 row)
  497. SELECT newsum(four) AS sum_1500 FROM onek;
  498. sum_1500
  499. ----------
  500. 1500
  501. (1 row)
  502. SELECT newcnt(four) AS cnt_1000 FROM onek;
  503. cnt_1000
  504. ----------
  505. 1000
  506. (1 row)
  507. SELECT newcnt(*) AS cnt_1000 FROM onek;
  508. cnt_1000
  509. ----------
  510. 1000
  511. (1 row)
  512. SELECT oldcnt(*) AS cnt_1000 FROM onek;
  513. cnt_1000
  514. ----------
  515. 1000
  516. (1 row)
  517. SELECT sum2(q1,q2) FROM int8_tbl;
  518. sum2
  519. -------------------
  520. 18271560493827981
  521. (1 row)
  522. -- test for outer-level aggregates
  523. -- this should work
  524. select ten, sum(distinct four) from onek a
  525. group by ten
  526. having exists (select 1 from onek b where sum(distinct a.four) = b.four);
  527. ten | sum
  528. -----+-----
  529. 0 | 2
  530. 2 | 2
  531. 4 | 2
  532. 6 | 2
  533. 8 | 2
  534. (5 rows)
  535. -- this should fail because subquery has an agg of its own in WHERE
  536. select ten, sum(distinct four) from onek a
  537. group by ten
  538. having exists (select 1 from onek b
  539. where sum(distinct a.four + b.four) = b.four);
  540. ERROR: aggregate functions are not allowed in WHERE
  541. LINE 4: where sum(distinct a.four + b.four) = b.four)...
  542. ^
  543. -- Test handling of sublinks within outer-level aggregates.
  544. -- Per bug report from Daniel Grace.
  545. select
  546. (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)))
  547. from tenk1 o;
  548. max
  549. ------
  550. 9999
  551. (1 row)
  552. -- Test handling of Params within aggregate arguments in hashed aggregation.
  553. -- Per bug report from Jeevan Chalke.
  554. explain (verbose, costs off)
  555. select s1, s2, sm
  556. from generate_series(1, 3) s1,
  557. lateral (select s2, sum(s1 + s2) sm
  558. from generate_series(1, 3) s2 group by s2) ss
  559. order by 1, 2;
  560. QUERY PLAN
  561. ------------------------------------------------------------------
  562. Sort
  563. Output: s1.s1, s2.s2, (sum((s1.s1 + s2.s2)))
  564. Sort Key: s1.s1, s2.s2
  565. -> Nested Loop
  566. Output: s1.s1, s2.s2, (sum((s1.s1 + s2.s2)))
  567. -> Function Scan on pg_catalog.generate_series s1
  568. Output: s1.s1
  569. Function Call: generate_series(1, 3)
  570. -> HashAggregate
  571. Output: s2.s2, sum((s1.s1 + s2.s2))
  572. Group Key: s2.s2
  573. -> Function Scan on pg_catalog.generate_series s2
  574. Output: s2.s2
  575. Function Call: generate_series(1, 3)
  576. (14 rows)
  577. select s1, s2, sm
  578. from generate_series(1, 3) s1,
  579. lateral (select s2, sum(s1 + s2) sm
  580. from generate_series(1, 3) s2 group by s2) ss
  581. order by 1, 2;
  582. s1 | s2 | sm
  583. ----+----+----
  584. 1 | 1 | 2
  585. 1 | 2 | 3
  586. 1 | 3 | 4
  587. 2 | 1 | 3
  588. 2 | 2 | 4
  589. 2 | 3 | 5
  590. 3 | 1 | 4
  591. 3 | 2 | 5
  592. 3 | 3 | 6
  593. (9 rows)
  594. explain (verbose, costs off)
  595. select array(select sum(x+y) s
  596. from generate_series(1,3) y group by y order by s)
  597. from generate_series(1,3) x;
  598. QUERY PLAN
  599. -------------------------------------------------------------------
  600. Function Scan on pg_catalog.generate_series x
  601. Output: (SubPlan 1)
  602. Function Call: generate_series(1, 3)
  603. SubPlan 1
  604. -> Sort
  605. Output: (sum((x.x + y.y))), y.y
  606. Sort Key: (sum((x.x + y.y)))
  607. -> HashAggregate
  608. Output: sum((x.x + y.y)), y.y
  609. Group Key: y.y
  610. -> Function Scan on pg_catalog.generate_series y
  611. Output: y.y
  612. Function Call: generate_series(1, 3)
  613. (13 rows)
  614. select array(select sum(x+y) s
  615. from generate_series(1,3) y group by y order by s)
  616. from generate_series(1,3) x;
  617. array
  618. ---------
  619. {2,3,4}
  620. {3,4,5}
  621. {4,5,6}
  622. (3 rows)
  623. --
  624. -- test for bitwise integer aggregates
  625. --
  626. CREATE TEMPORARY TABLE bitwise_test(
  627. i2 INT2,
  628. i4 INT4,
  629. i8 INT8,
  630. i INTEGER,
  631. x INT2,
  632. y BIT(4)
  633. );
  634. -- empty case
  635. SELECT
  636. BIT_AND(i2) AS "?",
  637. BIT_OR(i4) AS "?",
  638. BIT_XOR(i8) AS "?"
  639. FROM bitwise_test;
  640. ? | ? | ?
  641. ---+---+---
  642. | |
  643. (1 row)
  644. COPY bitwise_test FROM STDIN NULL 'null';
  645. SELECT
  646. BIT_AND(i2) AS "1",
  647. BIT_AND(i4) AS "1",
  648. BIT_AND(i8) AS "1",
  649. BIT_AND(i) AS "?",
  650. BIT_AND(x) AS "0",
  651. BIT_AND(y) AS "0100",
  652. BIT_OR(i2) AS "7",
  653. BIT_OR(i4) AS "7",
  654. BIT_OR(i8) AS "7",
  655. BIT_OR(i) AS "?",
  656. BIT_OR(x) AS "7",
  657. BIT_OR(y) AS "1101",
  658. BIT_XOR(i2) AS "5",
  659. BIT_XOR(i4) AS "5",
  660. BIT_XOR(i8) AS "5",
  661. BIT_XOR(i) AS "?",
  662. BIT_XOR(x) AS "7",
  663. BIT_XOR(y) AS "1101"
  664. FROM bitwise_test;
  665. 1 | 1 | 1 | ? | 0 | 0100 | 7 | 7 | 7 | ? | 7 | 1101 | 5 | 5 | 5 | ? | 7 | 1101
  666. ---+---+---+---+---+------+---+---+---+---+---+------+---+---+---+---+---+------
  667. 1 | 1 | 1 | 1 | 0 | 0100 | 7 | 7 | 7 | 3 | 7 | 1101 | 5 | 5 | 5 | 2 | 7 | 1101
  668. (1 row)
  669. --
  670. -- test boolean aggregates
  671. --
  672. -- first test all possible transition and final states
  673. SELECT
  674. -- boolean and transitions
  675. -- null because strict
  676. booland_statefunc(NULL, NULL) IS NULL AS "t",
  677. booland_statefunc(TRUE, NULL) IS NULL AS "t",
  678. booland_statefunc(FALSE, NULL) IS NULL AS "t",
  679. booland_statefunc(NULL, TRUE) IS NULL AS "t",
  680. booland_statefunc(NULL, FALSE) IS NULL AS "t",
  681. -- and actual computations
  682. booland_statefunc(TRUE, TRUE) AS "t",
  683. NOT booland_statefunc(TRUE, FALSE) AS "t",
  684. NOT booland_statefunc(FALSE, TRUE) AS "t",
  685. NOT booland_statefunc(FALSE, FALSE) AS "t";
  686. t | t | t | t | t | t | t | t | t
  687. ---+---+---+---+---+---+---+---+---
  688. t | t | t | t | t | t | t | t | t
  689. (1 row)
  690. SELECT
  691. -- boolean or transitions
  692. -- null because strict
  693. boolor_statefunc(NULL, NULL) IS NULL AS "t",
  694. boolor_statefunc(TRUE, NULL) IS NULL AS "t",
  695. boolor_statefunc(FALSE, NULL) IS NULL AS "t",
  696. boolor_statefunc(NULL, TRUE) IS NULL AS "t",
  697. boolor_statefunc(NULL, FALSE) IS NULL AS "t",
  698. -- actual computations
  699. boolor_statefunc(TRUE, TRUE) AS "t",
  700. boolor_statefunc(TRUE, FALSE) AS "t",
  701. boolor_statefunc(FALSE, TRUE) AS "t",
  702. NOT boolor_statefunc(FALSE, FALSE) AS "t";
  703. t | t | t | t | t | t | t | t | t
  704. ---+---+---+---+---+---+---+---+---
  705. t | t | t | t | t | t | t | t | t
  706. (1 row)
  707. CREATE TEMPORARY TABLE bool_test(
  708. b1 BOOL,
  709. b2 BOOL,
  710. b3 BOOL,
  711. b4 BOOL);
  712. -- empty case
  713. SELECT
  714. BOOL_AND(b1) AS "n",
  715. BOOL_OR(b3) AS "n"
  716. FROM bool_test;
  717. n | n
  718. ---+---
  719. |
  720. (1 row)
  721. COPY bool_test FROM STDIN NULL 'null';
  722. SELECT
  723. BOOL_AND(b1) AS "f",
  724. BOOL_AND(b2) AS "t",
  725. BOOL_AND(b3) AS "f",
  726. BOOL_AND(b4) AS "n",
  727. BOOL_AND(NOT b2) AS "f",
  728. BOOL_AND(NOT b3) AS "t"
  729. FROM bool_test;
  730. f | t | f | n | f | t
  731. ---+---+---+---+---+---
  732. f | t | f | | f | t
  733. (1 row)
  734. SELECT
  735. EVERY(b1) AS "f",
  736. EVERY(b2) AS "t",
  737. EVERY(b3) AS "f",
  738. EVERY(b4) AS "n",
  739. EVERY(NOT b2) AS "f",
  740. EVERY(NOT b3) AS "t"
  741. FROM bool_test;
  742. f | t | f | n | f | t
  743. ---+---+---+---+---+---
  744. f | t | f | | f | t
  745. (1 row)
  746. SELECT
  747. BOOL_OR(b1) AS "t",
  748. BOOL_OR(b2) AS "t",
  749. BOOL_OR(b3) AS "f",
  750. BOOL_OR(b4) AS "n",
  751. BOOL_OR(NOT b2) AS "f",
  752. BOOL_OR(NOT b3) AS "t"
  753. FROM bool_test;
  754. t | t | f | n | f | t
  755. ---+---+---+---+---+---
  756. t | t | f | | f | t
  757. (1 row)
  758. --
  759. -- Test cases that should be optimized into indexscans instead of
  760. -- the generic aggregate implementation.
  761. --
  762. -- Basic cases
  763. explain (costs off)
  764. select min(unique1) from tenk1;
  765. QUERY PLAN
  766. ------------------------------------------------------------
  767. Result
  768. InitPlan 1 (returns $0)
  769. -> Limit
  770. -> Index Only Scan using tenk1_unique1 on tenk1
  771. Index Cond: (unique1 IS NOT NULL)
  772. (5 rows)
  773. select min(unique1) from tenk1;
  774. min
  775. -----
  776. 0
  777. (1 row)
  778. explain (costs off)
  779. select max(unique1) from tenk1;
  780. QUERY PLAN
  781. ---------------------------------------------------------------------
  782. Result
  783. InitPlan 1 (returns $0)
  784. -> Limit
  785. -> Index Only Scan Backward using tenk1_unique1 on tenk1
  786. Index Cond: (unique1 IS NOT NULL)
  787. (5 rows)
  788. select max(unique1) from tenk1;
  789. max
  790. ------
  791. 9999
  792. (1 row)
  793. explain (costs off)
  794. select max(unique1) from tenk1 where unique1 < 42;
  795. QUERY PLAN
  796. ------------------------------------------------------------------------
  797. Result
  798. InitPlan 1 (returns $0)
  799. -> Limit
  800. -> Index Only Scan Backward using tenk1_unique1 on tenk1
  801. Index Cond: ((unique1 IS NOT NULL) AND (unique1 < 42))
  802. (5 rows)
  803. select max(unique1) from tenk1 where unique1 < 42;
  804. max
  805. -----
  806. 41
  807. (1 row)
  808. explain (costs off)
  809. select max(unique1) from tenk1 where unique1 > 42;
  810. QUERY PLAN
  811. ------------------------------------------------------------------------
  812. Result
  813. InitPlan 1 (returns $0)
  814. -> Limit
  815. -> Index Only Scan Backward using tenk1_unique1 on tenk1
  816. Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42))
  817. (5 rows)
  818. select max(unique1) from tenk1 where unique1 > 42;
  819. max
  820. ------
  821. 9999
  822. (1 row)
  823. -- the planner may choose a generic aggregate here if parallel query is
  824. -- enabled, since that plan will be parallel safe and the "optimized"
  825. -- plan, which has almost identical cost, will not be. we want to test
  826. -- the optimized plan, so temporarily disable parallel query.
  827. begin;
  828. set local max_parallel_workers_per_gather = 0;
  829. explain (costs off)
  830. select max(unique1) from tenk1 where unique1 > 42000;
  831. QUERY PLAN
  832. ---------------------------------------------------------------------------
  833. Result
  834. InitPlan 1 (returns $0)
  835. -> Limit
  836. -> Index Only Scan Backward using tenk1_unique1 on tenk1
  837. Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42000))
  838. (5 rows)
  839. select max(unique1) from tenk1 where unique1 > 42000;
  840. max
  841. -----
  842. (1 row)
  843. rollback;
  844. -- multi-column index (uses tenk1_thous_tenthous)
  845. explain (costs off)
  846. select max(tenthous) from tenk1 where thousand = 33;
  847. QUERY PLAN
  848. ----------------------------------------------------------------------------
  849. Result
  850. InitPlan 1 (returns $0)
  851. -> Limit
  852. -> Index Only Scan Backward using tenk1_thous_tenthous on tenk1
  853. Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL))
  854. (5 rows)
  855. select max(tenthous) from tenk1 where thousand = 33;
  856. max
  857. ------
  858. 9033
  859. (1 row)
  860. explain (costs off)
  861. select min(tenthous) from tenk1 where thousand = 33;
  862. QUERY PLAN
  863. --------------------------------------------------------------------------
  864. Result
  865. InitPlan 1 (returns $0)
  866. -> Limit
  867. -> Index Only Scan using tenk1_thous_tenthous on tenk1
  868. Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL))
  869. (5 rows)
  870. select min(tenthous) from tenk1 where thousand = 33;
  871. min
  872. -----
  873. 33
  874. (1 row)
  875. -- check parameter propagation into an indexscan subquery
  876. explain (costs off)
  877. select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
  878. from int4_tbl;
  879. QUERY PLAN
  880. -----------------------------------------------------------------------------------------
  881. Seq Scan on int4_tbl
  882. SubPlan 2
  883. -> Result
  884. InitPlan 1 (returns $1)
  885. -> Limit
  886. -> Index Only Scan using tenk1_unique1 on tenk1
  887. Index Cond: ((unique1 IS NOT NULL) AND (unique1 > int4_tbl.f1))
  888. (7 rows)
  889. select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
  890. from int4_tbl;
  891. f1 | gt
  892. -------------+----
  893. 0 | 1
  894. 123456 |
  895. -123456 | 0
  896. 2147483647 |
  897. -2147483647 | 0
  898. (5 rows)
  899. -- check some cases that were handled incorrectly in 8.3.0
  900. explain (costs off)
  901. select distinct max(unique2) from tenk1;
  902. QUERY PLAN
  903. ---------------------------------------------------------------------
  904. HashAggregate
  905. Group Key: $0
  906. InitPlan 1 (returns $0)
  907. -> Limit
  908. -> Index Only Scan Backward using tenk1_unique2 on tenk1
  909. Index Cond: (unique2 IS NOT NULL)
  910. -> Result
  911. (7 rows)
  912. select distinct max(unique2) from tenk1;
  913. max
  914. ------
  915. 9999
  916. (1 row)
  917. explain (costs off)
  918. select max(unique2) from tenk1 order by 1;
  919. QUERY PLAN
  920. ---------------------------------------------------------------------
  921. Sort
  922. Sort Key: ($0)
  923. InitPlan 1 (returns $0)
  924. -> Limit
  925. -> Index Only Scan Backward using tenk1_unique2 on tenk1
  926. Index Cond: (unique2 IS NOT NULL)
  927. -> Result
  928. (7 rows)
  929. select max(unique2) from tenk1 order by 1;
  930. max
  931. ------
  932. 9999
  933. (1 row)
  934. explain (costs off)
  935. select max(unique2) from tenk1 order by max(unique2);
  936. QUERY PLAN
  937. ---------------------------------------------------------------------
  938. Sort
  939. Sort Key: ($0)
  940. InitPlan 1 (returns $0)
  941. -> Limit
  942. -> Index Only Scan Backward using tenk1_unique2 on tenk1
  943. Index Cond: (unique2 IS NOT NULL)
  944. -> Result
  945. (7 rows)
  946. select max(unique2) from tenk1 order by max(unique2);
  947. max
  948. ------
  949. 9999
  950. (1 row)
  951. explain (costs off)
  952. select max(unique2) from tenk1 order by max(unique2)+1;
  953. QUERY PLAN
  954. ---------------------------------------------------------------------
  955. Sort
  956. Sort Key: (($0 + 1))
  957. InitPlan 1 (returns $0)
  958. -> Limit
  959. -> Index Only Scan Backward using tenk1_unique2 on tenk1
  960. Index Cond: (unique2 IS NOT NULL)
  961. -> Result
  962. (7 rows)
  963. select max(unique2) from tenk1 order by max(unique2)+1;
  964. max
  965. ------
  966. 9999
  967. (1 row)
  968. explain (costs off)
  969. select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
  970. QUERY PLAN
  971. ---------------------------------------------------------------------
  972. Sort
  973. Sort Key: (generate_series(1, 3)) DESC
  974. InitPlan 1 (returns $0)
  975. -> Limit
  976. -> Index Only Scan Backward using tenk1_unique2 on tenk1
  977. Index Cond: (unique2 IS NOT NULL)
  978. -> ProjectSet
  979. -> Result
  980. (8 rows)
  981. select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
  982. max | g
  983. ------+---
  984. 9999 | 3
  985. 9999 | 2
  986. 9999 | 1
  987. (3 rows)
  988. -- interesting corner case: constant gets optimized into a seqscan
  989. explain (costs off)
  990. select max(100) from tenk1;
  991. QUERY PLAN
  992. ----------------------------------------------------
  993. Result
  994. InitPlan 1 (returns $0)
  995. -> Limit
  996. -> Result
  997. One-Time Filter: (100 IS NOT NULL)
  998. -> Seq Scan on tenk1
  999. (6 rows)
  1000. select max(100) from tenk1;
  1001. max
  1002. -----
  1003. 100
  1004. (1 row)
  1005. -- try it on an inheritance tree
  1006. create table minmaxtest(f1 int);
  1007. create table minmaxtest1() inherits (minmaxtest);
  1008. create table minmaxtest2() inherits (minmaxtest);
  1009. create table minmaxtest3() inherits (minmaxtest);
  1010. create index minmaxtesti on minmaxtest(f1);
  1011. create index minmaxtest1i on minmaxtest1(f1);
  1012. create index minmaxtest2i on minmaxtest2(f1 desc);
  1013. create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
  1014. insert into minmaxtest values(11), (12);
  1015. insert into minmaxtest1 values(13), (14);
  1016. insert into minmaxtest2 values(15), (16);
  1017. insert into minmaxtest3 values(17), (18);
  1018. explain (costs off)
  1019. select min(f1), max(f1) from minmaxtest;
  1020. QUERY PLAN
  1021. ---------------------------------------------------------------------------------------------
  1022. Result
  1023. InitPlan 1 (returns $0)
  1024. -> Limit
  1025. -> Merge Append
  1026. Sort Key: minmaxtest.f1
  1027. -> Index Only Scan using minmaxtesti on minmaxtest minmaxtest_1
  1028. Index Cond: (f1 IS NOT NULL)
  1029. -> Index Only Scan using minmaxtest1i on minmaxtest1 minmaxtest_2
  1030. Index Cond: (f1 IS NOT NULL)
  1031. -> Index Only Scan Backward using minmaxtest2i on minmaxtest2 minmaxtest_3
  1032. Index Cond: (f1 IS NOT NULL)
  1033. -> Index Only Scan using minmaxtest3i on minmaxtest3 minmaxtest_4
  1034. InitPlan 2 (returns $1)
  1035. -> Limit
  1036. -> Merge Append
  1037. Sort Key: minmaxtest_5.f1 DESC
  1038. -> Index Only Scan Backward using minmaxtesti on minmaxtest minmaxtest_6
  1039. Index Cond: (f1 IS NOT NULL)
  1040. -> Index Only Scan Backward using minmaxtest1i on minmaxtest1 minmaxtest_7
  1041. Index Cond: (f1 IS NOT NULL)
  1042. -> Index Only Scan using minmaxtest2i on minmaxtest2 minmaxtest_8
  1043. Index Cond: (f1 IS NOT NULL)
  1044. -> Index Only Scan Backward using minmaxtest3i on minmaxtest3 minmaxtest_9
  1045. (23 rows)
  1046. select min(f1), max(f1) from minmaxtest;
  1047. min | max
  1048. -----+-----
  1049. 11 | 18
  1050. (1 row)
  1051. -- DISTINCT doesn't do anything useful here, but it shouldn't fail
  1052. explain (costs off)
  1053. select distinct min(f1), max(f1) from minmaxtest;
  1054. QUERY PLAN
  1055. ---------------------------------------------------------------------------------------------
  1056. Unique
  1057. InitPlan 1 (returns $0)
  1058. -> Limit
  1059. -> Merge Append
  1060. Sort Key: minmaxtest.f1
  1061. -> Index Only Scan using minmaxtesti on minmaxtest minmaxtest_1
  1062. Index Cond: (f1 IS NOT NULL)
  1063. -> Index Only Scan using minmaxtest1i on minmaxtest1 minmaxtest_2
  1064. Index Cond: (f1 IS NOT NULL)
  1065. -> Index Only Scan Backward using minmaxtest2i on minmaxtest2 minmaxtest_3
  1066. Index Cond: (f1 IS NOT NULL)
  1067. -> Index Only Scan using minmaxtest3i on minmaxtest3 minmaxtest_4
  1068. InitPlan 2 (returns $1)
  1069. -> Limit
  1070. -> Merge Append
  1071. Sort Key: minmaxtest_5.f1 DESC
  1072. -> Index Only Scan Backward using minmaxtesti on minmaxtest minmaxtest_6
  1073. Index Cond: (f1 IS NOT NULL)
  1074. -> Index Only Scan Backward using minmaxtest1i on minmaxtest1 minmaxtest_7
  1075. Index Cond: (f1 IS NOT NULL)
  1076. -> Index Only Scan using minmaxtest2i on minmaxtest2 minmaxtest_8
  1077. Index Cond: (f1 IS NOT NULL)
  1078. -> Index Only Scan Backward using minmaxtest3i on minmaxtest3 minmaxtest_9
  1079. -> Sort
  1080. Sort Key: ($0), ($1)
  1081. -> Result
  1082. (26 rows)
  1083. select distinct min(f1), max(f1) from minmaxtest;
  1084. min | max
  1085. -----+-----
  1086. 11 | 18
  1087. (1 row)
  1088. drop table minmaxtest cascade;
  1089. NOTICE: drop cascades to 3 other objects
  1090. DETAIL: drop cascades to table minmaxtest1
  1091. drop cascades to table minmaxtest2
  1092. drop cascades to table minmaxtest3
  1093. -- check for correct detection of nested-aggregate errors
  1094. select max(min(unique1)) from tenk1;
  1095. ERROR: aggregate function calls cannot be nested
  1096. LINE 1: select max(min(unique1)) from tenk1;
  1097. ^
  1098. select (select max(min(unique1)) from int8_tbl) from tenk1;
  1099. ERROR: aggregate function calls cannot be nested
  1100. LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1;
  1101. ^
  1102. --
  1103. -- Test removal of redundant GROUP BY columns
  1104. --
  1105. create temp table t1 (a int, b int, c int, d int, primary key (a, b));
  1106. create temp table t2 (x int, y int, z int, primary key (x, y));
  1107. create temp table t3 (a int, b int, c int, primary key(a, b) deferrable);
  1108. -- Non-primary-key columns can be removed from GROUP BY
  1109. explain (costs off) select * from t1 group by a,b,c,d;
  1110. QUERY PLAN
  1111. ----------------------
  1112. HashAggregate
  1113. Group Key: a, b
  1114. -> Seq Scan on t1
  1115. (3 rows)
  1116. -- No removal can happen if the complete PK is not present in GROUP BY
  1117. explain (costs off) select a,c from t1 group by a,c,d;
  1118. QUERY PLAN
  1119. ----------------------
  1120. HashAggregate
  1121. Group Key: a, c, d
  1122. -> Seq Scan on t1
  1123. (3 rows)
  1124. -- Test removal across multiple relations
  1125. explain (costs off) select *
  1126. from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y
  1127. group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.y,t2.z;
  1128. QUERY PLAN
  1129. ------------------------------------------------------
  1130. HashAggregate
  1131. Group Key: t1.a, t1.b, t2.x, t2.y
  1132. -> Hash Join
  1133. Hash Cond: ((t2.x = t1.a) AND (t2.y = t1.b))
  1134. -> Seq Scan on t2
  1135. -> Hash
  1136. -> Seq Scan on t1
  1137. (7 rows)
  1138. -- Test case where t1 can be optimized but not t2
  1139. explain (costs off) select t1.*,t2.x,t2.z
  1140. from t1 inner join t2 on t1.a = t2.x and t1.b = t2.y
  1141. group by t1.a,t1.b,t1.c,t1.d,t2.x,t2.z;
  1142. QUERY PLAN
  1143. ------------------------------------------------------
  1144. HashAggregate
  1145. Group Key: t1.a, t1.b, t2.x, t2.z
  1146. -> Hash Join
  1147. Hash Cond: ((t2.x = t1.a) AND (t2.y = t1.b))
  1148. -> Seq Scan on t2
  1149. -> Hash
  1150. -> Seq Scan on t1
  1151. (7 rows)
  1152. -- Cannot optimize when PK is deferrable
  1153. explain (costs off) select * from t3 group by a,b,c;
  1154. QUERY PLAN
  1155. ----------------------
  1156. HashAggregate
  1157. Group Key: a, b, c
  1158. -> Seq Scan on t3
  1159. (3 rows)
  1160. create temp table t1c () inherits (t1);
  1161. -- Ensure we don't remove any columns when t1 has a child table
  1162. explain (costs off) select * from t1 group by a,b,c,d;
  1163. QUERY PLAN
  1164. -------------------------------------
  1165. HashAggregate
  1166. Group Key: t1.a, t1.b, t1.c, t1.d
  1167. -> Append
  1168. -> Seq Scan on t1 t1_1
  1169. -> Seq Scan on t1c t1_2
  1170. (5 rows)
  1171. -- Okay to remove columns if we're only querying the parent.
  1172. explain (costs off) select * from only t1 group by a,b,c,d;
  1173. QUERY PLAN
  1174. ----------------------
  1175. HashAggregate
  1176. Group Key: a, b
  1177. -> Seq Scan on t1
  1178. (3 rows)
  1179. create temp table p_t1 (
  1180. a int,
  1181. b int,
  1182. c int,
  1183. d int,
  1184. primary key(a,b)
  1185. ) partition by list(a);
  1186. create temp table p_t1_1 partition of p_t1 for values in(1);
  1187. create temp table p_t1_2 partition of p_t1 for values in(2);
  1188. -- Ensure we can remove non-PK columns for partitioned tables.
  1189. explain (costs off) select * from p_t1 group by a,b,c,d;
  1190. QUERY PLAN
  1191. --------------------------------
  1192. HashAggregate
  1193. Group Key: p_t1.a, p_t1.b
  1194. -> Append
  1195. -> Seq Scan on p_t1_1
  1196. -> Seq Scan on p_t1_2
  1197. (5 rows)
  1198. drop table t1 cascade;
  1199. NOTICE: drop cascades to table t1c
  1200. drop table t2;
  1201. drop table t3;
  1202. drop table p_t1;
  1203. --
  1204. -- Test GROUP BY matching of join columns that are type-coerced due to USING
  1205. --
  1206. create temp table t1(f1 int, f2 bigint);
  1207. create temp table t2(f1 bigint, f22 bigint);
  1208. select f1 from t1 left join t2 using (f1) group by f1;
  1209. f1
  1210. ----
  1211. (0 rows)
  1212. select f1 from t1 left join t2 using (f1) group by t1.f1;
  1213. f1
  1214. ----
  1215. (0 rows)
  1216. select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
  1217. f1
  1218. ----
  1219. (0 rows)
  1220. -- only this one should fail:
  1221. select t1.f1 from t1 left join t2 using (f1) group by f1;
  1222. ERROR: column "t1.f1" must appear in the GROUP BY clause or be used in an aggregate function
  1223. LINE 1: select t1.f1 from t1 left join t2 using (f1) group by f1;
  1224. ^
  1225. drop table t1, t2;
  1226. --
  1227. -- Test combinations of DISTINCT and/or ORDER BY
  1228. --
  1229. select array_agg(a order by b)
  1230. from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
  1231. array_agg
  1232. -----------
  1233. {3,4,2,1}
  1234. (1 row)
  1235. select array_agg(a order by a)
  1236. from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
  1237. array_agg
  1238. -----------
  1239. {1,2,3,4}
  1240. (1 row)
  1241. select array_agg(a order by a desc)
  1242. from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
  1243. array_agg
  1244. -----------
  1245. {4,3,2,1}
  1246. (1 row)
  1247. select array_agg(b order by a desc)
  1248. from (values (1,4),(2,3),(3,1),(4,2)) v(a,b);
  1249. array_agg
  1250. -----------
  1251. {2,1,3,4}
  1252. (1 row)
  1253. select array_agg(distinct a)
  1254. from (values (1),(2),(1),(3),(null),(2)) v(a);
  1255. array_agg
  1256. --------------
  1257. {1,2,3,NULL}
  1258. (1 row)
  1259. select array_agg(distinct a order by a)
  1260. from (values (1),(2),(1),(3),(null),(2)) v(a);
  1261. array_agg
  1262. --------------
  1263. {1,2,3,NULL}
  1264. (1 row)
  1265. select array_agg(distinct a order by a desc)
  1266. from (values (1),(2),(1),(3),(null),(2)) v(a);
  1267. array_agg
  1268. --------------
  1269. {NULL,3,2,1}
  1270. (1 row)
  1271. select array_agg(distinct a order by a desc nulls last)
  1272. from (values (1),(2),(1),(3),(null),(2)) v(a);
  1273. array_agg
  1274. --------------
  1275. {3,2,1,NULL}
  1276. (1 row)
  1277. -- multi-arg aggs, strict/nonstrict, distinct/order by
  1278. select aggfstr(a,b,c)
  1279. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1280. aggfstr
  1281. ---------------------------------------
  1282. {"(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1283. (1 row)
  1284. select aggfns(a,b,c)
  1285. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1286. aggfns
  1287. -----------------------------------------------
  1288. {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"}
  1289. (1 row)
  1290. select aggfstr(distinct a,b,c)
  1291. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1292. generate_series(1,3) i;
  1293. aggfstr
  1294. ---------------------------------------
  1295. {"(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1296. (1 row)
  1297. select aggfns(distinct a,b,c)
  1298. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1299. generate_series(1,3) i;
  1300. aggfns
  1301. -----------------------------------------------
  1302. {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1303. (1 row)
  1304. select aggfstr(distinct a,b,c order by b)
  1305. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1306. generate_series(1,3) i;
  1307. aggfstr
  1308. ---------------------------------------
  1309. {"(3,1,baz)","(2,2,bar)","(1,3,foo)"}
  1310. (1 row)
  1311. select aggfns(distinct a,b,c order by b)
  1312. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1313. generate_series(1,3) i;
  1314. aggfns
  1315. -----------------------------------------------
  1316. {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
  1317. (1 row)
  1318. -- test specific code paths
  1319. select aggfns(distinct a,a,c order by c using ~<~,a)
  1320. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1321. generate_series(1,2) i;
  1322. aggfns
  1323. ------------------------------------------------
  1324. {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"}
  1325. (1 row)
  1326. select aggfns(distinct a,a,c order by c using ~<~)
  1327. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1328. generate_series(1,2) i;
  1329. aggfns
  1330. ------------------------------------------------
  1331. {"(2,2,bar)","(3,3,baz)","(1,1,foo)","(0,0,)"}
  1332. (1 row)
  1333. select aggfns(distinct a,a,c order by a)
  1334. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1335. generate_series(1,2) i;
  1336. aggfns
  1337. ------------------------------------------------
  1338. {"(0,0,)","(1,1,foo)","(2,2,bar)","(3,3,baz)"}
  1339. (1 row)
  1340. select aggfns(distinct a,b,c order by a,c using ~<~,b)
  1341. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1342. generate_series(1,2) i;
  1343. aggfns
  1344. -----------------------------------------------
  1345. {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1346. (1 row)
  1347. -- check node I/O via view creation and usage, also deparsing logic
  1348. create view agg_view1 as
  1349. select aggfns(a,b,c)
  1350. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1351. select * from agg_view1;
  1352. aggfns
  1353. -----------------------------------------------
  1354. {"(1,3,foo)","(0,,)","(2,2,bar)","(3,1,baz)"}
  1355. (1 row)
  1356. select pg_get_viewdef('agg_view1'::regclass);
  1357. pg_get_viewdef
  1358. ---------------------------------------------------------------------------------------------------------------------
  1359. SELECT aggfns(v.a, v.b, v.c) AS aggfns +
  1360. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
  1361. (1 row)
  1362. create or replace view agg_view1 as
  1363. select aggfns(distinct a,b,c)
  1364. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1365. generate_series(1,3) i;
  1366. select * from agg_view1;
  1367. aggfns
  1368. -----------------------------------------------
  1369. {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1370. (1 row)
  1371. select pg_get_viewdef('agg_view1'::regclass);
  1372. pg_get_viewdef
  1373. ---------------------------------------------------------------------------------------------------------------------
  1374. SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns +
  1375. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+
  1376. generate_series(1, 3) i(i);
  1377. (1 row)
  1378. create or replace view agg_view1 as
  1379. select aggfns(distinct a,b,c order by b)
  1380. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1381. generate_series(1,3) i;
  1382. select * from agg_view1;
  1383. aggfns
  1384. -----------------------------------------------
  1385. {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
  1386. (1 row)
  1387. select pg_get_viewdef('agg_view1'::regclass);
  1388. pg_get_viewdef
  1389. ---------------------------------------------------------------------------------------------------------------------
  1390. SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns +
  1391. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+
  1392. generate_series(1, 3) i(i);
  1393. (1 row)
  1394. create or replace view agg_view1 as
  1395. select aggfns(a,b,c order by b+1)
  1396. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1397. select * from agg_view1;
  1398. aggfns
  1399. -----------------------------------------------
  1400. {"(3,1,baz)","(2,2,bar)","(1,3,foo)","(0,,)"}
  1401. (1 row)
  1402. select pg_get_viewdef('agg_view1'::regclass);
  1403. pg_get_viewdef
  1404. ---------------------------------------------------------------------------------------------------------------------
  1405. SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns +
  1406. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
  1407. (1 row)
  1408. create or replace view agg_view1 as
  1409. select aggfns(a,a,c order by b)
  1410. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1411. select * from agg_view1;
  1412. aggfns
  1413. ------------------------------------------------
  1414. {"(3,3,baz)","(2,2,bar)","(1,1,foo)","(0,0,)"}
  1415. (1 row)
  1416. select pg_get_viewdef('agg_view1'::regclass);
  1417. pg_get_viewdef
  1418. ---------------------------------------------------------------------------------------------------------------------
  1419. SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns +
  1420. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
  1421. (1 row)
  1422. create or replace view agg_view1 as
  1423. select aggfns(a,b,c order by c using ~<~)
  1424. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c);
  1425. select * from agg_view1;
  1426. aggfns
  1427. -----------------------------------------------
  1428. {"(2,2,bar)","(3,1,baz)","(1,3,foo)","(0,,)"}
  1429. (1 row)
  1430. select pg_get_viewdef('agg_view1'::regclass);
  1431. pg_get_viewdef
  1432. ---------------------------------------------------------------------------------------------------------------------
  1433. SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns +
  1434. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
  1435. (1 row)
  1436. create or replace view agg_view1 as
  1437. select aggfns(distinct a,b,c order by a,c using ~<~,b)
  1438. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1439. generate_series(1,2) i;
  1440. select * from agg_view1;
  1441. aggfns
  1442. -----------------------------------------------
  1443. {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"}
  1444. (1 row)
  1445. select pg_get_viewdef('agg_view1'::regclass);
  1446. pg_get_viewdef
  1447. ---------------------------------------------------------------------------------------------------------------------
  1448. SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns +
  1449. FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c),+
  1450. generate_series(1, 2) i(i);
  1451. (1 row)
  1452. drop view agg_view1;
  1453. -- incorrect DISTINCT usage errors
  1454. select aggfns(distinct a,b,c order by i)
  1455. from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
  1456. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1457. LINE 1: select aggfns(distinct a,b,c order by i)
  1458. ^
  1459. select aggfns(distinct a,b,c order by a,b+1)
  1460. from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
  1461. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1462. LINE 1: select aggfns(distinct a,b,c order by a,b+1)
  1463. ^
  1464. select aggfns(distinct a,b,c order by a,b,i,c)
  1465. from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
  1466. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1467. LINE 1: select aggfns(distinct a,b,c order by a,b,i,c)
  1468. ^
  1469. select aggfns(distinct a,a,c order by a,b)
  1470. from (values (1,1,'foo')) v(a,b,c), generate_series(1,2) i;
  1471. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1472. LINE 1: select aggfns(distinct a,a,c order by a,b)
  1473. ^
  1474. -- string_agg tests
  1475. select string_agg(a,',') from (values('aaaa'),('bbbb'),('cccc')) g(a);
  1476. string_agg
  1477. ----------------
  1478. aaaa,bbbb,cccc
  1479. (1 row)
  1480. select string_agg(a,',') from (values('aaaa'),(null),('bbbb'),('cccc')) g(a);
  1481. string_agg
  1482. ----------------
  1483. aaaa,bbbb,cccc
  1484. (1 row)
  1485. select string_agg(a,'AB') from (values(null),(null),('bbbb'),('cccc')) g(a);
  1486. string_agg
  1487. ------------
  1488. bbbbABcccc
  1489. (1 row)
  1490. select string_agg(a,',') from (values(null),(null)) g(a);
  1491. string_agg
  1492. ------------
  1493. (1 row)
  1494. -- check some implicit casting cases, as per bug #5564
  1495. select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
  1496. string_agg
  1497. ------------
  1498. a,ab,abcd
  1499. (1 row)
  1500. select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
  1501. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1502. LINE 1: select string_agg(distinct f1::text, ',' order by f1) from v...
  1503. ^
  1504. select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
  1505. ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
  1506. LINE 1: select string_agg(distinct f1, ',' order by f1::text) from v...
  1507. ^
  1508. select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
  1509. string_agg
  1510. ------------
  1511. a,ab,abcd
  1512. (1 row)
  1513. -- string_agg bytea tests
  1514. create table bytea_test_table(v bytea);
  1515. select string_agg(v, '') from bytea_test_table;
  1516. string_agg
  1517. ------------
  1518. (1 row)
  1519. insert into bytea_test_table values(decode('ff','hex'));
  1520. select string_agg(v, '') from bytea_test_table;
  1521. string_agg
  1522. ------------
  1523. \xff
  1524. (1 row)
  1525. insert into bytea_test_table values(decode('aa','hex'));
  1526. select string_agg(v, '') from bytea_test_table;
  1527. string_agg
  1528. ------------
  1529. \xffaa
  1530. (1 row)
  1531. select string_agg(v, NULL) from bytea_test_table;
  1532. string_agg
  1533. ------------
  1534. \xffaa
  1535. (1 row)
  1536. select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
  1537. string_agg
  1538. ------------
  1539. \xffeeaa
  1540. (1 row)
  1541. drop table bytea_test_table;
  1542. -- FILTER tests
  1543. select min(unique1) filter (where unique1 > 100) from tenk1;
  1544. min
  1545. -----
  1546. 101
  1547. (1 row)
  1548. select sum(1/ten) filter (where ten > 0) from tenk1;
  1549. sum
  1550. ------
  1551. 1000
  1552. (1 row)
  1553. select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
  1554. group by ten;
  1555. ten | sum
  1556. -----+-----
  1557. 0 |
  1558. 1 |
  1559. 2 |
  1560. 3 |
  1561. 4 |
  1562. 5 |
  1563. 6 |
  1564. 7 |
  1565. 8 |
  1566. 9 |
  1567. (10 rows)
  1568. select ten, sum(distinct four) filter (where four > 10) from onek a
  1569. group by ten
  1570. having exists (select 1 from onek b where sum(distinct a.four) = b.four);
  1571. ten | sum
  1572. -----+-----
  1573. 0 |
  1574. 2 |
  1575. 4 |
  1576. 6 |
  1577. 8 |
  1578. (5 rows)
  1579. select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
  1580. from (values ('a', 'b')) AS v(foo,bar);
  1581. max
  1582. -----
  1583. a
  1584. (1 row)
  1585. -- outer reference in FILTER (PostgreSQL extension)
  1586. select (select count(*)
  1587. from (values (1)) t0(inner_c))
  1588. from (values (2),(3)) t1(outer_c); -- inner query is aggregation query
  1589. count
  1590. -------
  1591. 1
  1592. 1
  1593. (2 rows)
  1594. select (select count(*) filter (where outer_c <> 0)
  1595. from (values (1)) t0(inner_c))
  1596. from (values (2),(3)) t1(outer_c); -- outer query is aggregation query
  1597. count
  1598. -------
  1599. 2
  1600. (1 row)
  1601. select (select count(inner_c) filter (where outer_c <> 0)
  1602. from (values (1)) t0(inner_c))
  1603. from (values (2),(3)) t1(outer_c); -- inner query is aggregation query
  1604. count
  1605. -------
  1606. 1
  1607. 1
  1608. (2 rows)
  1609. select
  1610. (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1))
  1611. filter (where o.unique1 < 10))
  1612. from tenk1 o; -- outer query is aggregation query
  1613. max
  1614. ------
  1615. 9998
  1616. (1 row)
  1617. -- subquery in FILTER clause (PostgreSQL extension)
  1618. select sum(unique1) FILTER (WHERE
  1619. unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
  1620. sum
  1621. ------
  1622. 4950
  1623. (1 row)
  1624. -- exercise lots of aggregate parts with FILTER
  1625. select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1)
  1626. from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c),
  1627. generate_series(1,2) i;
  1628. aggfns
  1629. ---------------------------
  1630. {"(2,2,bar)","(3,1,baz)"}
  1631. (1 row)
  1632. -- check handling of bare boolean Var in FILTER
  1633. select max(0) filter (where b1) from bool_test;
  1634. max
  1635. -----
  1636. 0
  1637. (1 row)
  1638. select (select max(0) filter (where b1)) from bool_test;
  1639. max
  1640. -----
  1641. 0
  1642. (1 row)
  1643. -- check for correct detection of nested-aggregate errors in FILTER
  1644. select max(unique1) filter (where sum(ten) > 0) from tenk1;
  1645. ERROR: aggregate functions are not allowed in FILTER
  1646. LINE 1: select max(unique1) filter (where sum(ten) > 0) from tenk1;
  1647. ^
  1648. select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
  1649. ERROR: aggregate function calls cannot be nested
  1650. LINE 1: select (select max(unique1) filter (where sum(ten) > 0) from...
  1651. ^
  1652. select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
  1653. ERROR: aggregate functions are not allowed in FILTER
  1654. LINE 1: select max(unique1) filter (where bool_or(ten > 0)) from ten...
  1655. ^
  1656. select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
  1657. ERROR: aggregate function calls cannot be nested
  1658. LINE 1: select (select max(unique1) filter (where bool_or(ten > 0)) ...
  1659. ^
  1660. -- ordered-set aggregates
  1661. select p, percentile_cont(p) within group (order by x::float8)
  1662. from generate_series(1,5) x,
  1663. (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p)
  1664. group by p order by p;
  1665. p | percentile_cont
  1666. ------+-----------------
  1667. 0 | 1
  1668. 0.1 | 1.4
  1669. 0.25 | 2
  1670. 0.4 | 2.6
  1671. 0.5 | 3
  1672. 0.6 | 3.4
  1673. 0.75 | 4
  1674. 0.9 | 4.6
  1675. 1 | 5
  1676. (9 rows)
  1677. select p, percentile_cont(p order by p) within group (order by x) -- error
  1678. from generate_series(1,5) x,
  1679. (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p)
  1680. group by p order by p;
  1681. ERROR: cannot use multiple ORDER BY clauses with WITHIN GROUP
  1682. LINE 1: select p, percentile_cont(p order by p) within group (order ...
  1683. ^
  1684. select p, sum() within group (order by x::float8) -- error
  1685. from generate_series(1,5) x,
  1686. (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p)
  1687. group by p order by p;
  1688. ERROR: sum is not an ordered-set aggregate, so it cannot have WITHIN GROUP
  1689. LINE 1: select p, sum() within group (order by x::float8)
  1690. ^
  1691. select p, percentile_cont(p,p) -- error
  1692. from generate_series(1,5) x,
  1693. (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p)
  1694. group by p order by p;
  1695. ERROR: WITHIN GROUP is required for ordered-set aggregate percentile_cont
  1696. LINE 1: select p, percentile_cont(p,p)
  1697. ^
  1698. select percentile_cont(0.5) within group (order by b) from aggtest;
  1699. percentile_cont
  1700. ------------------
  1701. 53.4485001564026
  1702. (1 row)
  1703. select percentile_cont(0.5) within group (order by b), sum(b) from aggtest;
  1704. percentile_cont | sum
  1705. ------------------+---------
  1706. 53.4485001564026 | 431.773
  1707. (1 row)
  1708. select percentile_cont(0.5) within group (order by thousand) from tenk1;
  1709. percentile_cont
  1710. -----------------
  1711. 499.5
  1712. (1 row)
  1713. select percentile_disc(0.5) within group (order by thousand) from tenk1;
  1714. percentile_disc
  1715. -----------------
  1716. 499
  1717. (1 row)
  1718. select rank(3) within group (order by x)
  1719. from (values (1),(1),(2),(2),(3),(3),(4)) v(x);
  1720. rank
  1721. ------
  1722. 5
  1723. (1 row)
  1724. select cume_dist(3) within group (order by x)
  1725. from (values (1),(1),(2),(2),(3),(3),(4)) v(x);
  1726. cume_dist
  1727. -----------
  1728. 0.875
  1729. (1 row)
  1730. select percent_rank(3) within group (order by x)
  1731. from (values (1),(1),(2),(2),(3),(3),(4),(5)) v(x);
  1732. percent_rank
  1733. --------------
  1734. 0.5
  1735. (1 row)
  1736. select dense_rank(3) within group (order by x)
  1737. from (values (1),(1),(2),(2),(3),(3),(4)) v(x);
  1738. dense_rank
  1739. ------------
  1740. 3
  1741. (1 row)
  1742. select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
  1743. from tenk1;
  1744. percentile_disc
  1745. ----------------------------
  1746. {0,99,249,499,749,899,999}
  1747. (1 row)
  1748. select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
  1749. from tenk1;
  1750. percentile_cont
  1751. -----------------------------
  1752. {0,249.75,499.5,749.25,999}
  1753. (1 row)
  1754. select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
  1755. from tenk1;
  1756. percentile_disc
  1757. ---------------------------------
  1758. {{NULL,999,499},{749,249,NULL}}
  1759. (1 row)
  1760. select percentile_cont(array[0,1,0.25,0.75,0.5,1,0.3,0.32,0.35,0.38,0.4]) within group (order by x)
  1761. from generate_series(1,6) x;
  1762. percentile_cont
  1763. ------------------------------------------
  1764. {1,6,2.25,4.75,3.5,6,2.5,2.6,2.75,2.9,3}
  1765. (1 row)
  1766. select ten, mode() within group (order by string4) from tenk1 group by ten;
  1767. ten | mode
  1768. -----+--------
  1769. 0 | HHHHxx
  1770. 1 | OOOOxx
  1771. 2 | VVVVxx
  1772. 3 | OOOOxx
  1773. 4 | HHHHxx
  1774. 5 | HHHHxx
  1775. 6 | OOOOxx
  1776. 7 | AAAAxx
  1777. 8 | VVVVxx
  1778. 9 | VVVVxx
  1779. (10 rows)
  1780. select percentile_disc(array[0.25,0.5,0.75]) within group (order by x)
  1781. from unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]) u(x);
  1782. percentile_disc
  1783. -----------------
  1784. {fred,jill,jim}
  1785. (1 row)
  1786. -- check collation propagates up in suitable cases:
  1787. select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX"))
  1788. from (values ('fred'),('jim')) v(x);
  1789. pg_collation_for
  1790. ------------------
  1791. "POSIX"
  1792. (1 row)
  1793. -- ordered-set aggs created with CREATE AGGREGATE
  1794. select test_rank(3) within group (order by x)
  1795. from (values (1),(1),(2),(2),(3),(3),(4)) v(x);
  1796. test_rank
  1797. -----------
  1798. 5
  1799. (1 row)
  1800. select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
  1801. test_percentile_disc
  1802. ----------------------
  1803. 499
  1804. (1 row)
  1805. -- ordered-set aggs can't use ungrouped vars in direct args:
  1806. select rank(x) within group (order by x) from generate_series(1,5) x;
  1807. ERROR: column "x.x" must appear in the GROUP BY clause or be used in an aggregate function
  1808. LINE 1: select rank(x) within group (order by x) from generate_serie...
  1809. ^
  1810. DETAIL: Direct arguments of an ordered-set aggregate must use only grouped columns.
  1811. -- outer-level agg can't use a grouped arg of a lower level, either:
  1812. select array(select percentile_disc(a) within group (order by x)
  1813. from (values (0.3),(0.7)) v(a) group by a)
  1814. from generate_series(1,5) g(x);
  1815. ERROR: outer-level aggregate cannot contain a lower-level variable in its direct arguments
  1816. LINE 1: select array(select percentile_disc(a) within group (order b...
  1817. ^
  1818. -- agg in the direct args is a grouping violation, too:
  1819. select rank(sum(x)) within group (order by x) from generate_series(1,5) x;
  1820. ERROR: aggregate function calls cannot be nested
  1821. LINE 1: select rank(sum(x)) within group (order by x) from generate_...
  1822. ^
  1823. -- hypothetical-set type unification and argument-count failures:
  1824. select rank(3) within group (order by x) from (values ('fred'),('jim')) v(x);
  1825. ERROR: WITHIN GROUP types text and integer cannot be matched
  1826. LINE 1: select rank(3) within group (order by x) from (values ('fred...
  1827. ^
  1828. select rank(3) within group (order by stringu1,stringu2) from tenk1;
  1829. ERROR: function rank(integer, name, name) does not exist
  1830. LINE 1: select rank(3) within group (order by stringu1,stringu2) fro...
  1831. ^
  1832. HINT: To use the hypothetical-set aggregate rank, the number of hypothetical direct arguments (here 1) must match the number of ordering columns (here 2).
  1833. select rank('fred') within group (order by x) from generate_series(1,5) x;
  1834. ERROR: invalid input syntax for type integer: "fred"
  1835. LINE 1: select rank('fred') within group (order by x) from generate_...
  1836. ^
  1837. select rank('adam'::text collate "C") within group (order by x collate "POSIX")
  1838. from (values ('fred'),('jim')) v(x);
  1839. ERROR: collation mismatch between explicit collations "C" and "POSIX"
  1840. LINE 1: ...adam'::text collate "C") within group (order by x collate "P...
  1841. ^
  1842. -- hypothetical-set type unification successes:
  1843. select rank('adam'::varchar) within group (order by x) from (values ('fred'),('jim')) v(x);
  1844. rank
  1845. ------
  1846. 1
  1847. (1 row)
  1848. select rank('3') within group (order by x) from generate_series(1,5) x;
  1849. rank
  1850. ------
  1851. 3
  1852. (1 row)
  1853. -- divide by zero check
  1854. select percent_rank(0) within group (order by x) from generate_series(1,0) x;
  1855. percent_rank
  1856. --------------
  1857. 0
  1858. (1 row)
  1859. -- deparse and multiple features:
  1860. create view aggordview1 as
  1861. select ten,
  1862. percentile_disc(0.5) within group (order by thousand) as p50,
  1863. percentile_disc(0.5) within group (order by thousand) filter (where hundred=1) as px,
  1864. rank(5,'AZZZZ',50) within group (order by hundred, string4 desc, hundred)
  1865. from tenk1
  1866. group by ten order by ten;
  1867. select pg_get_viewdef('aggordview1');
  1868. pg_get_viewdef
  1869. -------------------------------------------------------------------------------------------------------------------------------
  1870. SELECT tenk1.ten, +
  1871. percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) AS p50, +
  1872. percentile_disc((0.5)::double precision) WITHIN GROUP (ORDER BY tenk1.thousand) FILTER (WHERE (tenk1.hundred = 1)) AS px,+
  1873. rank(5, 'AZZZZ'::name, 50) WITHIN GROUP (ORDER BY tenk1.hundred, tenk1.string4 DESC, tenk1.hundred) AS rank +
  1874. FROM tenk1 +
  1875. GROUP BY tenk1.ten +
  1876. ORDER BY tenk1.ten;
  1877. (1 row)
  1878. select * from aggordview1 order by ten;
  1879. ten | p50 | px | rank
  1880. -----+-----+-----+------
  1881. 0 | 490 | | 101
  1882. 1 | 491 | 401 | 101
  1883. 2 | 492 | | 101
  1884. 3 | 493 | | 101
  1885. 4 | 494 | | 101
  1886. 5 | 495 | | 67
  1887. 6 | 496 | | 1
  1888. 7 | 497 | | 1
  1889. 8 | 498 | | 1
  1890. 9 | 499 | | 1
  1891. (10 rows)
  1892. drop view aggordview1;
  1893. -- variadic aggregates
  1894. select least_agg(q1,q2) from int8_tbl;
  1895. least_agg
  1896. -------------------
  1897. -4567890123456789
  1898. (1 row)
  1899. select least_agg(variadic array[q1,q2]) from int8_tbl;
  1900. least_agg
  1901. -------------------
  1902. -4567890123456789
  1903. (1 row)
  1904. select cleast_agg(q1,q2) from int8_tbl;
  1905. cleast_agg
  1906. -------------------
  1907. -4567890123456789
  1908. (1 row)
  1909. select cleast_agg(4.5,f1) from int4_tbl;
  1910. cleast_agg
  1911. -------------
  1912. -2147483647
  1913. (1 row)
  1914. select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
  1915. cleast_agg
  1916. -------------
  1917. -2147483647
  1918. (1 row)
  1919. select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
  1920. pg_typeof
  1921. -----------
  1922. numeric
  1923. (1 row)
  1924. -- test aggregates with common transition functions share the same states
  1925. begin work;
  1926. create type avg_state as (total bigint, count bigint);
  1927. create or replace function avg_transfn(state avg_state, n int) returns avg_state as
  1928. $$
  1929. declare new_state avg_state;
  1930. begin
  1931. raise notice 'avg_transfn called with %', n;
  1932. if state is null then
  1933. if n is not null then
  1934. new_state.total := n;
  1935. new_state.count := 1;
  1936. return new_state;
  1937. end if;
  1938. return null;
  1939. elsif n is not null then
  1940. state.total := state.total + n;
  1941. state.count := state.count + 1;
  1942. return state;
  1943. end if;
  1944. return null;
  1945. end
  1946. $$ language plpgsql;
  1947. create function avg_finalfn(state avg_state) returns int4 as
  1948. $$
  1949. begin
  1950. if state is null then
  1951. return NULL;
  1952. else
  1953. return state.total / state.count;
  1954. end if;
  1955. end
  1956. $$ language plpgsql;
  1957. create function sum_finalfn(state avg_state) returns int4 as
  1958. $$
  1959. begin
  1960. if state is null then
  1961. return NULL;
  1962. else
  1963. return state.total;
  1964. end if;
  1965. end
  1966. $$ language plpgsql;
  1967. create aggregate my_avg(int4)
  1968. (
  1969. stype = avg_state,
  1970. sfunc = avg_transfn,
  1971. finalfunc = avg_finalfn
  1972. );
  1973. create aggregate my_sum(int4)
  1974. (
  1975. stype = avg_state,
  1976. sfunc = avg_transfn,
  1977. finalfunc = sum_finalfn
  1978. );
  1979. -- aggregate state should be shared as aggs are the same.
  1980. select my_avg(one),my_avg(one) from (values(1),(3)) t(one);
  1981. NOTICE: avg_transfn called with 1
  1982. NOTICE: avg_transfn called with 3
  1983. my_avg | my_avg
  1984. --------+--------
  1985. 2 | 2
  1986. (1 row)
  1987. -- aggregate state should be shared as transfn is the same for both aggs.
  1988. select my_avg(one),my_sum(one) from (values(1),(3)) t(one);
  1989. NOTICE: avg_transfn called with 1
  1990. NOTICE: avg_transfn called with 3
  1991. my_avg | my_sum
  1992. --------+--------
  1993. 2 | 4
  1994. (1 row)
  1995. -- same as previous one, but with DISTINCT, which requires sorting the input.
  1996. select my_avg(distinct one),my_sum(distinct one) from (values(1),(3),(1)) t(one);
  1997. NOTICE: avg_transfn called with 1
  1998. NOTICE: avg_transfn called with 3
  1999. my_avg | my_sum
  2000. --------+--------
  2001. 2 | 4
  2002. (1 row)
  2003. -- shouldn't share states due to the distinctness not matching.
  2004. select my_avg(distinct one),my_sum(one) from (values(1),(3)) t(one);
  2005. NOTICE: avg_transfn called with 1
  2006. NOTICE: avg_transfn called with 3
  2007. NOTICE: avg_transfn called with 1
  2008. NOTICE: avg_transfn called with 3
  2009. my_avg | my_sum
  2010. --------+--------
  2011. 2 | 4
  2012. (1 row)
  2013. -- shouldn't share states due to the filter clause not matching.
  2014. select my_avg(one) filter (where one > 1),my_sum(one) from (values(1),(3)) t(one);
  2015. NOTICE: avg_transfn called with 1
  2016. NOTICE: avg_transfn called with 3
  2017. NOTICE: avg_transfn called with 3
  2018. my_avg | my_sum
  2019. --------+--------
  2020. 3 | 4
  2021. (1 row)
  2022. -- this should not share the state due to different input columns.
  2023. select my_avg(one),my_sum(two) from (values(1,2),(3,4)) t(one,two);
  2024. NOTICE: avg_transfn called with 1
  2025. NOTICE: avg_transfn called with 2
  2026. NOTICE: avg_transfn called with 3
  2027. NOTICE: avg_transfn called with 4
  2028. my_avg | my_sum
  2029. --------+--------
  2030. 2 | 6
  2031. (1 row)
  2032. -- exercise cases where OSAs share state
  2033. select
  2034. percentile_cont(0.5) within group (order by a),
  2035. percentile_disc(0.5) within group (order by a)
  2036. from (values(1::float8),(3),(5),(7)) t(a);
  2037. percentile_cont | percentile_disc
  2038. -----------------+-----------------
  2039. 4 | 3
  2040. (1 row)
  2041. select
  2042. percentile_cont(0.25) within group (order by a),
  2043. percentile_disc(0.5) within group (order by a)
  2044. from (values(1::float8),(3),(5),(7)) t(a);
  2045. percentile_cont | percentile_disc
  2046. -----------------+-----------------
  2047. 2.5 | 3
  2048. (1 row)
  2049. -- these can't share state currently
  2050. select
  2051. rank(4) within group (order by a),
  2052. dense_rank(4) within group (order by a)
  2053. from (values(1),(3),(5),(7)) t(a);
  2054. rank | dense_rank
  2055. ------+------------
  2056. 3 | 3
  2057. (1 row)
  2058. -- test that aggs with the same sfunc and initcond share the same agg state
  2059. create aggregate my_sum_init(int4)
  2060. (
  2061. stype = avg_state,
  2062. sfunc = avg_transfn,
  2063. finalfunc = sum_finalfn,
  2064. initcond = '(10,0)'
  2065. );
  2066. create aggregate my_avg_init(int4)
  2067. (
  2068. stype = avg_state,
  2069. sfunc = avg_transfn,
  2070. finalfunc = avg_finalfn,
  2071. initcond = '(10,0)'
  2072. );
  2073. create aggregate my_avg_init2(int4)
  2074. (
  2075. stype = avg_state,
  2076. sfunc = avg_transfn,
  2077. finalfunc = avg_finalfn,
  2078. initcond = '(4,0)'
  2079. );
  2080. -- state should be shared if INITCONDs are matching
  2081. select my_sum_init(one),my_avg_init(one) from (values(1),(3)) t(one);
  2082. NOTICE: avg_transfn called with 1
  2083. NOTICE: avg_transfn called with 3
  2084. my_sum_init | my_avg_init
  2085. -------------+-------------
  2086. 14 | 7
  2087. (1 row)
  2088. -- Varying INITCONDs should cause the states not to be shared.
  2089. select my_sum_init(one),my_avg_init2(one) from (values(1),(3)) t(one);
  2090. NOTICE: avg_transfn called with 1
  2091. NOTICE: avg_transfn called with 1
  2092. NOTICE: avg_transfn called with 3
  2093. NOTICE: avg_transfn called with 3
  2094. my_sum_init | my_avg_init2
  2095. -------------+--------------
  2096. 14 | 4
  2097. (1 row)
  2098. rollback;
  2099. -- test aggregate state sharing to ensure it works if one aggregate has a
  2100. -- finalfn and the other one has none.
  2101. begin work;
  2102. create or replace function sum_transfn(state int4, n int4) returns int4 as
  2103. $$
  2104. declare new_state int4;
  2105. begin
  2106. raise notice 'sum_transfn called with %', n;
  2107. if state is null then
  2108. if n is not null then
  2109. new_state := n;
  2110. return new_state;
  2111. end if;
  2112. return null;
  2113. elsif n is not null then
  2114. state := state + n;
  2115. return state;
  2116. end if;
  2117. return null;
  2118. end
  2119. $$ language plpgsql;
  2120. create function halfsum_finalfn(state int4) returns int4 as
  2121. $$
  2122. begin
  2123. if state is null then
  2124. return NULL;
  2125. else
  2126. return state / 2;
  2127. end if;
  2128. end
  2129. $$ language plpgsql;
  2130. create aggregate my_sum(int4)
  2131. (
  2132. stype = int4,
  2133. sfunc = sum_transfn
  2134. );
  2135. create aggregate my_half_sum(int4)
  2136. (
  2137. stype = int4,
  2138. sfunc = sum_transfn,
  2139. finalfunc = halfsum_finalfn
  2140. );
  2141. -- Agg state should be shared even though my_sum has no finalfn
  2142. select my_sum(one),my_half_sum(one) from (values(1),(2),(3),(4)) t(one);
  2143. NOTICE: sum_transfn called with 1
  2144. NOTICE: sum_transfn called with 2
  2145. NOTICE: sum_transfn called with 3
  2146. NOTICE: sum_transfn called with 4
  2147. my_sum | my_half_sum
  2148. --------+-------------
  2149. 10 | 5
  2150. (1 row)
  2151. rollback;
  2152. -- test that the aggregate transition logic correctly handles
  2153. -- transition / combine functions returning NULL
  2154. -- First test the case of a normal transition function returning NULL
  2155. BEGIN;
  2156. CREATE FUNCTION balkifnull(int8, int4)
  2157. RETURNS int8
  2158. STRICT
  2159. LANGUAGE plpgsql AS $$
  2160. BEGIN
  2161. IF $1 IS NULL THEN
  2162. RAISE 'erroneously called with NULL argument';
  2163. END IF;
  2164. RETURN NULL;
  2165. END$$;
  2166. CREATE AGGREGATE balk(int4)
  2167. (
  2168. SFUNC = balkifnull(int8, int4),
  2169. STYPE = int8,
  2170. PARALLEL = SAFE,
  2171. INITCOND = '0'
  2172. );
  2173. SELECT balk(hundred) FROM tenk1;
  2174. balk
  2175. ------
  2176. (1 row)
  2177. ROLLBACK;
  2178. -- Secondly test the case of a parallel aggregate combiner function
  2179. -- returning NULL. For that use normal transition function, but a
  2180. -- combiner function returning NULL.
  2181. BEGIN;
  2182. CREATE FUNCTION balkifnull(int8, int8)
  2183. RETURNS int8
  2184. PARALLEL SAFE
  2185. STRICT
  2186. LANGUAGE plpgsql AS $$
  2187. BEGIN
  2188. IF $1 IS NULL THEN
  2189. RAISE 'erroneously called with NULL argument';
  2190. END IF;
  2191. RETURN NULL;
  2192. END$$;
  2193. CREATE AGGREGATE balk(int4)
  2194. (
  2195. SFUNC = int4_sum(int8, int4),
  2196. STYPE = int8,
  2197. COMBINEFUNC = balkifnull(int8, int8),
  2198. PARALLEL = SAFE,
  2199. INITCOND = '0'
  2200. );
  2201. -- force use of parallelism
  2202. ALTER TABLE tenk1 set (parallel_workers = 4);
  2203. SET LOCAL parallel_setup_cost=0;
  2204. SET LOCAL max_parallel_workers_per_gather=4;
  2205. EXPLAIN (COSTS OFF) SELECT balk(hundred) FROM tenk1;
  2206. QUERY PLAN
  2207. -------------------------------------------------------------------------
  2208. Finalize Aggregate
  2209. -> Gather
  2210. Workers Planned: 4
  2211. -> Partial Aggregate
  2212. -> Parallel Index Only Scan using tenk1_hundred on tenk1
  2213. (5 rows)
  2214. SELECT balk(hundred) FROM tenk1;
  2215. balk
  2216. ------
  2217. (1 row)
  2218. ROLLBACK;
  2219. -- test coverage for aggregate combine/serial/deserial functions
  2220. BEGIN;
  2221. SET parallel_setup_cost = 0;
  2222. SET parallel_tuple_cost = 0;
  2223. SET min_parallel_table_scan_size = 0;
  2224. SET max_parallel_workers_per_gather = 4;
  2225. SET parallel_leader_participation = off;
  2226. SET enable_indexonlyscan = off;
  2227. -- variance(int4) covers numeric_poly_combine
  2228. -- sum(int8) covers int8_avg_combine
  2229. -- regr_count(float8, float8) covers int8inc_float8_float8 and aggregates with > 1 arg
  2230. EXPLAIN (COSTS OFF, VERBOSE)
  2231. SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8)
  2232. FROM (SELECT * FROM tenk1
  2233. UNION ALL SELECT * FROM tenk1
  2234. UNION ALL SELECT * FROM tenk1
  2235. UNION ALL SELECT * FROM tenk1) u;
  2236. QUERY PLAN
  2237. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2238. Finalize Aggregate
  2239. Output: variance(tenk1.unique1), sum((tenk1.unique1)::bigint), regr_count((tenk1.unique1)::double precision, (tenk1.unique1)::double precision)
  2240. -> Gather
  2241. Output: (PARTIAL variance(tenk1.unique1)), (PARTIAL sum((tenk1.unique1)::bigint)), (PARTIAL regr_count((tenk1.unique1)::double precision, (tenk1.unique1)::double precision))
  2242. Workers Planned: 4
  2243. -> Partial Aggregate
  2244. Output: PARTIAL variance(tenk1.unique1), PARTIAL sum((tenk1.unique1)::bigint), PARTIAL regr_count((tenk1.unique1)::double precision, (tenk1.unique1)::double precision)
  2245. -> Parallel Append
  2246. -> Parallel Seq Scan on public.tenk1
  2247. Output: tenk1.unique1
  2248. -> Parallel Seq Scan on public.tenk1 tenk1_1
  2249. Output: tenk1_1.unique1
  2250. -> Parallel Seq Scan on public.tenk1 tenk1_2
  2251. Output: tenk1_2.unique1
  2252. -> Parallel Seq Scan on public.tenk1 tenk1_3
  2253. Output: tenk1_3.unique1
  2254. (16 rows)
  2255. SELECT variance(unique1::int4), sum(unique1::int8), regr_count(unique1::float8, unique1::float8)
  2256. FROM (SELECT * FROM tenk1
  2257. UNION ALL SELECT * FROM tenk1
  2258. UNION ALL SELECT * FROM tenk1
  2259. UNION ALL SELECT * FROM tenk1) u;
  2260. variance | sum | regr_count
  2261. ----------------------+-----------+------------
  2262. 8333541.588539713493 | 199980000 | 40000
  2263. (1 row)
  2264. -- variance(int8) covers numeric_combine
  2265. -- avg(numeric) covers numeric_avg_combine
  2266. EXPLAIN (COSTS OFF, VERBOSE)
  2267. SELECT variance(unique1::int8), avg(unique1::numeric)
  2268. FROM (SELECT * FROM tenk1
  2269. UNION ALL SELECT * FROM tenk1
  2270. UNION ALL SELECT * FROM tenk1
  2271. UNION ALL SELECT * FROM tenk1) u;
  2272. QUERY PLAN
  2273. --------------------------------------------------------------------------------------------------------
  2274. Finalize Aggregate
  2275. Output: variance((tenk1.unique1)::bigint), avg((tenk1.unique1)::numeric)
  2276. -> Gather
  2277. Output: (PARTIAL variance((tenk1.unique1)::bigint)), (PARTIAL avg((tenk1.unique1)::numeric))
  2278. Workers Planned: 4
  2279. -> Partial Aggregate
  2280. Output: PARTIAL variance((tenk1.unique1)::bigint), PARTIAL avg((tenk1.unique1)::numeric)
  2281. -> Parallel Append
  2282. -> Parallel Seq Scan on public.tenk1
  2283. Output: tenk1.unique1
  2284. -> Parallel Seq Scan on public.tenk1 tenk1_1
  2285. Output: tenk1_1.unique1
  2286. -> Parallel Seq Scan on public.tenk1 tenk1_2
  2287. Output: tenk1_2.unique1
  2288. -> Parallel Seq Scan on public.tenk1 tenk1_3
  2289. Output: tenk1_3.unique1
  2290. (16 rows)
  2291. SELECT variance(unique1::int8), avg(unique1::numeric)
  2292. FROM (SELECT * FROM tenk1
  2293. UNION ALL SELECT * FROM tenk1
  2294. UNION ALL SELECT * FROM tenk1
  2295. UNION ALL SELECT * FROM tenk1) u;
  2296. variance | avg
  2297. ----------------------+-----------------------
  2298. 8333541.588539713493 | 4999.5000000000000000
  2299. (1 row)
  2300. ROLLBACK;
  2301. -- test coverage for dense_rank
  2302. SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1;
  2303. dense_rank
  2304. ------------
  2305. 1
  2306. 1
  2307. 1
  2308. (3 rows)
  2309. -- Ensure that the STRICT checks for aggregates does not take NULLness
  2310. -- of ORDER BY columns into account. See bug report around
  2311. -- 2a505161-2727-2473-7c46-591ed108ac52@email.cz
  2312. SELECT min(x ORDER BY y) FROM (VALUES(1, NULL)) AS d(x,y);
  2313. min
  2314. -----
  2315. 1
  2316. (1 row)
  2317. SELECT min(x ORDER BY y) FROM (VALUES(1, 2)) AS d(x,y);
  2318. min
  2319. -----
  2320. 1
  2321. (1 row)
  2322. -- check collation-sensitive matching between grouping expressions
  2323. select v||'a', case v||'a' when 'aa' then 1 else 0 end, count(*)
  2324. from unnest(array['a','b']) u(v)
  2325. group by v||'a' order by 1;
  2326. ?column? | case | count
  2327. ----------+------+-------
  2328. aa | 1 | 1
  2329. ba | 0 | 1
  2330. (2 rows)
  2331. select v||'a', case when v||'a' = 'aa' then 1 else 0 end, count(*)
  2332. from unnest(array['a','b']) u(v)
  2333. group by v||'a' order by 1;
  2334. ?column? | case | count
  2335. ----------+------+-------
  2336. aa | 1 | 1
  2337. ba | 0 | 1
  2338. (2 rows)
  2339. -- Make sure that generation of HashAggregate for uniqification purposes
  2340. -- does not lead to array overflow due to unexpected duplicate hash keys
  2341. -- see CAFeeJoKKu0u+A_A9R9316djW-YW3-+Gtgvy3ju655qRHR3jtdA@mail.gmail.com
  2342. set enable_memoize to off;
  2343. explain (costs off)
  2344. select 1 from tenk1
  2345. where (hundred, thousand) in (select twothousand, twothousand from onek);
  2346. QUERY PLAN
  2347. -------------------------------------------------------------
  2348. Hash Join
  2349. Hash Cond: (tenk1.hundred = onek.twothousand)
  2350. -> Seq Scan on tenk1
  2351. Filter: (hundred = thousand)
  2352. -> Hash
  2353. -> HashAggregate
  2354. Group Key: onek.twothousand, onek.twothousand
  2355. -> Seq Scan on onek
  2356. (8 rows)
  2357. reset enable_memoize;
  2358. --
  2359. -- Hash Aggregation Spill tests
  2360. --
  2361. set enable_sort=false;
  2362. set work_mem='64kB';
  2363. select unique1, count(*), sum(twothousand) from tenk1
  2364. group by unique1
  2365. having sum(fivethous) > 4975
  2366. order by sum(twothousand);
  2367. unique1 | count | sum
  2368. ---------+-------+------
  2369. 4976 | 1 | 976
  2370. 4977 | 1 | 977
  2371. 4978 | 1 | 978
  2372. 4979 | 1 | 979
  2373. 4980 | 1 | 980
  2374. 4981 | 1 | 981
  2375. 4982 | 1 | 982
  2376. 4983 | 1 | 983
  2377. 4984 | 1 | 984
  2378. 4985 | 1 | 985
  2379. 4986 | 1 | 986
  2380. 4987 | 1 | 987
  2381. 4988 | 1 | 988
  2382. 4989 | 1 | 989
  2383. 4990 | 1 | 990
  2384. 4991 | 1 | 991
  2385. 4992 | 1 | 992
  2386. 4993 | 1 | 993
  2387. 4994 | 1 | 994
  2388. 4995 | 1 | 995
  2389. 4996 | 1 | 996
  2390. 4997 | 1 | 997
  2391. 4998 | 1 | 998
  2392. 4999 | 1 | 999
  2393. 9976 | 1 | 1976
  2394. 9977 | 1 | 1977
  2395. 9978 | 1 | 1978
  2396. 9979 | 1 | 1979
  2397. 9980 | 1 | 1980
  2398. 9981 | 1 | 1981
  2399. 9982 | 1 | 1982
  2400. 9983 | 1 | 1983
  2401. 9984 | 1 | 1984
  2402. 9985 | 1 | 1985
  2403. 9986 | 1 | 1986
  2404. 9987 | 1 | 1987
  2405. 9988 | 1 | 1988
  2406. 9989 | 1 | 1989
  2407. 9990 | 1 | 1990
  2408. 9991 | 1 | 1991
  2409. 9992 | 1 | 1992
  2410. 9993 | 1 | 1993
  2411. 9994 | 1 | 1994
  2412. 9995 | 1 | 1995
  2413. 9996 | 1 | 1996
  2414. 9997 | 1 | 1997
  2415. 9998 | 1 | 1998
  2416. 9999 | 1 | 1999
  2417. (48 rows)
  2418. set work_mem to default;
  2419. set enable_sort to default;
  2420. --
  2421. -- Compare results between plans using sorting and plans using hash
  2422. -- aggregation. Force spilling in both cases by setting work_mem low.
  2423. --
  2424. set work_mem='64kB';
  2425. create table agg_data_2k as
  2426. select g from generate_series(0, 1999) g;
  2427. analyze agg_data_2k;
  2428. create table agg_data_20k as
  2429. select g from generate_series(0, 19999) g;
  2430. analyze agg_data_20k;
  2431. -- Produce results with sorting.
  2432. set enable_hashagg = false;
  2433. set jit_above_cost = 0;
  2434. explain (costs off)
  2435. select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
  2436. from agg_data_20k group by g%10000;
  2437. QUERY PLAN
  2438. --------------------------------------
  2439. GroupAggregate
  2440. Group Key: ((g % 10000))
  2441. -> Sort
  2442. Sort Key: ((g % 10000))
  2443. -> Seq Scan on agg_data_20k
  2444. (5 rows)
  2445. create table agg_group_1 as
  2446. select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
  2447. from agg_data_20k group by g%10000;
  2448. create table agg_group_2 as
  2449. select * from
  2450. (values (100), (300), (500)) as r(a),
  2451. lateral (
  2452. select (g/2)::numeric as c1,
  2453. array_agg(g::numeric) as c2,
  2454. count(*) as c3
  2455. from agg_data_2k
  2456. where g < r.a
  2457. group by g/2) as s;
  2458. set jit_above_cost to default;
  2459. create table agg_group_3 as
  2460. select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
  2461. from agg_data_2k group by g/2;
  2462. create table agg_group_4 as
  2463. select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
  2464. from agg_data_2k group by g/2;
  2465. -- Produce results with hash aggregation
  2466. set enable_hashagg = true;
  2467. set enable_sort = false;
  2468. set jit_above_cost = 0;
  2469. explain (costs off)
  2470. select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
  2471. from agg_data_20k group by g%10000;
  2472. QUERY PLAN
  2473. --------------------------------
  2474. HashAggregate
  2475. Group Key: (g % 10000)
  2476. -> Seq Scan on agg_data_20k
  2477. (3 rows)
  2478. create table agg_hash_1 as
  2479. select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
  2480. from agg_data_20k group by g%10000;
  2481. create table agg_hash_2 as
  2482. select * from
  2483. (values (100), (300), (500)) as r(a),
  2484. lateral (
  2485. select (g/2)::numeric as c1,
  2486. array_agg(g::numeric) as c2,
  2487. count(*) as c3
  2488. from agg_data_2k
  2489. where g < r.a
  2490. group by g/2) as s;
  2491. set jit_above_cost to default;
  2492. create table agg_hash_3 as
  2493. select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
  2494. from agg_data_2k group by g/2;
  2495. create table agg_hash_4 as
  2496. select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
  2497. from agg_data_2k group by g/2;
  2498. set enable_sort = true;
  2499. set work_mem to default;
  2500. -- Compare group aggregation results to hash aggregation results
  2501. (select * from agg_hash_1 except select * from agg_group_1)
  2502. union all
  2503. (select * from agg_group_1 except select * from agg_hash_1);
  2504. c1 | c2 | c3
  2505. ----+----+----
  2506. (0 rows)
  2507. (select * from agg_hash_2 except select * from agg_group_2)
  2508. union all
  2509. (select * from agg_group_2 except select * from agg_hash_2);
  2510. a | c1 | c2 | c3
  2511. ---+----+----+----
  2512. (0 rows)
  2513. (select * from agg_hash_3 except select * from agg_group_3)
  2514. union all
  2515. (select * from agg_group_3 except select * from agg_hash_3);
  2516. c1 | c2 | c3
  2517. ----+----+----
  2518. (0 rows)
  2519. (select * from agg_hash_4 except select * from agg_group_4)
  2520. union all
  2521. (select * from agg_group_4 except select * from agg_hash_4);
  2522. c1 | c2 | c3
  2523. ----+----+----
  2524. (0 rows)
  2525. drop table agg_group_1;
  2526. drop table agg_group_2;
  2527. drop table agg_group_3;
  2528. drop table agg_group_4;
  2529. drop table agg_hash_1;
  2530. drop table agg_hash_2;
  2531. drop table agg_hash_3;
  2532. drop table agg_hash_4;