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;
