Thread: BUG #17195: Can't bind $1::int param when I use COPY TO STDOUT statement - libpq, C++
BUG #17195: Can't bind $1::int param when I use COPY TO STDOUT statement - libpq, C++
From
PG Bug reporting form
Date:
The following bug has been logged on the website: Bug reference: 17195 Logged by: Aleksander Stankiewicz Email address: stankiewiczal@gmail.com PostgreSQL version: 13.4 Operating system: Windows Description: I have test table like below: --DROP TABLE test_point CREATE TABLE test_point( serie_id INT NOT NULL, version_ts INT NOT NULL, PRIMARY KEY (serie_id, version_ts) ); I try to use parametrized query inside COPY TO statement. Te test case showing the issue is below. When I execute this short test I receive such message: 0x0000027645b28dc0 "ERROR: bind message supplies 1 parameters, but prepared statement \"\" requires 0\n" Test case: TEST(TSStorage, CopyParamTest) { auto sql = "COPY(SELECT version_ts FROM test_point WHERE serie_id = $1::int) TO STDOUT (FORMAT binary)"; auto connPtr = PQconnectdb("postgresql://postgres:pswd@localhost/test_db"); int seriesIdParam = htonl(5); // or just put 5 directly here - doesn't matter for the statement compilation here const char *paramValues[] = {(const char *)&seriesIdParam}; const int paramLengths[] = {sizeof(seriesIdParam)}; const int paramFormats[] = {1}; // 1 means binary auto result = PQexecParams(connPtr, sql, 1, //nParams, nullptr, paramValues, paramLengths, paramFormats, 1); // Output format - binary // Ensure it's in COPY_OUT state if (PQresultStatus(result) != PGRES_COPY_OUT) { auto errorMsg = PQerrorMessage(connPtr); int set_breakpoint_here = 0; } PQclear(result); PQfinish(connPtr); } How to provide param for binding there? When I use sql without COPY statement there it recognizes param without any problems.
Re: BUG #17195: Can't bind $1::int param when I use COPY TO STDOUT statement - libpq, C++
From
Tom Lane
Date:
PG Bug reporting form <noreply@postgresql.org> writes: > auto sql = "COPY(SELECT version_ts FROM test_point WHERE serie_id = > $1::int) TO STDOUT (FORMAT binary)"; Don't hold your breath for that to work :-(. Utility statements in general do not support parameterization. COPY is not an exception, even when it contains what looks like a full DML command. Maybe somebody will improve that someday, but we'll certainly treat it as a new feature not a bug fix. regards, tom lane