From c1a0d7d1c4b77d978fe93edc0889589148cbad23 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 27 Mar 2022 21:39:43 -0700 Subject: [PATCH] Fix NULL input behaviour of pg_stat_get_replication_slot(). pg_stat_get_replication_slot() accidentally was marked as non-strict, crashing when called with NULL input. As it's already released, introduce an explicit NULL check in 14, fix the catalog in HEAD. Bumps catversion in HEAD. Discussion: https://postgr.es/m/20220326212432.s5n2maw6kugnpyxw@alap3.anarazel.de Backpatch: 14-, where replication slot stats were introduced --- src/backend/utils/adt/pgstatfuncs.c | 11 ++++++++++- src/test/regress/expected/stats.out | 7 +++++++ src/test/regress/sql/stats.sql | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index d899ba86f0..6fc2196d59 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2315,7 +2315,7 @@ Datum pg_stat_get_replication_slot(PG_FUNCTION_ARGS) { #define PG_STAT_GET_REPLICATION_SLOT_COLS 10 - text *slotname_text = PG_GETARG_TEXT_P(0); + text *slotname_text; NameData slotname; TupleDesc tupdesc; Datum values[PG_STAT_GET_REPLICATION_SLOT_COLS]; @@ -2323,6 +2323,15 @@ pg_stat_get_replication_slot(PG_FUNCTION_ARGS) PgStat_StatReplSlotEntry *slotent; PgStat_StatReplSlotEntry allzero; + /* + * Function was accidentally marked as non-strict, can't change that post + * release. + */ + if (PG_ARGISNULL(0)) + PG_RETURN_NULL(); + + slotname_text = PG_GETARG_TEXT_P(0); + /* Initialise values and NULL flags arrays */ MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index b01e58b98c..4eeaaca84c 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -201,4 +201,11 @@ FROM prevstats AS pr; DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + pg_stat_get_replication_slot +------------------------------ + +(1 row) + -- End of Stats Test diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index feaaee6326..dda07174ea 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -176,4 +176,10 @@ FROM prevstats AS pr; DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; + + +-- ensure that stats accessors handle NULL input correctly +SELECT pg_stat_get_replication_slot(NULL); + + -- End of Stats Test