diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 074294cbcc..82a14295ee 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -4218,8 +4218,8 @@ numeric_poly_combine(PG_FUNCTION_ARGS) state1->sumX = state2->sumX; state1->sumX2 = state2->sumX2; #else - accum_sum_copy(&state2->sumX, &state1->sumX); - accum_sum_copy(&state2->sumX2, &state1->sumX2); + accum_sum_copy(&state1->sumX, &state2->sumX); + accum_sum_copy(&state1->sumX2, &state2->sumX2); #endif MemoryContextSwitchTo(old_context); diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index f85e913850..7bd5fdaf6a 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -2065,3 +2065,235 @@ SELECT balk(hundred) FROM tenk1; (1 row) ROLLBACK; +-- Coverage for aggregate combine/serial/deserial functions +SET parallel_setup_cost = 0; +SET parallel_tuple_cost = 0; +SET min_parallel_table_scan_size = 1; +SET max_parallel_workers_per_gather = 2; +SET enable_indexonlyscan = off; +-- verify we get a parallel plan for each of these. +EXPLAIN (COSTS OFF) SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek + Filter: (unique1 > 10) +(6 rows) + +EXPLAIN (COSTS OFF) SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +EXPLAIN (COSTS OFF) SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek; + QUERY PLAN +--------------------------------------------- + Finalize Aggregate + -> Gather + Workers Planned: 2 + -> Partial Aggregate + -> Parallel Seq Scan on onek +(5 rows) + +-- bulk check various aggregate functions. +SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; + sum | sum | sum | sum | sum +--------+--------+--------+--------+-------- + 499500 | 499500 | 499500 | 499500 | 499500 +(1 row) + +SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; + avg | avg | avg | avg | avg +----------------------+----------------------+----------------------+-------+------- + 499.5000000000000000 | 499.5000000000000000 | 499.5000000000000000 | 499.5 | 499.5 +(1 row) + +SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; + min | min | min | min | min +-----+-----+-----+-----+----- + 11 | 11 | 11 | 11 | 11 +(1 row) + +SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; + max | max | max | max | max +-----+-----+-----+-----+----- + 999 | 999 | 999 | 999 | 999 +(1 row) + +SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; + stddev | stddev | stddev | stddev | stddev +------------------+------------------+------------------+------------------+------------------ + 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 +(1 row) + +SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; + stddev_pop | stddev_pop | stddev_pop | stddev_pop | stddev_pop +------------------+------------------+------------------+-----------------+----------------- + 288.674990257210 | 288.674990257210 | 288.674990257210 | 288.67499025721 | 288.67499025721 +(1 row) + +SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; + stddev_samp | stddev_samp | stddev_samp | stddev_samp | stddev_samp +------------------+------------------+------------------+------------------+------------------ + 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 +(1 row) + +SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; + var_pop | var_pop | var_pop | var_pop | var_pop +--------------------+--------------------+--------------------+----------+---------- + 83333.250000000000 | 83333.250000000000 | 83333.250000000000 | 83333.25 | 83333.25 +(1 row) + +SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; + var_samp | var_samp | var_samp | var_samp | var_samp +--------------------+--------------------+--------------------+------------------+------------------ + 83416.666666666667 | 83416.666666666667 | 83416.666666666667 | 83416.6666666667 | 83416.6666666667 +(1 row) + +SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek; + variance | variance | variance | variance | variance +--------------------+--------------------+--------------------+------------------+------------------ + 83416.666666666667 | 83416.666666666667 | 83416.666666666667 | 83416.6666666667 | 83416.6666666667 +(1 row) + +-- disable parallel query +set max_parallel_workers_per_gather = 0; +-- Results should match above. +SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; + sum | sum | sum | sum | sum +--------+--------+--------+--------+-------- + 499500 | 499500 | 499500 | 499500 | 499500 +(1 row) + +SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; + avg | avg | avg | avg | avg +----------------------+----------------------+----------------------+-------+------- + 499.5000000000000000 | 499.5000000000000000 | 499.5000000000000000 | 499.5 | 499.5 +(1 row) + +SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; + min | min | min | min | min +-----+-----+-----+-----+----- + 11 | 11 | 11 | 11 | 11 +(1 row) + +SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; + max | max | max | max | max +-----+-----+-----+-----+----- + 999 | 999 | 999 | 999 | 999 +(1 row) + +SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; + stddev | stddev | stddev | stddev | stddev +------------------+------------------+------------------+------------------+------------------ + 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 +(1 row) + +SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; + stddev_pop | stddev_pop | stddev_pop | stddev_pop | stddev_pop +------------------+------------------+------------------+-----------------+----------------- + 288.674990257210 | 288.674990257210 | 288.674990257210 | 288.67499025721 | 288.67499025721 +(1 row) + +SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; + stddev_samp | stddev_samp | stddev_samp | stddev_samp | stddev_samp +------------------+------------------+------------------+------------------+------------------ + 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 | 288.819436095749 +(1 row) + +SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; + var_pop | var_pop | var_pop | var_pop | var_pop +--------------------+--------------------+--------------------+----------+---------- + 83333.250000000000 | 83333.250000000000 | 83333.250000000000 | 83333.25 | 83333.25 +(1 row) + +SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; + var_samp | var_samp | var_samp | var_samp | var_samp +--------------------+--------------------+--------------------+------------------+------------------ + 83416.666666666667 | 83416.666666666667 | 83416.666666666667 | 83416.6666666667 | 83416.6666666667 +(1 row) + +SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek; + variance | variance | variance | variance | variance +--------------------+--------------------+--------------------+------------------+------------------ + 83416.666666666667 | 83416.666666666667 | 83416.666666666667 | 83416.6666666667 | 83416.6666666667 +(1 row) + diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 506d0442d7..54f7358ffe 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -907,3 +907,49 @@ EXPLAIN (COSTS OFF) SELECT balk(hundred) FROM tenk1; SELECT balk(hundred) FROM tenk1; ROLLBACK; + +-- Coverage for aggregate combine/serial/deserial functions +SET parallel_setup_cost = 0; +SET parallel_tuple_cost = 0; +SET min_parallel_table_scan_size = 1; +SET max_parallel_workers_per_gather = 2; +SET enable_indexonlyscan = off; + +-- verify we get a parallel plan for each of these. +EXPLAIN (COSTS OFF) SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; +EXPLAIN (COSTS OFF) SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; +EXPLAIN (COSTS OFF) SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek; + +-- bulk check various aggregate functions. +SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; +SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; +SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; +SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; +SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; +SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; +SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; +SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; +SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; +SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek; + +-- disable parallel query +set max_parallel_workers_per_gather = 0; + +-- Results should match above. +SELECT sum(unique1::smallint),sum(unique1::bigint),sum(unique1::numeric),sum(unique1::float4),sum(unique1::float8) FROM onek; +SELECT avg(unique1::smallint),avg(unique1::bigint),avg(unique1::numeric),avg(unique1::float4),avg(unique1::float8) FROM onek; +SELECT min(unique1::smallint),min(unique1::bigint),min(unique1::numeric),min(unique1::float4),min(unique1::float8) FROM onek WHERE unique1 > 10; +SELECT max(unique1::smallint),max(unique1::bigint),max(unique1::numeric),max(unique1::float4),max(unique1::float8) FROM onek; +SELECT stddev(unique1::smallint),stddev(unique1::bigint),stddev(unique1::numeric),stddev(unique1::float4),stddev(unique1::float8) FROM onek; +SELECT stddev_pop(unique1::smallint),stddev_pop(unique1::bigint),stddev_pop(unique1::numeric),stddev_pop(unique1::float4),stddev_pop(unique1::float8) FROM onek; +SELECT stddev_samp(unique1::smallint),stddev_samp(unique1::bigint),stddev_samp(unique1::numeric),stddev_samp(unique1::float4),stddev_samp(unique1::float8) FROM onek; +SELECT var_pop(unique1::smallint),var_pop(unique1::bigint),var_pop(unique1::numeric),var_pop(unique1::float4),var_pop(unique1::float8) FROM onek; +SELECT var_samp(unique1::smallint),var_samp(unique1::bigint),var_samp(unique1::numeric),var_samp(unique1::float4),var_samp(unique1::float8) FROM onek; +SELECT variance(unique1::smallint),variance(unique1::bigint),variance(unique1::numeric),variance(unique1::float4),variance(unique1::float8) FROM onek;