Index: doc/src/sgml/ref/reset.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v retrieving revision 1.26 diff -c -c -r1.26 reset.sgml *** doc/src/sgml/ref/reset.sgml 14 Dec 2003 00:15:03 -0000 1.26 --- doc/src/sgml/ref/reset.sgml 25 Apr 2006 14:00:45 -0000 *************** *** 11,17 **** RESET ! restore the value of a run-time parameter to the default value --- 11,18 ---- RESET ! restore the value of a run-time parameter to the default value, ! or reset all aspects of a session *************** *** 22,27 **** --- 23,29 ---- RESET name RESET ALL + RESET CONNECTION *************** *** 50,57 **** See the SET reference page for details on the ! transaction behavior of RESET. --- 52,62 ---- See the SET reference page for details on the ! transaction behavior of RESET. RESET ! CONNECTION can be used to reset all aspects of ! a session, not just variable values. + *************** *** 76,82 **** --- 81,100 ---- + + + CONNECTION + + + Reset the all aspects of a session, including runtime parameters, + transaction status, temporary tables, WITH HOLD + cursors, prepared statements, and LISTEN + registrations. + + + + Index: src/backend/catalog/namespace.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/catalog/namespace.c,v retrieving revision 1.82 diff -c -c -r1.82 namespace.c *** src/backend/catalog/namespace.c 5 Mar 2006 15:58:22 -0000 1.82 --- src/backend/catalog/namespace.c 25 Apr 2006 14:00:47 -0000 *************** *** 134,140 **** /* Local functions */ static void recomputeNamespacePath(void); static void InitTempTableNamespace(void); - static void RemoveTempRelations(Oid tempNamespaceId); static void RemoveTempRelationsCallback(int code, Datum arg); static void NamespaceCallback(Datum arg, Oid relid); --- 134,139 ---- *************** *** 1729,1735 **** * in order to clean out any relations that might have been created by * a crashed backend. */ ! static void RemoveTempRelations(Oid tempNamespaceId) { ObjectAddress object; --- 1728,1734 ---- * in order to clean out any relations that might have been created by * a crashed backend. */ ! void RemoveTempRelations(Oid tempNamespaceId) { ObjectAddress object; Index: src/backend/commands/async.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/commands/async.c,v retrieving revision 1.129 diff -c -c -r1.129 async.c *** src/backend/commands/async.c 5 Mar 2006 15:58:23 -0000 1.129 --- src/backend/commands/async.c 25 Apr 2006 14:00:48 -0000 *************** *** 127,133 **** bool Trace_notify = false; - static void Async_UnlistenAll(void); static void Async_UnlistenOnExit(int code, Datum arg); static void ProcessIncomingNotify(void); static void NotifyMyFrontEnd(char *relname, int32 listenerPID); --- 127,132 ---- *************** *** 335,341 **** * *-------------------------------------------------------------- */ ! static void Async_UnlistenAll(void) { Relation lRel; --- 334,340 ---- * *-------------------------------------------------------------- */ ! void Async_UnlistenAll(void) { Relation lRel; Index: src/backend/commands/prepare.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/commands/prepare.c,v retrieving revision 1.50 diff -c -c -r1.50 prepare.c *** src/backend/commands/prepare.c 22 Apr 2006 01:25:58 -0000 1.50 --- src/backend/commands/prepare.c 25 Apr 2006 14:00:49 -0000 *************** *** 33,39 **** #include "utils/hsearch.h" #include "utils/memutils.h" - /* * The hash table in which prepared queries are stored. This is * per-backend: query plans are not shared between backends. --- 33,38 ---- *************** *** 548,553 **** --- 547,576 ---- } /* + * Remove all prepared plans from the backend. + */ + void + DropAllPreparedStatements(void) + { + PreparedStatement *prep_statement; + HASH_SEQ_STATUS status; + + if (!prepared_queries) + return; + + hash_seq_init(&status, prepared_queries); + + while ((prep_statement = (PreparedStatement *) hash_seq_search(&status))) + { + DropDependentPortals(prep_statement->context); + + /* Flush the context holding the subsidiary data */ + MemoryContextDelete(prep_statement->context); + hash_search(prepared_queries, prep_statement->stmt_name, HASH_REMOVE, NULL); + } + } + + /* * Internal version of DEALLOCATE * * If showError is false, dropping a nonexistent statement is a no-op. Index: src/backend/parser/gram.y =================================================================== RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v retrieving revision 2.540 diff -c -c -r2.540 gram.y *** src/backend/parser/gram.y 24 Apr 2006 22:59:19 -0000 2.540 --- src/backend/parser/gram.y 25 Apr 2006 14:00:56 -0000 *************** *** 1244,1249 **** --- 1244,1255 ---- n->name = $2; $$ = (Node *) n; } + | RESET CONNECTION + { + VariableResetStmt *n = makeNode(VariableResetStmt); + n->name = "connection"; + $$ = (Node *) n; + } | RESET TIME ZONE { VariableResetStmt *n = makeNode(VariableResetStmt); Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v retrieving revision 1.315 diff -c -c -r1.315 guc.c *** src/backend/utils/misc/guc.c 10 Apr 2006 21:53:38 -0000 1.315 --- src/backend/utils/misc/guc.c 25 Apr 2006 14:01:08 -0000 *************** *** 32,37 **** --- 32,38 ---- #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/async.h" + #include "commands/prepare.h" #include "commands/variable.h" #include "commands/vacuum.h" #include "executor/executor.h" *************** *** 53,58 **** --- 54,60 ---- #include "postmaster/bgwriter.h" #include "postmaster/syslogger.h" #include "postmaster/postmaster.h" + #include "storage/backendid.h" #include "storage/bufmgr.h" #include "storage/fd.h" #include "storage/freespace.h" *************** *** 61,71 **** #include "tcop/tcopprot.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/memutils.h" #include "utils/pg_locale.h" #include "pgstat.h" - #ifndef PG_KRB_SRVTAB #define PG_KRB_SRVTAB "" #endif --- 63,75 ---- #include "tcop/tcopprot.h" #include "utils/array.h" #include "utils/builtins.h" + #include "utils/hsearch.h" #include "utils/memutils.h" #include "utils/pg_locale.h" + #include "utils/portal.h" + #include "utils/syscache.h" #include "pgstat.h" #ifndef PG_KRB_SRVTAB #define PG_KRB_SRVTAB "" #endif *************** *** 4649,4656 **** --- 4653,4685 ---- void ResetPGVariable(const char *name) { + char namespaceName[NAMEDATALEN]; + Oid namespaceId; + if (pg_strcasecmp(name, "all") == 0) + /* resetting all GUC variables */ ResetAllOptions(); + else if (pg_strcasecmp(name, "connection") == 0) + { + ResetAllOptions(); + + /* Clean temp-tables */ + snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", + MyBackendId); + namespaceId = GetSysCacheOid(NAMESPACENAME, + CStringGetDatum(namespaceName), 0, 0, 0); + RemoveTempRelations(namespaceId); + + DropAllPreparedStatements(); + + Async_UnlistenAll(); + + /* Delete cursors, including WITH HOLD */ + PortalHashTableDeleteAll(); + + if (IsTransactionBlock()) + UserAbortTransactionBlock(); + } else set_config_option(name, NULL, Index: src/backend/utils/mmgr/portalmem.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v retrieving revision 1.85 diff -c -c -r1.85 portalmem.c *** src/backend/utils/mmgr/portalmem.c 5 Mar 2006 15:58:49 -0000 1.85 --- src/backend/utils/mmgr/portalmem.c 25 Apr 2006 14:01:09 -0000 *************** *** 402,407 **** --- 402,410 ---- HASH_SEQ_STATUS status; PortalHashEnt *hentry; + if (PortalHashTable == NULL) + return; + hash_seq_init(&status, PortalHashTable); while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL) *************** *** 413,418 **** --- 416,445 ---- } } + /* + * Delete all WITH HOLD cursors, used by RESET CONNECTION + */ + void + PortalHashTableDeleteAll(void) + { + HASH_SEQ_STATUS status; + PortalHashEnt *hentry; + + if (PortalHashTable == NULL) + return; + + hash_seq_init(&status, PortalHashTable); + + while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL) + { + Portal portal = hentry->portal; + + if ((portal->cursorOptions & CURSOR_OPT_HOLD) && + portal->status != PORTAL_ACTIVE) + PortalDrop(portal, false); + } + } + /* * Pre-commit processing for portals. Index: src/include/catalog/namespace.h =================================================================== RCS file: /cvsroot/pgsql/src/include/catalog/namespace.h,v retrieving revision 1.39 diff -c -c -r1.39 namespace.h *** src/include/catalog/namespace.h 5 Mar 2006 15:58:54 -0000 1.39 --- src/include/catalog/namespace.h 25 Apr 2006 14:01:13 -0000 *************** *** 74,79 **** --- 74,81 ---- extern Oid FindConversionByName(List *conname); extern Oid FindDefaultConversionProc(int4 for_encoding, int4 to_encoding); + extern void RemoveTempRelations(Oid tempNamespaceId); + /* initialization & transaction cleanup code */ extern void InitializeSearchPath(void); extern void AtEOXact_Namespace(bool isCommit); Index: src/include/commands/async.h =================================================================== RCS file: /cvsroot/pgsql/src/include/commands/async.h,v retrieving revision 1.31 diff -c -c -r1.31 async.h *** src/include/commands/async.h 5 Mar 2006 15:58:55 -0000 1.31 --- src/include/commands/async.h 25 Apr 2006 14:01:13 -0000 *************** *** 19,24 **** --- 19,25 ---- extern void Async_Notify(const char *relname); extern void Async_Listen(const char *relname); extern void Async_Unlisten(const char *relname); + extern void Async_UnlistenAll(void); /* perform (or cancel) outbound notify processing at transaction commit */ extern void AtCommit_Notify(void); Index: src/include/commands/prepare.h =================================================================== RCS file: /cvsroot/pgsql/src/include/commands/prepare.h,v retrieving revision 1.18 diff -c -c -r1.18 prepare.h *** src/include/commands/prepare.h 5 Mar 2006 15:58:55 -0000 1.18 --- src/include/commands/prepare.h 25 Apr 2006 14:01:15 -0000 *************** *** 62,67 **** --- 62,68 ---- extern PreparedStatement *FetchPreparedStatement(const char *stmt_name, bool throwError); extern void DropPreparedStatement(const char *stmt_name, bool showError); + extern void DropAllPreparedStatements(void); extern List *FetchPreparedStatementParams(const char *stmt_name); extern TupleDesc FetchPreparedStatementResultDesc(PreparedStatement *stmt); extern bool PreparedStatementReturnsTuples(PreparedStatement *stmt); Index: src/include/utils/portal.h =================================================================== RCS file: /cvsroot/pgsql/src/include/utils/portal.h,v retrieving revision 1.59 diff -c -c -r1.59 portal.h *** src/include/utils/portal.h 5 Mar 2006 15:59:07 -0000 1.59 --- src/include/utils/portal.h 25 Apr 2006 14:01:21 -0000 *************** *** 200,205 **** --- 200,206 ---- extern void AtSubCleanup_Portals(SubTransactionId mySubid); extern Portal CreatePortal(const char *name, bool allowDup, bool dupSilent); extern Portal CreateNewPortal(void); + extern void PortalHashTableDeleteAll(void); extern void PortalDrop(Portal portal, bool isTopCommit); extern void DropDependentPortals(MemoryContext queryContext); extern Portal GetPortalByName(const char *name); Index: src/interfaces/ecpg/preproc/preproc.y =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/ecpg/preproc/preproc.y,v retrieving revision 1.321 diff -c -c -r1.321 preproc.y *** src/interfaces/ecpg/preproc/preproc.y 7 Mar 2006 01:00:19 -0000 1.321 --- src/interfaces/ecpg/preproc/preproc.y 25 Apr 2006 14:01:30 -0000 *************** *** 1196,1201 **** --- 1196,1203 ---- { $$ = make_str("reset transaction isolation level"); } | RESET SESSION AUTHORIZATION { $$ = make_str("reset session authorization"); } + | RESET CONNECTION + { $$ = make_str("reset connection"); } | RESET ALL { $$ = make_str("reset all"); } ;