BUG #19879: Blocked COPY FROM reports NULL command and type in pg_stat_progress_copy

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: imchifan8(at)gmail(dot)com
Subject: BUG #19879: Blocked COPY FROM reports NULL command and type in pg_stat_progress_copy
Date: 2026-11-11 13:30:55
Message-ID: 19879-79f1b50f5f75a9e9@postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 19879
Logged by: Noah
Email address: imchifan8(at)gmail(dot)com
PostgreSQL version: 18.6
Operating system: Linux/amd64
Description:

A server-side COPY FROM that blocks while opening a FIFO appears in
pg_stat_progress_copy with the correct relation OID but NULL command and
type. The view should identify the running command as COPY FROM and its I/O
type as FILE, as documented for pg_stat_progress_copy.

How to repeat:

Save this as run.sh:

#!/usr/bin/env bash
set -euo pipefail

: "${PG_BINDIR:?set PG_BINDIR to the target PostgreSQL bin directory}"
base="$PWD/work"
data="$base/data"
sock="$base/socket"
fifo="$base/input.fifo"
mkdir -p "$base" "$sock"
"$PG_BINDIR/initdb" -D "$data" --no-locale --encoding=UTF8 >/dev/null
"$PG_BINDIR/pg_ctl" -D "$data" -o "-k $sock -c listen_addresses=''" -w start
>/dev/null
cleanup() {
"$PG_BINDIR/pg_ctl" -D "$data" -m immediate -w stop >/dev/null 2>&1 ||
true
}
trap cleanup EXIT
"$PG_BINDIR/psql" -X -h "$sock" -d postgres -v ON_ERROR_STOP=1 -c 'CREATE
TABLE copy_progress_target(i int)'
mkfifo "$fifo"
"$PG_BINDIR/psql" -X -h "$sock" -d postgres -v ON_ERROR_STOP=1 \
-c "COPY copy_progress_target FROM '$fifo'" >"$base/copy.out"
2>"$base/copy.err" &
copy_pid=$!
for _ in $(seq 1 100); do
row=$("$PG_BINDIR/psql" -XAt -h "$sock" -d postgres -c \
"SELECT coalesce(command,'<NULL>') || '|' || coalesce(type,'<NULL>')
FROM pg_stat_progress_copy WHERE relid='copy_progress_target'::regclass")
test -n "$row" && break
sleep 0.05
done
printf 'observed=%s\n' "$row"
printf '1\n' >"$fifo"
wait "$copy_pid"
test "$row" = 'COPY FROM|FILE'

Run it as a non-root operating-system user from an otherwise empty writable
directory:

chmod +x run.sh
PG_BINDIR=/path/to/postgresql/bin ./run.sh

On the affected build, it prints:

observed=<NULL>|<NULL>

The final test then exits nonzero. The progress row exists and has the
relation OID for copy_progress_target, but its command and type are missing.
Writing to the FIFO allows COPY to finish; the metadata is then populated or
the progress row disappears.

The issue was reproduced on PostgreSQL 18.6 (Debian 18.6-1.pgdg13+2) on
Linux/amd64. COPY execution and table data are unaffected. This occurs when
an authorized server-side COPY FROM opens a filesystem object whose open
blocks while another session monitors pg_stat_progress_copy.

Browse pgsql-bugs by date

  From Date Subject
Next Message PG Bug reporting form 2026-11-11 13:39:00 BUG #19880: hstore(record) expression index returns wrong rows after TimeZone change
Previous Message Laurenz Albe 2026-11-11 13:15:20 Re: BUG #19867: pg_verifybackup accepts out-of-range Timeline in backup manifest