diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 5bda4af..5327447 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -33,6 +33,7 @@ #include "storage/procarray.h" #include "utils/builtins.h" #include "tcop/tcopprot.h" +#include "pgstat.h" #define atooid(x) ((Oid) strtoul((x), NULL, 10)) @@ -75,9 +76,33 @@ static bool pg_signal_backend(int pid, int sig) { if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("must be superuser to signal other server processes")))); + { + bool haveRight = false; + PgBackendStatus *backend; + + /* If the user not is the superuser, need to be the db owner. */ + if (pg_database_ownercheck(MyDatabaseId, GetUserId())) { + + /* Check for the specify backend in the stat info table */ + int nBackend = pgstat_fetch_stat_numbackends(); + int i; + for (i = 1; i<=nBackend; ++i) { + backend = pgstat_fetch_stat_beentry(i); + if (backend->st_procpid == pid) { + if (backend->st_databaseid == MyDatabaseId) + haveRight = true; + break; + } + } + } + + if (!haveRight) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("must be superuser or database destination owner to signal other server processes")))); + } + + if (!IsBackendPid(pid)) {