RESET SESSION, plus related new DDL commands. Patch from Marko Kreen,

reviewed by Neil Conway. This patch adds the following DDL command
variants: RESET SESSION, RESET TEMP, RESET PLANS, CLOSE ALL, and
DEALLOCATE ALL. RESET SESSION is intended for use by connection
pool software and the like, in order to reset a client session
to something close to its initial state.

Note that while most of these command variants can be executed
inside a transaction block (but are not transaction-aware!),
RESET SESSION cannot. While this is inconsistent, it is intended
to catch programmer mistakes: RESET SESSION in an open transaction
block is probably unintended.
This commit is contained in:
Neil Conway 2007-04-12 06:53:49 +00:00
parent e6e47f278d
commit d13e903bea
25 changed files with 479 additions and 38 deletions

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/close.sgml,v 1.24 2006/09/16 00:30:17 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/close.sgml,v 1.25 2007/04/12 06:53:45 neilc Exp $
PostgreSQL documentation
-->
@ -25,7 +25,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
CLOSE <replaceable class="PARAMETER">name</replaceable>
CLOSE { <replaceable class="PARAMETER">name</replaceable> | ALL }
</synopsis>
</refsynopsisdiv>
@ -44,10 +44,10 @@ CLOSE <replaceable class="PARAMETER">name</replaceable>
transaction is terminated by <command>COMMIT</command> or
<command>ROLLBACK</command>. A holdable cursor is implicitly
closed if the transaction that created it aborts via
<command>ROLLBACK</command>. If the creating transaction successfully
commits, the holdable
cursor remains open until an explicit <command>CLOSE</command> is
executed, or the client disconnects.
<command>ROLLBACK</command>. If the creating transaction
successfully commits, the holdable cursor remains open until an
explicit <command>CLOSE</command> is executed, or the client
disconnects.
</para>
</refsect1>
@ -63,6 +63,16 @@ CLOSE <replaceable class="PARAMETER">name</replaceable>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>ALL</literal></term>
<listitem>
<para>
Close all open cursors.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
@ -98,7 +108,9 @@ CLOSE liahona;
<title>Compatibility</title>
<para>
<command>CLOSE</command> is fully conforming with the SQL standard.
<command>CLOSE</command> is fully conforming with the SQL
standard. <command>CLOSE ALL</> is a <productname>PostgreSQL</>
extension.
</para>
</refsect1>

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/deallocate.sgml,v 1.9 2006/09/16 00:30:18 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/deallocate.sgml,v 1.10 2007/04/12 06:53:46 neilc Exp $
PostgreSQL documentation
-->
@ -25,7 +25,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
DEALLOCATE [ PREPARE ] <replaceable class="parameter">name</replaceable>
DEALLOCATE [ PREPARE ] { <replaceable class="parameter">name</replaceable> | ALL }
</synopsis>
</refsynopsisdiv>
@ -65,6 +65,15 @@ DEALLOCATE [ PREPARE ] <replaceable class="parameter">name</replaceable>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>ALL</literal></term>
<listitem>
<para>
Deallocate all prepared statements.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/reset.sgml,v 1.32 2006/09/16 00:30:19 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/reset.sgml,v 1.33 2007/04/12 06:53:46 neilc Exp $
PostgreSQL documentation
-->
@ -22,6 +22,7 @@ PostgreSQL documentation
<synopsis>
RESET <replaceable class="PARAMETER">configuration_parameter</replaceable>
RESET ALL
RESET { PLANS | SESSION | TEMP | TEMPORARY }
</synopsis>
</refsynopsisdiv>
@ -41,7 +42,7 @@ SET <replaceable class="parameter">configuration_parameter</replaceable> TO DEFA
<para>
The default value is defined as the value that the parameter would
have had, had no <command>SET</> ever been issued for it in the
have had, if no <command>SET</> ever been issued for it in the
current session. The actual source of this value might be a
compiled-in default, the configuration file, command-line options,
or per-database or per-user default settings. See <xref
@ -52,6 +53,15 @@ 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>
@ -76,9 +86,56 @@ 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:
<synopsis>
SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
RESET PLANS;
RESET TEMP;
</synopsis>
</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>

View File

@ -13,7 +13,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.93 2007/03/23 19:53:51 tgl Exp $
* $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.94 2007/04/12 06:53:46 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -1940,6 +1940,26 @@ InitTempTableNamespace(void)
baseSearchPathValid = false; /* need to rebuild list */
}
/*
* Remove all temp tables from the temporary namespace.
*/
void
ResetTempTableNamespace(void)
{
char namespaceName[NAMEDATALEN];
Oid namespaceId;
/* 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.
*/

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.135 2007/01/05 22:19:25 momjian Exp $
* $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.136 2007/04/12 06:53:46 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -127,7 +127,6 @@ static bool unlistenExitRegistered = false;
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);
@ -335,7 +334,7 @@ Async_Unlisten(const char *relname)
*
*--------------------------------------------------------------
*/
static void
void
Async_UnlistenAll(void)
{
Relation lRel;

View File

@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.62 2007/03/13 00:33:39 tgl Exp $
* $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.63 2007/04/12 06:53:46 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -236,11 +236,18 @@ PerformPortalClose(const char *name)
{
Portal portal;
/* NULL means CLOSE ALL */
if (name == NULL)
{
PortalHashTableDeleteAll();
return;
}
/*
* Disallow empty-string cursor name (conflicts with protocol-level
* unnamed portal).
*/
if (!name || name[0] == '\0')
if (name[0] == '\0')
ereport(ERROR,
(errcode(ERRCODE_INVALID_CURSOR_NAME),
errmsg("invalid cursor name: must not be empty")));

View File

@ -10,7 +10,7 @@
* Copyright (c) 2002-2007, PostgreSQL Global Development Group
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.70 2007/03/13 00:33:39 tgl Exp $
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.71 2007/04/12 06:53:46 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -575,7 +575,10 @@ FetchPreparedStatementTargetList(PreparedStatement *stmt)
void
DeallocateQuery(DeallocateStmt *stmt)
{
if (stmt->name)
DropPreparedStatement(stmt->name, true);
else
DropAllPreparedStatements();
}
/*
@ -601,6 +604,31 @@ DropPreparedStatement(const char *stmt_name, bool showError)
}
}
/*
* 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.
*/

View File

@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.587 2007/04/08 00:26:34 momjian Exp $
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.588 2007/04/12 06:53:46 neilc Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@ -1667,6 +1667,12 @@ ClosePortalStmt:
n->portalname = $2;
$$ = (Node *)n;
}
| CLOSE ALL
{
ClosePortalStmt *n = makeNode(ClosePortalStmt);
n->portalname = NULL;
$$ = (Node *)n;
}
;
@ -5591,6 +5597,18 @@ DeallocateStmt: DEALLOCATE name
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;
}
;
/*****************************************************************************

View File

@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.276 2007/04/02 03:49:39 tgl Exp $
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.277 2007/04/12 06:53:47 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -990,7 +990,7 @@ ProcessUtility(Node *parsetree,
{
VariableResetStmt *n = (VariableResetStmt *) parsetree;
ResetPGVariable(n->name);
ResetPGVariable(n->name, isTopLevel);
}
break;
@ -1387,7 +1387,13 @@ CreateCommandTag(Node *parsetree)
break;
case T_ClosePortalStmt:
{
ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
if (stmt->portalname == NULL)
tag = "CLOSE CURSOR ALL";
else
tag = "CLOSE CURSOR";
}
break;
case T_FetchStmt:
@ -1746,7 +1752,13 @@ CreateCommandTag(Node *parsetree)
break;
case T_VariableResetStmt:
{
VariableResetStmt *stmt = (VariableResetStmt *) parsetree;
if (pg_strcasecmp(stmt->name, "session") == 0)
tag = "RESET SESSION";
else
tag = "RESET";
}
break;
case T_CreateTrigStmt:
@ -1856,7 +1868,13 @@ CreateCommandTag(Node *parsetree)
break;
case T_DeallocateStmt:
{
DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
if (stmt->name == NULL)
tag = "DEALLOCATE ALL";
else
tag = "DEALLOCATE";
}
break;
/* already-planned queries */

View File

@ -33,7 +33,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.5 2007/03/26 00:36:19 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.6 2007/04/12 06:53:47 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -880,6 +880,15 @@ PlanCacheCallback(Datum arg, Oid relid)
}
}
/*
* ResetPlanCache: drop all cached plans.
*/
void
ResetPlanCache(void)
{
PlanCacheCallback((Datum) 0, InvalidOid);
}
/*
* ScanQueryForRelids callback function for PlanCacheCallback
*/

View File

@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.383 2007/03/19 23:38:30 wieck Exp $
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.384 2007/04/12 06:53:47 neilc Exp $
*
*--------------------------------------------------------------------
*/
@ -32,6 +32,7 @@
#include "access/xact.h"
#include "catalog/namespace.h"
#include "commands/async.h"
#include "commands/prepare.h"
#include "commands/vacuum.h"
#include "commands/variable.h"
#include "commands/trigger.h"
@ -61,6 +62,7 @@
#include "utils/memutils.h"
#include "utils/pg_locale.h"
#include "utils/plancache.h"
#include "utils/portal.h"
#include "utils/ps_status.h"
#include "utils/tzparser.h"
#include "utils/xml.h"
@ -4951,14 +4953,45 @@ 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
*/
void
ResetPGVariable(const char *name)
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,

View File

@ -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.100 2007/03/13 00:33:42 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.101 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -452,6 +452,29 @@ PortalDrop(Portal portal, bool isTopCommit)
pfree(portal);
}
/*
* Delete all declared cursors.
*
* Used by 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;
if (portal->status != PORTAL_ACTIVE)
PortalDrop(portal, false);
}
}
/*
* Pre-commit processing for portals.

View File

@ -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/catalog/namespace.h,v 1.45 2007/03/23 19:53:52 tgl Exp $
* $PostgreSQL: pgsql/src/include/catalog/namespace.h,v 1.46 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -100,4 +100,6 @@ extern char *namespace_search_path;
extern List *fetch_search_path(bool includeImplicit);
extern void ResetTempTableNamespace(void);
#endif /* NAMESPACE_H */

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/commands/async.h,v 1.34 2007/01/05 22:19:53 momjian Exp $
* $PostgreSQL: pgsql/src/include/commands/async.h,v 1.35 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -19,6 +19,7 @@ extern bool Trace_notify;
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);

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 2002-2007, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/include/commands/prepare.h,v 1.25 2007/03/13 00:33:43 tgl Exp $
* $PostgreSQL: pgsql/src/include/commands/prepare.h,v 1.26 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -59,4 +59,6 @@ extern void DropPreparedStatement(const char *stmt_name, bool showError);
extern TupleDesc FetchPreparedStatementResultDesc(PreparedStatement *stmt);
extern List *FetchPreparedStatementTargetList(PreparedStatement *stmt);
void DropAllPreparedStatements(void);
#endif /* PREPARE_H */

View File

@ -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.344 2007/04/02 03:49:41 tgl Exp $
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.345 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -1451,6 +1451,7 @@ typedef struct ClosePortalStmt
{
NodeTag type;
char *portalname; /* name of the portal (cursor) */
/* NULL means CLOSE ALL */
} ClosePortalStmt;
/* ----------------------
@ -1981,6 +1982,7 @@ typedef struct DeallocateStmt
{
NodeTag type;
char *name; /* The name of the plan to remove */
/* NULL means DEALLOCATE ALL */
} DeallocateStmt;
/*

View File

@ -7,7 +7,7 @@
* Copyright (c) 2000-2007, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.80 2007/03/06 02:06:15 momjian Exp $
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.81 2007/04/12 06:53:48 neilc Exp $
*--------------------------------------------------------------------
*/
#ifndef GUC_H
@ -201,7 +201,7 @@ extern int GetNumConfigOptions(void);
extern void SetPGVariable(const char *name, List *args, bool is_local);
extern void GetPGVariable(const char *name, DestReceiver *dest);
extern TupleDesc GetPGVariableResultDesc(const char *name);
extern void ResetPGVariable(const char *name);
extern void ResetPGVariable(const char *name, bool isTopLevel);
extern char *flatten_set_variable_args(const char *name, List *args);

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/plancache.h,v 1.4 2007/03/23 19:53:52 tgl Exp $
* $PostgreSQL: pgsql/src/include/utils/plancache.h,v 1.5 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -105,4 +105,6 @@ extern void ReleaseCachedPlan(CachedPlan *plan, bool useResOwner);
extern TupleDesc PlanCacheComputeResultDesc(List *stmt_list);
extern bool HaveCachedPlans(void);
extern void ResetPlanCache(void);
#endif /* PLANCACHE_H */

View File

@ -39,7 +39,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.74 2007/03/13 00:33:43 tgl Exp $
* $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.75 2007/04/12 06:53:48 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@ -212,5 +212,6 @@ extern void PortalDefineQuery(Portal portal,
CachedPlan *cplan);
extern Node *PortalListGetPrimaryStmt(List *stmts);
extern void PortalCreateHoldStore(Portal portal);
extern void PortalHashTableDeleteAll(void);
#endif /* PORTAL_H */

View File

@ -425,3 +425,103 @@ SELECT '2006-08-13 12:34:56'::timestamptz;
Sun Aug 13 12:34:56 2006 PDT
(1 row)
--
-- Test RESET TEMP
--
CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS;
SELECT relname FROM pg_class WHERE relname = 'reset_test';
relname
------------
reset_test
(1 row)
RESET TEMP;
SELECT relname FROM pg_class WHERE relname = 'reset_test';
relname
---------
(0 rows)
--
-- Test RESET SESSION
--
-- do changes
DECLARE foo CURSOR WITH HOLD FOR SELECT 1;
PREPARE foo AS SELECT 1;
LISTEN foo_event;
SET vacuum_cost_delay = 13;
CREATE TEMP TABLE tmp_foo (data text) ON COMMIT DELETE ROWS;
CREATE ROLE temp_reset_user;
SET SESSION AUTHORIZATION temp_reset_user;
-- look changes
SELECT relname FROM pg_listener;
relname
-----------
foo_event
(1 row)
SELECT name FROM pg_prepared_statements;
name
------
foo
(1 row)
SELECT name FROM pg_cursors;
name
------
foo
(1 row)
SHOW vacuum_cost_delay;
vacuum_cost_delay
-------------------
13ms
(1 row)
SELECT relname from pg_class where relname = 'tmp_foo';
relname
---------
tmp_foo
(1 row)
SELECT current_user = 'temp_reset_user';
?column?
----------
t
(1 row)
-- big RESET
RESET SESSION;
-- look again
SELECT relname FROM pg_listener;
relname
---------
(0 rows)
SELECT name FROM pg_prepared_statements;
name
------
(0 rows)
SELECT name FROM pg_cursors;
name
------
(0 rows)
SHOW vacuum_cost_delay;
vacuum_cost_delay
-------------------
0
(1 row)
SELECT relname from pg_class where relname = 'tmp_foo';
relname
---------
(0 rows)
SELECT current_user = 'temp_reset_user';
?column?
----------
f
(1 row)
DROP ROLE temp_reset_user;

View File

@ -869,3 +869,33 @@ EXECUTE cprep;
c2 | declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); | t | f | f
(1 row)
-- test CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
name
------
c2
(1 row)
CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
name
------
(0 rows)
BEGIN;
DECLARE foo1 CURSOR WITH HOLD FOR SELECT 1;
DECLARE foo2 CURSOR WITHOUT HOLD FOR SELECT 1;
SELECT name FROM pg_cursors ORDER BY 1;
name
------
foo1
foo2
(2 rows)
CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
name
------
(0 rows)
COMMIT;

View File

@ -166,3 +166,11 @@ SELECT name, statement, parameter_types FROM pg_prepared_statements
: 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)

View File

@ -123,3 +123,42 @@ SELECT '2006-08-13 12:34:56'::timestamptz;
RESET datestyle;
SHOW datestyle;
SELECT '2006-08-13 12:34:56'::timestamptz;
--
-- Test RESET TEMP
--
CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS;
SELECT relname FROM pg_class WHERE relname = 'reset_test';
RESET TEMP;
SELECT relname FROM pg_class WHERE relname = 'reset_test';
--
-- Test RESET SESSION
--
-- do changes
DECLARE foo CURSOR WITH HOLD FOR SELECT 1;
PREPARE foo AS SELECT 1;
LISTEN foo_event;
SET vacuum_cost_delay = 13;
CREATE TEMP TABLE tmp_foo (data text) ON COMMIT DELETE ROWS;
CREATE ROLE temp_reset_user;
SET SESSION AUTHORIZATION temp_reset_user;
-- look changes
SELECT relname FROM pg_listener;
SELECT name FROM pg_prepared_statements;
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;
-- look again
SELECT relname FROM pg_listener;
SELECT name FROM pg_prepared_statements;
SELECT name FROM pg_cursors;
SHOW vacuum_cost_delay;
SELECT relname from pg_class where relname = 'tmp_foo';
SELECT current_user = 'temp_reset_user';
DROP ROLE temp_reset_user;

View File

@ -303,3 +303,18 @@ ROLLBACK;
PREPARE cprep AS
SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors;
EXECUTE cprep;
-- test CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
BEGIN;
DECLARE foo1 CURSOR WITH HOLD FOR SELECT 1;
DECLARE foo2 CURSOR WITHOUT HOLD FOR SELECT 1;
SELECT name FROM pg_cursors ORDER BY 1;
CLOSE ALL;
SELECT name FROM pg_cursors ORDER BY 1;
COMMIT;

View File

@ -68,3 +68,9 @@ PREPARE q7(unknown) AS
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;