diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml
index 3b9b8b952ee832c5fb1da5c469170ebdf1032277..90ad9adc53c3fe1e051bf6ed28bf773ea3192154 100644
--- a/doc/src/sgml/ref/allfiles.sgml
+++ b/doc/src/sgml/ref/allfiles.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/allfiles.sgml,v 1.69 2007/01/23 05:07:16 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/allfiles.sgml,v 1.70 2007/04/26 16:13:08 neilc Exp $
 PostgreSQL documentation
 Complete list of usable sgml source files in this directory.
 -->
@@ -61,6 +61,7 @@ Complete list of usable sgml source files in this directory.
 <!entity deallocate         system "deallocate.sgml">
 <!entity declare            system "declare.sgml">
 <!entity delete             system "delete.sgml">
+<!entity discard            system "discard.sgml">
 <!entity dropAggregate      system "drop_aggregate.sgml">
 <!entity dropCast           system "drop_cast.sgml">
 <!entity dropConversion     system "drop_conversion.sgml">
diff --git a/doc/src/sgml/ref/discard.sgml b/doc/src/sgml/ref/discard.sgml
new file mode 100644
index 0000000000000000000000000000000000000000..731f34136e170cb6a04ff4993225bd5858b75370
--- /dev/null
+++ b/doc/src/sgml/ref/discard.sgml
@@ -0,0 +1,107 @@
+<!--
+$PostgreSQL: pgsql/doc/src/sgml/ref/discard.sgml,v 1.1 2007/04/26 16:13:09 neilc Exp $
+PostgreSQL documentation
+-->
+
+<refentry id="SQL-DISCARD">
+ <refmeta>
+  <refentrytitle id="SQL-DISCARD-TITLE">DISCARD</refentrytitle>
+  <refmiscinfo>SQL - Language Statements</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+  <refname>DISCARD</refname>
+  <refpurpose>Discard internal server state</refpurpose>
+ </refnamediv>
+
+ <indexterm zone="sql-discard">
+  <primary>DISCARD</primary>
+ </indexterm>
+
+ <refsynopsisdiv>
+<synopsis>
+DISCARD { ALL | PLANS | TEMPORARY | TEMP }
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+  <title>Description</title>
+
+  <para>
+   <command>DISCARD</> releases internal resources associated with a
+   database session. These resources are normally released at the end
+   of the session.
+  </para>
+
+  <para>
+   <command>DISCARD TEMP</> drops all temporary tables created in the
+   current session.  <command>DISCARD PLANS</> releases all internally
+   cached query plans.  <command>DISCARD ALL</> resets a session to
+   its original state, discarding temporary resources and resetting
+   session-local configuration changes.
+  </para>
+ </refsect1>
+
+ <refsect1>
+  <title>Parameters</title>
+
+  <variablelist>
+
+   <varlistentry>
+    <term><literal>TEMPORARY</literal> or <literal>TEMP</literal></term>
+    <listitem>
+     <para>
+      Drops all temporary tables created in the current session.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>PLANS</literal></term>
+    <listitem>
+     <para>
+      Releases all cached query plans.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>ALL</literal></term>
+    <listitem>
+     <para>
+      Releases all temporary resources associated with the current
+      session and resets the session to its initial state. This has
+      the same effect as executing the following sequence of
+      statements:
+<programlisting>
+SET SESSION AUTHORIZATION DEFAULT;
+RESET ALL;
+DEALLOCATE ALL;
+CLOSE ALL;
+UNLISTEN *;
+DISCARD PLANS;
+DISCARD TEMP;
+</programlisting>
+     </para>
+    </listitem>
+   </varlistentry>
+
+  </variablelist>
+ </refsect1>
+
+ <refsect1>
+  <title>Notes</title>
+
+   <para>
+    <command>DISCARD ALL</> cannot be executed inside a transaction block.
+   </para>
+ </refsect1>
+
+ <refsect1>
+  <title>Compatibility</title>
+
+  <para>
+   <command>DISCARD</command> is a <productname>PostgreSQL</productname> extension.
+  </para>
+ </refsect1>
+</refentry>
diff --git a/doc/src/sgml/ref/reset.sgml b/doc/src/sgml/ref/reset.sgml
index e98f7ff56c6af0830cb33f62eb7200b772cc82a4..355de8912873e57fcb2575eb6799225ca9b17837 100644
--- a/doc/src/sgml/ref/reset.sgml
+++ b/doc/src/sgml/ref/reset.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/reset.sgml,v 1.34 2007/04/12 22:34:45 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/reset.sgml,v 1.35 2007/04/26 16:13:09 neilc Exp $
 PostgreSQL documentation
 -->
 
@@ -22,7 +22,6 @@ PostgreSQL documentation
 <synopsis>
 RESET <replaceable class="PARAMETER">configuration_parameter</replaceable>
 RESET ALL
-RESET { PLANS | SESSION | TEMP | TEMPORARY }
 </synopsis>
  </refsynopsisdiv>
 
@@ -53,15 +52,6 @@ SET <replaceable class="parameter">configuration_parameter</replaceable> TO DEFA
    See the <command>SET</> reference page for details on the
    transaction behavior of <command>RESET</>.
   </para>
-
-  <para>
-   <command>RESET</> can also be used to release internal resources
-   that are usually released at the end of session.  <command>RESET
-   TEMP</> drops all temporary tables created in the current session.
-   <command>RESET PLANS</> releases all internally cached plans.
-   <command>RESET SESSION</> releases all externally visible temporary
-   resources associated with the current session.
-  </para>
  </refsect1>
 
  <refsect1>
@@ -86,56 +76,9 @@ SET <replaceable class="parameter">configuration_parameter</replaceable> TO DEFA
      </para>
     </listitem>
    </varlistentry>
-
-   <varlistentry>
-    <term><literal>TEMP, TEMPORARY</literal></term>
-    <listitem>
-     <para>
-      Drops all temporary tables created in the current session.
-     </para>
-    </listitem>
-   </varlistentry>
-
-   <varlistentry>
-    <term><literal>PLANS</literal></term>
-    <listitem>
-     <para>
-      Releases all cached query plans.
-     </para>
-    </listitem>
-   </varlistentry>
-
-   <varlistentry>
-    <term><literal>SESSION</literal></term>
-    <listitem>
-     <para>
-      Releases all temporary resources associated with the current
-      session. This has the same effect as executing the following
-      command sequence:
-<programlisting>
-SET SESSION AUTHORIZATION DEFAULT;
-RESET ALL;
-DEALLOCATE ALL;
-CLOSE ALL;
-UNLISTEN *;
-RESET PLANS;
-RESET TEMP;
-</programlisting>
-     </para>
-    </listitem>
-   </varlistentry>
-
   </variablelist>
  </refsect1>
 
- <refsect1>
-  <title>Notes</title>
-
-   <para>
-    <command>RESET SESSION</> cannot be executed inside a transaction block.
-   </para>
- </refsect1>
-
  <refsect1>
   <title>Examples</title>
 
diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml
index 06c6c4a21db58678b72510f86698919d7a7b9968..06699a5b34ba920d8afe4d3c424a650d91e697f2 100644
--- a/doc/src/sgml/reference.sgml
+++ b/doc/src/sgml/reference.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/reference.sgml,v 1.62 2007/01/31 20:56:18 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/reference.sgml,v 1.63 2007/04/26 16:13:08 neilc Exp $ -->
 
 <part id="reference">
  <title>Reference</title>
@@ -89,6 +89,7 @@
    &deallocate;
    &declare;
    &delete;
+   &discard;
    &dropAggregate;
    &dropCast;
    &dropConversion;
diff --git a/src/backend/commands/Makefile b/src/backend/commands/Makefile
index f2e5bf52f209f74cade7da5ed4d9e63022fd9172..4b25ae6489e6157b038570f5da98b35bb3171df7 100644
--- a/src/backend/commands/Makefile
+++ b/src/backend/commands/Makefile
@@ -4,7 +4,7 @@
 #    Makefile for backend/commands
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/commands/Makefile,v 1.35 2007/01/20 17:16:11 petere Exp $
+#    $PostgreSQL: pgsql/src/backend/commands/Makefile,v 1.36 2007/04/26 16:13:09 neilc Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = aggregatecmds.o alter.o analyze.o async.o cluster.o comment.o  \
 	conversioncmds.o copy.o \
-	dbcommands.o define.o explain.o functioncmds.o \
+	dbcommands.o define.o discard.o explain.o functioncmds.o \
 	indexcmds.o lockcmds.o operatorcmds.o opclasscmds.o \
 	portalcmds.o prepare.o proclang.o \
 	schemacmds.o sequence.o tablecmds.o tablespace.o trigger.o \
diff --git a/src/backend/commands/discard.c b/src/backend/commands/discard.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2ae6defd0426eebad07b2b40cab9166a88d7171
--- /dev/null
+++ b/src/backend/commands/discard.c
@@ -0,0 +1,71 @@
+/*-------------------------------------------------------------------------
+ *
+ * discard.c
+ *	  The implementation of the DISCARD command
+ *
+ * Copyright (c) 1996-2007, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ *	  $PostgreSQL: pgsql/src/backend/commands/discard.c,v 1.1 2007/04/26 16:13:10 neilc Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "access/xact.h"
+#include "catalog/namespace.h"
+#include "commands/async.h"
+#include "commands/discard.h"
+#include "commands/prepare.h"
+#include "commands/variable.h"
+#include "utils/plancache.h"
+#include "utils/portal.h"
+
+static void DiscardAll(bool isTopLevel);
+
+/*
+ * DISCARD { ALL | TEMP | PLANS }
+ */
+void
+DiscardCommand(DiscardStmt *stmt, bool isTopLevel)
+{
+	switch (stmt->target)
+	{
+		case DISCARD_ALL:
+			DiscardAll(isTopLevel);
+			break;
+
+		case DISCARD_PLANS:
+			ResetPlanCache();
+			break;
+
+		case DISCARD_TEMP:
+			ResetTempTableNamespace();
+			break;
+
+		default:
+			elog(ERROR, "unrecognized DISCARD target: %d", stmt->target);
+	}
+}
+
+static void
+DiscardAll(bool isTopLevel)
+{
+	/*
+	 * Disallow DISCARD ALL in a transaction block. This is arguably
+	 * inconsistent (we don't make a similar check in the command
+	 * sequence that DISCARD ALL is equivalent to), but the idea is
+	 * to catch mistakes: DISCARD ALL inside a transaction block
+	 * would leave the transaction still uncommitted.
+	 */
+	PreventTransactionChain(isTopLevel, "DISCARD ALL");
+
+	SetPGVariable("session_authorization", NIL, false);
+	ResetAllOptions();
+	DropAllPreparedStatements();
+	PortalHashTableDeleteAll();
+	Async_UnlistenAll();
+	ResetPlanCache();
+	ResetTempTableNamespace();
+}
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 9bf57fb87f2b2033d50b6d0292ff4e64aa1fd29c..988120a963496c89998f3f1b7ba7d1161648d08b 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.373 2007/04/02 03:49:38 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.374 2007/04/26 16:13:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2589,6 +2589,16 @@ _copyVariableResetStmt(VariableResetStmt *from)
 	return newnode;
 }
 
+static DiscardStmt *
+_copyDiscardStmt(DiscardStmt *from)
+{
+	DiscardStmt *newnode = makeNode(DiscardStmt);
+
+	COPY_SCALAR_FIELD(target);
+
+	return newnode;
+}
+
 static CreateTableSpaceStmt *
 _copyCreateTableSpaceStmt(CreateTableSpaceStmt *from)
 {
@@ -3380,6 +3390,9 @@ copyObject(void *from)
 		case T_VariableResetStmt:
 			retval = _copyVariableResetStmt(from);
 			break;
+		case T_DiscardStmt:
+			retval = _copyDiscardStmt(from);
+			break;
 		case T_CreateTableSpaceStmt:
 			retval = _copyCreateTableSpaceStmt(from);
 			break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 1cc0c343dcac94aea81a80b0a22d46fa8348279d..c1500948dcaf44dd1f3da77a316e8dab355bc640 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -18,7 +18,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.304 2007/04/02 03:49:38 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.305 2007/04/26 16:13:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1376,6 +1376,14 @@ _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
 	return true;
 }
 
+static bool
+_equalDiscardStmt(DiscardStmt *a, DiscardStmt *b)
+{
+	COMPARE_SCALAR_FIELD(target);
+
+	return true;
+}
+
 static bool
 _equalCreateTableSpaceStmt(CreateTableSpaceStmt *a, CreateTableSpaceStmt *b)
 {
@@ -2313,6 +2321,9 @@ equal(void *a, void *b)
 		case T_VariableResetStmt:
 			retval = _equalVariableResetStmt(a, b);
 			break;
+		case T_DiscardStmt:
+			retval = _equalDiscardStmt(a, b);
+			break;
 		case T_CreateTableSpaceStmt:
 			retval = _equalCreateTableSpaceStmt(a, b);
 			break;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index b9728deaada5e9b1d09625bcd391589b84d496ac..a69e6989a94956c1d584f32b3dce1810f4c44212 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.589 2007/04/16 01:14:56 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.590 2007/04/26 16:13:11 neilc Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -158,7 +158,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
 		CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
 		CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
 		CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt
-		CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt
+		CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt
 		DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
 		DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
 		DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt
@@ -382,7 +382,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
 
 	DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
 	DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
-	DESC DISABLE_P DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
+	DESC DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
 
 	EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT EXCLUDING
 	EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
@@ -416,7 +416,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
 	OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
 	ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER
 
-	PARTIAL PASSWORD PLACING POSITION
+	PARTIAL PASSWORD PLACING PLANS POSITION
 	PRECISION PRESERVE PREPARE PREPARED PRIMARY
 	PRIOR PRIVILEGES PROCEDURAL PROCEDURE
 
@@ -569,6 +569,7 @@ stmt :
 			| DeclareCursorStmt
 			| DefineStmt
 			| DeleteStmt
+			| DiscardStmt
 			| DropAssertStmt
 			| DropCastStmt
 			| DropGroupStmt
@@ -1328,6 +1329,40 @@ CheckPointStmt:
 		;
 
 
+/*****************************************************************************
+ *
+ * DISCARD { ALL | TEMP | PLANS }
+ *
+ *****************************************************************************/
+
+DiscardStmt:
+			DISCARD ALL
+				{
+					DiscardStmt *n = makeNode(DiscardStmt);
+					n->target = DISCARD_ALL;
+					$$ = (Node *) n;
+				}
+			| DISCARD TEMP
+				{
+					DiscardStmt *n = makeNode(DiscardStmt);
+					n->target = DISCARD_TEMP;
+					$$ = (Node *) n;
+				}
+			| DISCARD TEMPORARY
+				{
+					DiscardStmt *n = makeNode(DiscardStmt);
+					n->target = DISCARD_TEMP;
+					$$ = (Node *) n;
+				}
+			| DISCARD PLANS
+				{
+					DiscardStmt *n = makeNode(DiscardStmt);
+					n->target = DISCARD_PLANS;
+					$$ = (Node *) n;
+				}
+		;
+
+
 /*****************************************************************************
  *
  *	ALTER [ TABLE | INDEX ] variations
@@ -8796,6 +8831,7 @@ unreserved_keyword:
 			| DELIMITER
 			| DELIMITERS
 			| DISABLE_P
+			| DISCARD
 			| DOCUMENT_P
 			| DOMAIN_P
 			| DOUBLE_P
@@ -8881,6 +8917,7 @@ unreserved_keyword:
 			| OWNER
 			| PARTIAL
 			| PASSWORD
+			| PLANS
 			| PREPARE
 			| PREPARED
 			| PRESERVE
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index 9f6cf1e20e4d7bfd35bc3f851f22c465a8c55a98..5c8ef10a214a4646a61a71f94c61bd3fd06700b2 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.186 2007/04/02 03:49:38 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.187 2007/04/26 16:13:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -124,6 +124,7 @@ static const ScanKeyword ScanKeywords[] = {
 	{"delimiters", DELIMITERS},
 	{"desc", DESC},
 	{"disable", DISABLE_P},
+	{"discard", DISCARD},
 	{"distinct", DISTINCT},
 	{"do", DO},
 	{"document", DOCUMENT_P},
@@ -269,6 +270,7 @@ static const ScanKeyword ScanKeywords[] = {
 	{"partial", PARTIAL},
 	{"password", PASSWORD},
 	{"placing", PLACING},
+	{"plans", PLANS},
 	{"position", POSITION},
 	{"precision", PRECISION},
 	{"prepare", PREPARE},
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 88adb625d554d9d24cb83f9c705c43f722143532..9dd700ffe70c4c9b299c9e5c109cedd111537c7a 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.277 2007/04/12 06:53:47 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.278 2007/04/26 16:13:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -29,6 +29,7 @@
 #include "commands/copy.h"
 #include "commands/dbcommands.h"
 #include "commands/defrem.h"
+#include "commands/discard.h"
 #include "commands/explain.h"
 #include "commands/lockcmds.h"
 #include "commands/portalcmds.h"
@@ -604,10 +605,7 @@ ProcessUtility(Node *parsetree,
 							break;
 
 						case OBJECT_DOMAIN:
-
-							/*
-							 * RemoveDomain does its own permissions checks
-							 */
+							/* RemoveDomain does its own permissions checks */
 							RemoveDomain(names, stmt->behavior,
 										 stmt->missing_ok);
 							break;
@@ -618,10 +616,7 @@ ProcessUtility(Node *parsetree,
 							break;
 
 						case OBJECT_SCHEMA:
-
-							/*
-							 * RemoveSchema does its own permissions checks
-							 */
+							/* RemoveSchema does its own permissions checks */
 							RemoveSchema(names, stmt->behavior,
 										 stmt->missing_ok);
 							break;
@@ -994,6 +989,10 @@ ProcessUtility(Node *parsetree,
 			}
 			break;
 
+		case T_DiscardStmt:
+			DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
+			break;
+
 		case T_CreateTrigStmt:
 			CreateTrigger((CreateTrigStmt *) parsetree, InvalidOid);
 			break;
@@ -1752,12 +1751,22 @@ CreateCommandTag(Node *parsetree)
 			break;
 
 		case T_VariableResetStmt:
-			{
-				VariableResetStmt *stmt = (VariableResetStmt *) parsetree;
-				if (pg_strcasecmp(stmt->name, "session") == 0)
-					tag = "RESET SESSION";
-				else
-					tag = "RESET";
+			tag = "RESET";
+			break;
+
+		case T_DiscardStmt:
+			switch (((DiscardStmt *) parsetree)->target) {
+				case DISCARD_ALL:
+					tag = "DISCARD ALL";
+					break;
+				case DISCARD_PLANS:
+					tag = "DISCARD PLANS";
+					break;
+				case DISCARD_TEMP:
+					tag = "DISCARD TEMP";
+					break;
+				default:
+					tag = "???";
 			}
 			break;
 
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 9b1e813dc6c3d3859db70fbfa234e85099a26189..a3a8f79a5d1299363f5bf1c001e5071c0e977be0 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.388 2007/04/22 03:52:40 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.389 2007/04/26 16:13:12 neilc Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -5047,30 +5047,6 @@ GetPGVariableResultDesc(const char *name)
 	return tupdesc;
 }
 
-/*
- * RESET SESSION command.
- */
-static void
-ResetSession(bool isTopLevel)
-{
-	/*
-	 * Disallow RESET SESSION in a transaction block. This is arguably
-	 * inconsistent (we don't make a similar check in the command
-	 * sequence that RESET SESSION is equivalent to), but the idea is
-	 * to catch mistakes: RESET SESSION inside a transaction block
-	 * would leave the transaction still uncommitted.
-	 */
-	PreventTransactionChain(isTopLevel, "RESET SESSION");
-
-	SetPGVariable("session_authorization", NIL, false);
-	ResetAllOptions();
-	DropAllPreparedStatements();
-	PortalHashTableDeleteAll();
-	Async_UnlistenAll();
-	ResetPlanCache();
-	ResetTempTableNamespace();
-}
-
 /*
  * RESET command
  */
@@ -5079,13 +5055,6 @@ ResetPGVariable(const char *name, bool isTopLevel)
 {
 	if (pg_strcasecmp(name, "all") == 0)
 		ResetAllOptions();
-	else if (pg_strcasecmp(name, "session") == 0)
-		ResetSession(isTopLevel);
-	else if (pg_strcasecmp(name, "temp") == 0 ||
-			 pg_strcasecmp(name, "temporary") == 0)
-		ResetTempTableNamespace();
-	else if (pg_strcasecmp(name, "plans") == 0)
-		ResetPlanCache();
 	else
 		set_config_option(name,
 						  NULL,
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
index eeba207dc94fdf5ea8b845672dcdd86d6d4c3351..69bb3e3ebdb54be080940f1c63868646ed3fe8f8 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.101 2007/04/12 06:53:48 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.102 2007/04/26 16:13:13 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -455,7 +455,7 @@ PortalDrop(Portal portal, bool isTopCommit)
 /*
  * Delete all declared cursors.
  *
- * Used by commands: CLOSE ALL, RESET SESSION
+ * Used by commands: CLOSE ALL, DISCARD ALL
  */
 void
 PortalHashTableDeleteAll(void)
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 090030fd0c305d7431c9404e5902dec4ad2323f8..2ec534cba4970ca3a507575fd88643c4e1d9768c 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2007, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.161 2007/04/08 00:26:34 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.162 2007/04/26 16:13:13 neilc Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -527,8 +527,8 @@ psql_completion(char *text, int start, int end)
 	static const char *const sql_commands[] = {
 		"ABORT", "ALTER", "ANALYZE", "BEGIN", "CHECKPOINT", "CLOSE", "CLUSTER",
 		"COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
-		"DELETE FROM", "DROP", "END", "EXECUTE", "EXPLAIN", "FETCH", "GRANT",
-		"INSERT", "LISTEN", "LOAD", "LOCK", "MOVE", "NOTIFY", "PREPARE",
+		"DELETE FROM", "DISCARD", "DROP", "END", "EXECUTE", "EXPLAIN", "FETCH",
+		"GRANT", "INSERT", "LISTEN", "LOAD", "LOCK", "MOVE", "NOTIFY", "PREPARE",
 		"REASSIGN", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK",
 		"SAVEPOINT", "SELECT", "SET", "SHOW", "START", "TRUNCATE", "UNLISTEN",
 		"UPDATE", "VACUUM", NULL
@@ -1244,6 +1244,15 @@ psql_completion(char *text, int start, int end)
 	}
 	/* XXX: implement tab completion for DELETE ... USING */
 
+/* DISCARD */
+	else if (pg_strcasecmp(prev_wd, "DISCARD") == 0)
+	{
+		static const char *const list_DISCARD[] =
+		{"ALL", "PLANS", "TEMP", NULL};
+
+		COMPLETE_WITH_LIST(list_DISCARD);
+	}
+
 /* DROP (when not the previous word) */
 	/* DROP AGGREGATE */
 	else if (pg_strcasecmp(prev3_wd, "DROP") == 0 &&
diff --git a/src/include/commands/discard.h b/src/include/commands/discard.h
new file mode 100644
index 0000000000000000000000000000000000000000..f2192392ae4c984416b846a2095681f7dc9409cf
--- /dev/null
+++ b/src/include/commands/discard.h
@@ -0,0 +1,20 @@
+/*-------------------------------------------------------------------------
+ *
+ * discard.h
+ *	  prototypes for discard.c.
+ *
+ *
+ * Copyright (c) 1996-2007, PostgreSQL Global Development Group
+ *
+ * $PostgreSQL: pgsql/src/include/commands/discard.h,v 1.1 2007/04/26 16:13:13 neilc Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DISCARD_H
+#define DISCARD_H
+
+#include "nodes/parsenodes.h"
+
+extern void DiscardCommand(DiscardStmt *stmt, bool isTopLevel);
+
+#endif   /* DISCARD_H */
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 305be462e10343f3052cc57a3fae47bbbf583a3f..fc48961c5caddc3bf607cf679be4f8af6c6cdaee 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.198 2007/04/02 03:49:41 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.199 2007/04/26 16:13:14 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -273,6 +273,7 @@ typedef enum NodeTag
 	T_VariableSetStmt,
 	T_VariableShowStmt,
 	T_VariableResetStmt,
+	T_DiscardStmt,
 	T_CreateTrigStmt,
 	T_DropPropertyStmt,
 	T_CreatePLangStmt,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index dbc29642f06620a33b235c6db4f963c5c99fbf40..09cb4ff5031e58baad18b5987a3fc141eb03c4ed 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.346 2007/04/16 01:14:57 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.347 2007/04/26 16:13:14 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1870,6 +1870,24 @@ typedef struct VariableResetStmt
 	char	   *name;
 } VariableResetStmt;
 
+/* ----------------------
+ * Discard Statement
+ * ----------------------
+ */
+
+typedef enum DiscardMode
+{
+	DISCARD_ALL,
+	DISCARD_PLANS,
+	DISCARD_TEMP
+} DiscardMode;
+
+typedef struct DiscardStmt
+{
+	NodeTag		type;
+	DiscardMode	target;
+} DiscardStmt;
+
 /* ----------------------
  *		LOCK Statement
  * ----------------------
diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out
index 484cc356e7f3486586f59394350a8582d9dbd125..d8ad5667ab7e9efaffd74423980366a02e597491 100644
--- a/src/test/regress/expected/guc.out
+++ b/src/test/regress/expected/guc.out
@@ -426,7 +426,7 @@ SELECT '2006-08-13 12:34:56'::timestamptz;
 (1 row)
 
 --
--- Test RESET TEMP
+-- Test DISCARD TEMP
 --
 CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS;
 SELECT relname FROM pg_class WHERE relname = 'reset_test';
@@ -435,14 +435,14 @@ SELECT relname FROM pg_class WHERE relname = 'reset_test';
  reset_test
 (1 row)
 
-RESET TEMP;
+DISCARD TEMP;
 SELECT relname FROM pg_class WHERE relname = 'reset_test';
  relname 
 ---------
 (0 rows)
 
 --
--- Test RESET SESSION
+-- Test DISCARD ALL
 --
 -- do changes
 DECLARE foo CURSOR WITH HOLD FOR SELECT 1;
@@ -489,8 +489,8 @@ SELECT current_user = 'temp_reset_user';
  t
 (1 row)
 
--- big RESET
-RESET SESSION;
+-- discard everything
+DISCARD ALL;
 -- look again
 SELECT relname FROM pg_listener;
  relname 
diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql
index 274007a2c33e5935a8172da7cf30464ede67bf6b..a25a13820d73ea839e6700748ba41b9cd8383c29 100644
--- a/src/test/regress/sql/guc.sql
+++ b/src/test/regress/sql/guc.sql
@@ -125,15 +125,15 @@ SHOW datestyle;
 SELECT '2006-08-13 12:34:56'::timestamptz;
 
 --
--- Test RESET TEMP
+-- Test DISCARD TEMP
 --
 CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS;
 SELECT relname FROM pg_class WHERE relname = 'reset_test';
-RESET TEMP;
+DISCARD TEMP;
 SELECT relname FROM pg_class WHERE relname = 'reset_test';
 
 --
--- Test RESET SESSION
+-- Test DISCARD ALL
 --
 
 -- do changes
@@ -151,8 +151,8 @@ SELECT name FROM pg_cursors;
 SHOW vacuum_cost_delay;
 SELECT relname from pg_class where relname = 'tmp_foo';
 SELECT current_user = 'temp_reset_user';
--- big RESET
-RESET SESSION;
+-- discard everything
+DISCARD ALL;
 -- look again
 SELECT relname FROM pg_listener;
 SELECT name FROM pg_prepared_statements;