BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()

Started by Andy McCurdyover 19 years ago3 messagesbugs
Jump to latest
#1Andy McCurdy
andy.mccurdy@emergent.net

The following bug has been logged online:

Bug reference: 2629
Logged by: Andy McCurdy
Email address: andy.mccurdy@emergent.net
PostgreSQL version: 8.1.4
Operating system: Windows XP
Description: libpq - Cannot deallocate prepared statement created
with PQprepare()
Details:

According to http://www.postgresql.org/docs/8.1/interactive/libpq-exec.html,
the last statement in the PQprepare() function description suggests that a
user can run the statement: "DEALLOCATE [statement name]" with PQexec() to
deallocate a statement prepared with PQprepare(). When trying to do this, I
consistently get the error message:

ERROR: prepared statement "[statement name]" does not exist

Here's a snippet of code that illustrates what I am attempting to do:

int main()
{

PGconn* conn;
PGresult* result;

conn = PQsetdbLogin("localhost", "5432", NULL, NULL, "postgres", "postgres",
"postgres");

result = PQprepare(conn, "MyQuery", "select * from pg_stat_activity", 0,
NULL);

/*
THE FOLLOW PQEXEC() FAILS. Error message says: ERROR: prepared statement
"myquery" does not exist"
*/
result = PQexec(conn, "DEALLOCATE MyQuery");

result = PQexec(conn, "PREPARE MyQuery AS select * from pg_stat_activity");

/*
THIS WORKS
*/
result = PQexec(conn, "DEALLOCATE MyQuery");

return 0;
}

#2Michael Fuhr
mike@fuhr.org
In reply to: Andy McCurdy (#1)
Re: BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()

On Fri, Sep 15, 2006 at 07:39:32AM +0000, Andy McCurdy wrote:

result = PQprepare(conn, "MyQuery", "select * from pg_stat_activity", 0,
NULL);

/*
THE FOLLOW PQEXEC() FAILS. Error message says: ERROR: prepared statement
"myquery" does not exist"
*/
result = PQexec(conn, "DEALLOCATE MyQuery");

You prepared a mixed-case identifier so you'll need to quote it in
SQL statements to preserve its case. Unquoted identifiers are
folded to lowercase, as the error message shows.

result = PQexec(conn, "DEALLOCATE \"MyQuery\"");

See "Identifiers and Key Words" in the "SQL Syntax" chapter of the
documentation for more information about quoted identifiers.

http://www.postgresql.org/docs/8.1/interactive/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS

--
Michael Fuhr

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andy McCurdy (#1)
Re: BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()

"Andy McCurdy" <andy.mccurdy@emergent.net> writes:

result = PQprepare(conn, "MyQuery", "select * from pg_stat_activity", 0,
NULL);

I believe the above will result in preparing a statement named "MyQuery",
ie, no case-folding happens on the second argument of PQprepare, because
it never goes through the SQL parser.

/*
THE FOLLOW PQEXEC() FAILS. Error message says: ERROR: prepared statement
"myquery" does not exist"
*/
result = PQexec(conn, "DEALLOCATE MyQuery");

I think this would work:

result = PQexec(conn, "DEALLOCATE \"MyQuery\"");

regards, tom lane