aggregates.sql 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. --
  2. -- AGGREGATES
  3. --
  4. -- avoid bit-exact output here because operations may not be bit-exact.
  5. SET extra_float_digits = 0;
  6. -- population variance is defined for a single tuple, sample variance
  7. -- is not
  8. SELECT var_pop(1.0::float8), var_samp(2.0::float8);
  9. SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8);
  10. SELECT var_pop('inf'::float8), var_samp('inf'::float8);
  11. SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8);
  12. SELECT var_pop('nan'::float8), var_samp('nan'::float8);
  13. SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8);
  14. SELECT var_pop(1.0::float4), var_samp(2.0::float4);
  15. SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4);
  16. SELECT var_pop('inf'::float4), var_samp('inf'::float4);
  17. SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4);
  18. SELECT var_pop('nan'::float4), var_samp('nan'::float4);
  19. SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4);
  20. SELECT var_pop('inf'::numeric), var_samp('inf'::numeric);
  21. SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric);
  22. SELECT var_pop('nan'::numeric), var_samp('nan'::numeric);
  23. SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric);
  24. -- verify correct results for null and NaN inputs
  25. select sum(null::int4) from generate_series(1,3);
  26. select sum(null::int8) from generate_series(1,3);
  27. select sum(null::numeric) from generate_series(1,3);
  28. select sum(null::float8) from generate_series(1,3);
  29. select avg(null::int4) from generate_series(1,3);
  30. select avg(null::int8) from generate_series(1,3);
  31. select avg(null::numeric) from generate_series(1,3);
  32. select avg(null::float8) from generate_series(1,3);
  33. select sum('NaN'::numeric) from generate_series(1,3);
  34. select avg('NaN'::numeric) from generate_series(1,3);
  35. -- verify correct results for infinite inputs
  36. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  37. FROM (VALUES ('1'), ('infinity')) v(x);
  38. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  39. FROM (VALUES ('infinity'), ('1')) v(x);
  40. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  41. FROM (VALUES ('infinity'), ('infinity')) v(x);
  42. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  43. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  44. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  45. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  46. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  47. FROM (VALUES ('1'), ('infinity')) v(x);
  48. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  49. FROM (VALUES ('infinity'), ('1')) v(x);
  50. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  51. FROM (VALUES ('infinity'), ('infinity')) v(x);
  52. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  53. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  54. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  55. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  56. -- test accuracy with a large input offset
  57. SELECT avg(x::float8), var_pop(x::float8)
  58. FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x);
  59. SELECT avg(x::float8), var_pop(x::float8)
  60. FROM (VALUES (7000000000005), (7000000000007)) v(x);
  61. -- check single-tuple behavior
  62. SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8);
  63. SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8);
  64. SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8);
  65. -- test accum and combine functions directly
  66. CREATE TABLE regr_test (x float8, y float8);
  67. INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
  68. SELECT float8_accum('{4,140,2900}'::float8[], 100);
  69. SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100);
  70. SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]);
  71. SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]);
  72. SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]);
  73. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  74. '{0,0,0,0,0,0}'::float8[]);
  75. SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[],
  76. '{2,180,200,740,57800,-3400}'::float8[]);
  77. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  78. '{2,180,200,740,57800,-3400}'::float8[]);
  79. DROP TABLE regr_test;
  80. --
  81. -- test for bitwise integer aggregates
  82. --
  83. CREATE TEMPORARY TABLE bitwise_test(
  84. i2 INT2,
  85. i4 INT4,
  86. i8 INT8,
  87. i INTEGER,
  88. x INT2,
  89. y BIT(4)
  90. );
  91. CREATE TEMPORARY TABLE bool_test(
  92. b1 BOOL,
  93. b2 BOOL,
  94. b3 BOOL,
  95. b4 BOOL);
  96. -- the planner may choose a generic aggregate here if parallel query is
  97. -- enabled, since that plan will be parallel safe and the "optimized"
  98. -- plan, which has almost identical cost, will not be. we want to test
  99. -- the optimized plan, so temporarily disable parallel query.
  100. begin;
  101. rollback;
  102. -- try it on an inheritance tree
  103. create table minmaxtest(f1 int);
  104. create index minmaxtesti on minmaxtest(f1);
  105. create index minmaxtest1i on minmaxtest1(f1);
  106. create index minmaxtest2i on minmaxtest2(f1 desc);
  107. insert into minmaxtest values(11), (12);
  108. --
  109. -- Test removal of redundant GROUP BY columns
  110. --
  111. create temp table t1 (a int, b int, c int, d int, primary key (a, b));
  112. create temp table t2 (x int, y int, z int, primary key (x, y));
  113. drop table t2;