Thread: BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()
BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()
From
"Andy McCurdy"
Date:
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; }
Re: BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()
From
Michael Fuhr
Date:
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
Re: BUG #2629: libpq - Cannot deallocate prepared statement created with PQprepare()
From
Tom Lane
Date:
"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