The return value of a simple query two special copy https://www.postgresql.org/do…

CopyInResponse
The backend is ready to copy data from the frontend to a table; see Section 52.2.5.

CopyOutResponse
The backend is ready to copy data from a table to the frontend; see Section 52.2.5.

Copy related messages

CommandComplete (B) Byte1('C') Identifies the message as a command-completed response. String For a COPY command, the tag is COPY rows where rows is the number of rows copied. (Note: The row count appears only in postgreSQL 8.2 and later.) CopyData (F & B) Byte1('d') Identifies the message as COPY data. CopyDone (F & B) Byte1('c') Identifies the message as a COPY-complete indicator. CopyFail (F) Byte1('f') Identifies the message as a COPY-failure indicator. CopyInResponse (B) Byte1('G') Identifies the message as a Start Copy  In response. The frontend must now send copy-in data (if not prepared to do so, send a CopyFail message). CopyOutResponse (B) Byte1('H') Identifies the message as a Start Copy Out response. This message will be followed by copy-out data. CopyBothResponse (B) Byte1('W') Identifies the message as a Start Copy Both response. This message is used only for Streaming Replication.

copy to file

postgres=# copy (select * from t1 ) to '/tmp/t1.csv';
COPY 5

copy from stdin

postgres=# copy t1 from stdin  (DELIMITER '|');
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 23|gg
>> 24|qq
>> 25|tt
>> COPY 3

copy to stdout

postgres=# copy t1 to STDOUT (DELIMITER '|');;
23|gg
24|qq
25|tt