#1325·pq

Unclean connection close on context cancellation during row scan

Author: matteosilvCreated Jun 10, 2026Updated Jul 11, 2026

When a context is cancelled while scanning query results with rows.Scan, lib/pq closes the connection abruptly instead of gracefully. This surfaces as Connection reset by peer errors on the server side.

Test case:

func TestXXX(t *testing.T) {
	db := pqtest.MustDB(t)

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	rows, err := db.QueryContext(ctx, "select * from generate_series(1, 1000000)")
	if err != nil {
		t.Fatal(err)
	}
	defer rows.Close()

	count := 0
	for rows.Next() {
		var n int
		if err := rows.Scan(&n); err != nil {
			t.Fatal(err)
		}
		count++
		if count == 1000 {
			cancel()
		}
	}

	err = rows.Err()
	if err != nil {
		t.Fatal(err)
	}
}

Results in error:

scan error: context canceled

The server server (pgdog proxy, making the TCP-level error observable) reports:

ERROR client disconnected with error: net: io: Connection reset by peer (os error 104)

pq v1.12.3

pgdog v0.1.38