| 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.
| 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 |