Index: doc/src/sgml/ref/deallocate.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/deallocate.sgml,v retrieving revision 1.9 diff -p -u -c -r1.9 deallocate.sgml *** doc/src/sgml/ref/deallocate.sgml 16 Sep 2006 00:30:18 -0000 1.9 --- doc/src/sgml/ref/deallocate.sgml 27 Mar 2007 13:55:10 -0000 *************** PostgreSQL documentation *** 26,31 **** --- 26,32 ---- DEALLOCATE [ PREPARE ] name + DEALLOCATE ALL *************** DEALLOCATE [ PREPARE ] + DEALLOCATE ALL deallocates all prepares SQL + statements for current session. + + + For more information on prepared statements, see . *************** DEALLOCATE [ PREPARE ] + + + ALL + + + Deallocates all prepares statements in current session. + + + Index: src/include/nodes/parsenodes.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v retrieving revision 1.343 diff -p -u -c -r1.343 parsenodes.h *** src/include/nodes/parsenodes.h 19 Mar 2007 23:38:32 -0000 1.343 --- src/include/nodes/parsenodes.h 27 Mar 2007 13:55:11 -0000 *************** typedef struct DeallocateStmt *** 1970,1975 **** --- 1970,1976 ---- { NodeTag type; char *name; /* The name of the plan to remove */ + /* Or NULL for DEALLOCATE ALL */ } DeallocateStmt; /* Index: src/backend/parser/gram.y =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v retrieving revision 2.584 diff -p -u -c -r2.584 gram.y *** src/backend/parser/gram.y 26 Mar 2007 16:58:39 -0000 2.584 --- src/backend/parser/gram.y 27 Mar 2007 13:55:11 -0000 *************** execute_param_clause: '(' expr_list ')' *** 5548,5554 **** /***************************************************************************** * * QUERY: ! * DEALLOCATE [PREPARE] * *****************************************************************************/ --- 5548,5554 ---- /***************************************************************************** * * QUERY: ! * DEALLOCATE [PREPARE] |ALL * *****************************************************************************/ *************** DeallocateStmt: DEALLOCATE name *** 5564,5569 **** --- 5564,5581 ---- n->name = $3; $$ = (Node *) n; } + | DEALLOCATE ALL + { + DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = NULL; + $$ = (Node *) n; + } + | DEALLOCATE PREPARE ALL + { + DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = NULL; + $$ = (Node *) n; + } ; /***************************************************************************** Index: src/backend/commands/prepare.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/commands/prepare.c,v retrieving revision 1.70 diff -p -u -c -r1.70 prepare.c *** src/backend/commands/prepare.c 13 Mar 2007 00:33:39 -0000 1.70 --- src/backend/commands/prepare.c 27 Mar 2007 13:55:11 -0000 *************** static void InitQueryHashTable(void); *** 46,51 **** --- 46,52 ---- static ParamListInfo EvaluateParams(PreparedStatement *pstmt, List *params, const char *queryString, EState *estate); static Datum build_regtype_array(Oid *param_types, int num_params); + static void DropAllPreparedStatements(void); /* * Implements the 'PREPARE' utility statement. *************** FetchPreparedStatementTargetList(Prepare *** 575,581 **** void DeallocateQuery(DeallocateStmt *stmt) { ! DropPreparedStatement(stmt->name, true); } /* --- 576,586 ---- void DeallocateQuery(DeallocateStmt *stmt) { ! /* NULL means DEALLOCATE ALL */ ! if (stmt->name == NULL) ! DropAllPreparedStatements(); ! else ! DropPreparedStatement(stmt->name, true); } /* *************** DropPreparedStatement(const char *stmt_n *** 602,607 **** --- 607,637 ---- } /* + * Drop all cached statements. + */ + static void + DropAllPreparedStatements(void) + { + HASH_SEQ_STATUS seq; + PreparedStatement *entry; + + /* nothing cached */ + if (!prepared_queries) + return; + + /* walk over cache */ + hash_seq_init(&seq, prepared_queries); + while ((entry = hash_seq_search(&seq)) != NULL) + { + /* Release the plancache entry */ + DropCachedPlan(entry->plansource); + + /* Now we can remove the hash table entry */ + hash_search(prepared_queries, entry->stmt_name, HASH_REMOVE, NULL); + } + } + + /* * Implements the 'EXPLAIN EXECUTE' utility statement. */ void Index: src/test/regress/sql/prepare.sql =================================================================== RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/prepare.sql,v retrieving revision 1.4 diff -p -u -c -r1.4 prepare.sql *** src/test/regress/sql/prepare.sql 15 Jan 2006 22:18:47 -0000 1.4 --- src/test/regress/sql/prepare.sql 27 Mar 2007 13:55:11 -0000 *************** PREPARE q7(unknown) AS *** 68,70 **** --- 68,76 ---- SELECT name, statement, parameter_types FROM pg_prepared_statements ORDER BY name; + + -- test DEALLOCATE ALL + DEALLOCATE ALL; + SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; + Index: src/test/regress/expected/prepare.out =================================================================== RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/prepare.out,v retrieving revision 1.12 diff -p -u -c -r1.12 prepare.out *** src/test/regress/expected/prepare.out 21 Dec 2006 16:05:16 -0000 1.12 --- src/test/regress/expected/prepare.out 27 Mar 2007 13:55:11 -0000 *************** SELECT name, statement, parameter_types *** 166,168 **** --- 166,176 ---- : SELECT * FROM road WHERE thepath = $1; (5 rows) + -- test DEALLOCATE ALL + DEALLOCATE ALL; + SELECT name, statement, parameter_types FROM pg_prepared_statements + ORDER BY name; + name | statement | parameter_types + ------+-----------+----------------- + (0 rows) +