Index: src/backend/catalog/namespace.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/catalog/namespace.c,v
retrieving revision 1.93
diff -p -u -c -r1.93 namespace.c
*** src/backend/catalog/namespace.c	23 Mar 2007 19:53:51 -0000	1.93
--- src/backend/catalog/namespace.c	30 Mar 2007 12:56:54 -0000
*************** InitTempTableNamespace(void)
*** 1941,1946 ****
--- 1941,1971 ----
  }
  
  /*
+  * Clear all temp tables from out temp namespace.
+  */
+ void
+ ResetTempTableNamespace(void)
+ {
+ 	char		namespaceName[NAMEDATALEN];
+ 	Oid			namespaceId;
+ 
+ 	/* If not allowed to create, no point proceeding */
+ 	if (pg_database_aclcheck(MyDatabaseId, GetUserId(),
+ 							 ACL_CREATE_TEMP) != ACLCHECK_OK)
+ 		return;
+ 
+ 	/* find oid */
+ 	snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId);
+ 	namespaceId = GetSysCacheOid(NAMESPACENAME,
+ 								 CStringGetDatum(namespaceName),
+ 								 0, 0, 0);
+ 
+ 	/* clean if exists */
+ 	if (OidIsValid(namespaceId))
+ 		RemoveTempRelations(namespaceId);
+ }
+ 
+ /*
   * End-of-transaction cleanup for namespaces.
   */
  void
Index: src/backend/commands/async.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/async.c,v
retrieving revision 1.135
diff -p -u -c -r1.135 async.c
*** src/backend/commands/async.c	5 Jan 2007 22:19:25 -0000	1.135
--- src/backend/commands/async.c	30 Mar 2007 12:56:54 -0000
*************** static bool unlistenExitRegistered = fal
*** 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 ----
*************** Async_Unlisten(const char *relname)
*** 335,341 ****
   *
   *--------------------------------------------------------------
   */
! static void
  Async_UnlistenAll(void)
  {
  	Relation	lRel;
--- 334,340 ----
   *
   *--------------------------------------------------------------
   */
! void
  Async_UnlistenAll(void)
  {
  	Relation	lRel;
Index: src/backend/commands/portalcmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/portalcmds.c,v
retrieving revision 1.62
diff -p -u -c -r1.62 portalcmds.c
*** src/backend/commands/portalcmds.c	13 Mar 2007 00:33:39 -0000	1.62
--- src/backend/commands/portalcmds.c	30 Mar 2007 12:56:54 -0000
*************** PerformPortalClose(const char *name)
*** 236,246 ****
  {
  	Portal		portal;
  
  	/*
  	 * Disallow empty-string cursor name (conflicts with protocol-level
  	 * unnamed portal).
  	 */
! 	if (!name || name[0] == '\0')
  		ereport(ERROR,
  				(errcode(ERRCODE_INVALID_CURSOR_NAME),
  				 errmsg("invalid cursor name: must not be empty")));
--- 236,253 ----
  {
  	Portal		portal;
  
+ 	/* NULL means CLOSE ALL */
+ 	if (name == NULL)
+ 	{
+ 		PortalHashTableDeleteAll();
+ 		return;
+ 	}
+ 
  	/*
  	 * Disallow empty-string cursor name (conflicts with protocol-level
  	 * unnamed portal).
  	 */
! 	if (name[0] == '\0')
  		ereport(ERROR,
  				(errcode(ERRCODE_INVALID_CURSOR_NAME),
  				 errmsg("invalid cursor name: must not be empty")));
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	30 Mar 2007 12:56:54 -0000
*************** FetchPreparedStatementTargetList(Prepare
*** 575,581 ****
  void
  DeallocateQuery(DeallocateStmt *stmt)
  {
! 	DropPreparedStatement(stmt->name, true);
  }
  
  /*
--- 575,584 ----
  void
  DeallocateQuery(DeallocateStmt *stmt)
  {
! 	if (stmt->name)
! 		DropPreparedStatement(stmt->name, true);
! 	else
! 		DropAllPreparedStatements();
  }
  
  /*
*************** DropPreparedStatement(const char *stmt_n
*** 602,607 ****
--- 605,635 ----
  }
  
  /*
+  * Drop all cached statements.
+  */
+ 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/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	30 Mar 2007 12:56:55 -0000
*************** ClosePortalStmt:
*** 1666,1671 ****
--- 1666,1677 ----
  					n->portalname = $2;
  					$$ = (Node *)n;
  				}
+ 			| CLOSE ALL
+ 				{
+ 					ClosePortalStmt *n = makeNode(ClosePortalStmt);
+ 					n->portalname = NULL;
+ 					$$ = (Node *)n;
+ 				}
  		;
  
  
*************** DeallocateStmt: DEALLOCATE name
*** 5564,5569 ****
--- 5570,5581 ----
  						n->name = $3;
  						$$ = (Node *) n;
  					}
+ 				| DEALLOCATE ALL
+ 					{
+ 						DeallocateStmt *n = makeNode(DeallocateStmt);
+ 						n->name = NULL;
+ 						$$ = (Node *) n;
+ 					}
  		;
  
  /*****************************************************************************
Index: src/backend/utils/cache/plancache.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/cache/plancache.c,v
retrieving revision 1.5
diff -p -u -c -r1.5 plancache.c
*** src/backend/utils/cache/plancache.c	26 Mar 2007 00:36:19 -0000	1.5
--- src/backend/utils/cache/plancache.c	30 Mar 2007 12:56:55 -0000
*************** PlanCacheCallback(Datum arg, Oid relid)
*** 881,886 ****
--- 881,897 ----
  }
  
  /*
+  * ResetPlanCache: drop all cached plans.
+  *
+  * FIXME: maybe should just walt list unconditionally?
+  */
+ void
+ ResetPlanCache(void)
+ {
+ 	PlanCacheCallback((Datum)0, InvalidOid);
+ }
+ 
+ /*
   * ScanQueryForRelids callback function for PlanCacheCallback
   */
  static void
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.383
diff -p -u -c -r1.383 guc.c
*** src/backend/utils/misc/guc.c	19 Mar 2007 23:38:30 -0000	1.383
--- src/backend/utils/misc/guc.c	30 Mar 2007 12:56:55 -0000
*************** GetPGVariableResultDesc(const char *name
*** 4951,4956 ****
--- 4951,4978 ----
  	return tupdesc;
  }
  
+ static void
+ ResetSession(void)
+ {
+ 	/* ROLLBACK; */
+ 	if (IsTransactionBlock())
+ 		UserAbortTransactionBlock();
+ 	/* DEALLOCATE ALL; */
+ 	DropAllPreparedStatements();
+ 	/* CLOSE ALL */
+ 	PortalHashTableDeleteAll();
+ 	/* RESET ALL; */
+ 	ResetAllOptions();
+ 	/* SET SESSION AUTHORIZATION DEFAULT; */
+ 	SetPGVariable("session_authorization", NIL, false);
+ 	/* UNLISTEN *; */
+ 	Async_UnlistenAll();
+ 	/* RESET TEMPS */
+ 	ResetTempTableNamespace();
+ 	/* RESET PLANS */
+ 	ResetPlanCache();
+ }
+ 
  /*
   * RESET command
   */
*************** ResetPGVariable(const char *name)
*** 4959,4964 ****
--- 4981,4992 ----
  {
  	if (pg_strcasecmp(name, "all") == 0)
  		ResetAllOptions();
+ 	else if (pg_strcasecmp(name, "session") == 0)
+ 		ResetSession();
+ 	else if (pg_strcasecmp(name, "temps") == 0)
+ 		ResetTempTableNamespace();
+ 	else if (pg_strcasecmp(name, "plans") == 0)
+ 		ResetPlanCache();
  	else
  		set_config_option(name,
  						  NULL,
Index: src/backend/utils/mmgr/portalmem.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v
retrieving revision 1.100
diff -p -u -c -r1.100 portalmem.c
*** src/backend/utils/mmgr/portalmem.c	13 Mar 2007 00:33:42 -0000	1.100
--- src/backend/utils/mmgr/portalmem.c	30 Mar 2007 12:56:55 -0000
*************** PortalDrop(Portal portal, bool isTopComm
*** 452,457 ****
--- 452,482 ----
  	pfree(portal);
  }
  
+ /*
+  * Delete all WITH HOLD cursors
+  *
+  * Commands: CLOSE ALL, RESET SESSION
+  */
+ void
+ PortalHashTableDeleteAll(void)
+ {
+ 	HASH_SEQ_STATUS status;
+ 	PortalHashEnt *hentry;
+ 
+ 	if (PortalHashTable == NULL)
+ 		return;
+ 
+ 	hash_seq_init(&status, PortalHashTable);
+ 	while ((hentry = hash_seq_search(&status)) != NULL)
+ 	{
+ 		Portal portal = hentry->portal;
+ 
+ 		/* Drop only WITH HOLD: portal->cursorOptions & CURSOR_OPT_HOLD ? */
+ 		if (portal->status != PORTAL_ACTIVE)
+ 			PortalDrop(portal, false);
+ 	}
+ }
+ 
  
  /*
   * Pre-commit processing for portals.
Index: src/include/catalog/namespace.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/namespace.h,v
retrieving revision 1.45
diff -p -u -c -r1.45 namespace.h
*** src/include/catalog/namespace.h	23 Mar 2007 19:53:52 -0000	1.45
--- src/include/catalog/namespace.h	30 Mar 2007 12:56:55 -0000
*************** extern char *namespace_search_path;
*** 100,103 ****
--- 100,105 ----
  
  extern List *fetch_search_path(bool includeImplicit);
  
+ extern void ResetTempTableNamespace(void);
+ 
  #endif   /* NAMESPACE_H */
Index: src/include/commands/async.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/commands/async.h,v
retrieving revision 1.34
diff -p -u -c -r1.34 async.h
*** src/include/commands/async.h	5 Jan 2007 22:19:53 -0000	1.34
--- src/include/commands/async.h	30 Mar 2007 12:56:55 -0000
*************** extern bool Trace_notify;
*** 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: /projects/cvsroot/pgsql/src/include/commands/prepare.h,v
retrieving revision 1.25
diff -p -u -c -r1.25 prepare.h
*** src/include/commands/prepare.h	13 Mar 2007 00:33:43 -0000	1.25
--- src/include/commands/prepare.h	30 Mar 2007 12:56:55 -0000
*************** extern void DropPreparedStatement(const 
*** 59,62 ****
--- 59,64 ----
  extern TupleDesc FetchPreparedStatementResultDesc(PreparedStatement *stmt);
  extern List *FetchPreparedStatementTargetList(PreparedStatement *stmt);
  
+ void DropAllPreparedStatements(void);
+ 
  #endif   /* PREPARE_H */
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	30 Mar 2007 12:56:55 -0000
*************** typedef struct ClosePortalStmt
*** 1451,1456 ****
--- 1451,1457 ----
  {
  	NodeTag		type;
  	char	   *portalname;		/* name of the portal (cursor) */
+ 								/* NULL means CLOSE ALL */
  } ClosePortalStmt;
  
  /* ----------------------
*************** typedef struct DeallocateStmt
*** 1970,1975 ****
--- 1971,1977 ----
  {
  	NodeTag		type;
  	char	   *name;			/* The name of the plan to remove */
+ 								/* NULL means DEALLOCATE ALL */
  } DeallocateStmt;
  
  /*
Index: src/include/utils/plancache.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/plancache.h,v
retrieving revision 1.4
diff -p -u -c -r1.4 plancache.h
*** src/include/utils/plancache.h	23 Mar 2007 19:53:52 -0000	1.4
--- src/include/utils/plancache.h	30 Mar 2007 12:56:56 -0000
*************** extern void ReleaseCachedPlan(CachedPlan
*** 105,108 ****
--- 105,110 ----
  extern TupleDesc PlanCacheComputeResultDesc(List *stmt_list);
  extern bool HaveCachedPlans(void);
  
+ extern void ResetPlanCache(void);
+ 
  #endif   /* PLANCACHE_H */
Index: src/include/utils/portal.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/portal.h,v
retrieving revision 1.74
diff -p -u -c -r1.74 portal.h
*** src/include/utils/portal.h	13 Mar 2007 00:33:43 -0000	1.74
--- src/include/utils/portal.h	30 Mar 2007 12:56:56 -0000
*************** extern void PortalDefineQuery(Portal por
*** 212,216 ****
--- 212,217 ----
  				  CachedPlan *cplan);
  extern Node *PortalListGetPrimaryStmt(List *stmts);
  extern void PortalCreateHoldStore(Portal portal);
+ extern void PortalHashTableDeleteAll(void);
  
  #endif   /* PORTAL_H */