BUG #16149: Prepared COPY queries always report 0 parameters when described

PG Bug reporting form <[email protected]>
Newsgroups gmane.comp.db.postgresql.bugs
Message-ID <[email protected]>
The following bug has been logged on the website:

Bug reference:      16149
Logged by:          Steven Fackler
Email address:      [email protected]
PostgreSQL version: 12.1
Operating system:   Debian Buster
Description:        

When a Postgres backend describes a prepared `COPY ... TO STDOUT query`, it
always reports 0 query parameters regardless of how many are actually
present. Here's a simple example program that demonstrates the issue:

```
#include <libpq-fe.h>
#include <assert.h>
#include <stdio.h>

int main() {
	PGconn *conn = PQconnectdb("host=localhost port=5433 user=postgres");
	assert(PQstatus(conn) == CONNECTION_OK);

	PGresult *result = PQprepare(conn, "a", "COPY (SELECT $1::TEXT) TO STDOUT",
0, NULL);
	assert(PQresultStatus(result) == PGRES_COMMAND_OK);

	result = PQdescribePrepared(conn, "a");
	assert(PQresultStatus(result) == PGRES_COMMAND_OK);
	printf("nparams: %d\n", PQnparams(result));

	result = PQexecPrepared(conn, "a", 0, NULL, NULL, NULL, 0);
	assert(PQresultStatus(result) == PGRES_FATAL_ERROR);
	printf("error: %s\n", PQresultErrorField(result,
PG_DIAG_MESSAGE_PRIMARY));
```

When run, it prints the following:

```
nparams: 0
error: there is no parameter $1
```

If you change the query to just the inner `SELECT $1::TEXT`, the number of
parameters is correctly reported, but interestingly the error message
changes:

```
nparams: 1
error: bind message supplies 0 parameters, but prepared statement "a"
requires 1
```

From some quick Googling, I did see this StackOverflow post[1] stating that
COPY queries don't support parameters, but if that's the case it seems like
an error should be reported at the preparation stage. I also don't see
anything about that in the documentation for COPY[2], though I may have
missed it! I see the same behavior on Postgres 11.1 as well, if that's
relevant.

[1]: https://stackoverflow.com/a/22963085
[2]: https://www.postgresql.org/docs/12/sql-copy.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.