Index: pgsql83/doc/src/sgml/ref/discard.sgml =================================================================== *** /dev/null 1970-01-01 00:00:00.000000000 +0000 --- pgsql83/doc/src/sgml/ref/discard.sgml 2007-04-17 16:25:45.000000000 +0300 *************** *** 0 **** --- 1,101 ---- + + + + + RESET + SQL - Language Statements + + + + DISCARD + Discard internal server state + + + + DISCARD + + + + + DISCARD { ALL | PLANS | TEMP | TEMPORARY } + + + + + Description + + + DISCARD can be used to release internal resources + that are usually released at the end of session. DISCARD + TEMP drops all temporary tables created in the current session. + DISCARD PLANS releases all internally cached plans. + DISCARD ALL releases all externally visible temporary + resources associated with the current session. + + + + + Parameters + + + + + TEMP, TEMPORARY + + + Drops all temporary tables created in the current session. + + + + + + PLANS + + + Releases all cached query plans. + + + + + + ALL + + + Releases all temporary resources associated with the current + session. This has the same effect as executing the following + command sequence: + + SET SESSION AUTHORIZATION DEFAULT; + RESET ALL; + DEALLOCATE ALL; + CLOSE ALL; + UNLISTEN *; + DISCARD PLANS; + DISCARD TEMP; + + + + + + + + + + Notes + + + DISCARD ALL cannot be executed inside a transaction block. + + + + + Compatibility + + + DISCARD is a PostgreSQL extension. + + + Index: pgsql83/doc/src/sgml/ref/allfiles.sgml =================================================================== *** pgsql83.orig/doc/src/sgml/ref/allfiles.sgml 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/doc/src/sgml/ref/allfiles.sgml 2007-04-17 16:26:31.000000000 +0300 *************** *** 61,66 **** --- 61,67 ---- + Index: pgsql83/doc/src/sgml/ref/reset.sgml =================================================================== *** pgsql83.orig/doc/src/sgml/ref/reset.sgml 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/doc/src/sgml/ref/reset.sgml 2007-04-17 16:26:31.000000000 +0300 *************** *** 22,31 **** RESET configuration_parameter RESET ALL - RESET { PLANS | SESSION | TEMP | TEMPORARY } ! Description --- 22,30 ---- RESET configuration_parameter RESET ALL ! Description *************** *** 42,48 **** The default value is defined as the value that the parameter would ! have had, if no SET had 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 The default value is defined as the value that the parameter would ! have had, had no 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 SET reference page for details on the transaction behavior of RESET. - - - RESET can also be used to release internal resources - that are usually released at the end of session. RESET - TEMP drops all temporary tables created in the current session. - RESET PLANS releases all internally cached plans. - RESET SESSION releases all externally visible temporary - resources associated with the current session. - --- 52,57 ---- *************** *** 86,142 **** - - - TEMP, TEMPORARY - - - Drops all temporary tables created in the current session. - - - - - - PLANS - - - Releases all cached query plans. - - - - - - SESSION - - - Releases all temporary resources associated with the current - session. This has the same effect as executing the following - command sequence: - - SET SESSION AUTHORIZATION DEFAULT; - RESET ALL; - DEALLOCATE ALL; - CLOSE ALL; - UNLISTEN *; - RESET PLANS; - RESET TEMP; - - - - - - Notes - - - RESET SESSION cannot be executed inside a transaction block. - - - - Examples --- 76,85 ---- Index: pgsql83/doc/src/sgml/reference.sgml =================================================================== *** pgsql83.orig/doc/src/sgml/reference.sgml 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/doc/src/sgml/reference.sgml 2007-04-17 16:26:31.000000000 +0300 *************** *** 89,94 **** --- 89,95 ---- &deallocate; &declare; &delete; + &discard; &dropAggregate; &dropCast; &dropConversion; Index: pgsql83/src/backend/nodes/copyfuncs.c =================================================================== *** pgsql83.orig/src/backend/nodes/copyfuncs.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/nodes/copyfuncs.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 2589,2594 **** --- 2589,2604 ---- return newnode; } + static DiscardStmt * + _copyDiscardStmt(DiscardStmt *from) + { + DiscardStmt *newnode = makeNode(DiscardStmt); + + COPY_STRING_FIELD(name); + + return newnode; + } + static CreateTableSpaceStmt * _copyCreateTableSpaceStmt(CreateTableSpaceStmt *from) { *************** *** 3380,3385 **** --- 3390,3398 ---- case T_VariableResetStmt: retval = _copyVariableResetStmt(from); break; + case T_DiscardStmt: + retval = _copyDiscardStmt(from); + break; case T_CreateTableSpaceStmt: retval = _copyCreateTableSpaceStmt(from); break; Index: pgsql83/src/backend/nodes/equalfuncs.c =================================================================== *** pgsql83.orig/src/backend/nodes/equalfuncs.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/nodes/equalfuncs.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 1377,1382 **** --- 1377,1390 ---- } static bool + _equalDiscardStmt(DiscardStmt *a, DiscardStmt *b) + { + COMPARE_STRING_FIELD(name); + + return true; + } + + static bool _equalCreateTableSpaceStmt(CreateTableSpaceStmt *a, CreateTableSpaceStmt *b) { COMPARE_STRING_FIELD(tablespacename); *************** *** 2313,2318 **** --- 2321,2329 ---- case T_VariableResetStmt: retval = _equalVariableResetStmt(a, b); break; + case T_DiscardStmt: + retval = _equalDiscardStmt(a, b); + break; case T_CreateTableSpaceStmt: retval = _equalCreateTableSpaceStmt(a, b); break; Index: pgsql83/src/backend/parser/gram.y =================================================================== *** pgsql83.orig/src/backend/parser/gram.y 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/parser/gram.y 2007-04-17 16:26:31.000000000 +0300 *************** *** 158,164 **** CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt ! CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt --- 158,164 ---- CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt ! CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt *************** *** 382,388 **** 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 EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT --- 382,388 ---- DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS ! 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,422 **** 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 PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE --- 416,422 ---- OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER ! PARTIAL PASSWORD PLACING PLANS POSITION PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE *************** *** 569,574 **** --- 569,575 ---- | DeclareCursorStmt | DefineStmt | DeleteStmt + | DiscardStmt | DropAssertStmt | DropCastStmt | DropGroupStmt *************** *** 1330,1335 **** --- 1331,1370 ---- /***************************************************************************** * + * DISCARD { ALL | TEMP | PLANS } + * + *****************************************************************************/ + + DiscardStmt: + DISCARD ALL + { + DiscardStmt *n = makeNode(DiscardStmt); + n->name = "all"; + $$ = (Node *) n; + } + | DISCARD TEMP + { + DiscardStmt *n = makeNode(DiscardStmt); + n->name = "temp"; + $$ = (Node *) n; + } + | DISCARD TEMPORARY + { + DiscardStmt *n = makeNode(DiscardStmt); + n->name = "temp"; + $$ = (Node *) n; + } + | DISCARD PLANS + { + DiscardStmt *n = makeNode(DiscardStmt); + n->name = "plans"; + $$ = (Node *) n; + } + ; + + + /***************************************************************************** + * * ALTER [ TABLE | INDEX ] variations * *****************************************************************************/ *************** *** 8796,8801 **** --- 8831,8837 ---- | DELIMITER | DELIMITERS | DISABLE_P + | DISCARD | DOCUMENT_P | DOMAIN_P | DOUBLE_P *************** *** 8881,8886 **** --- 8917,8923 ---- | OWNER | PARTIAL | PASSWORD + | PLANS | PREPARE | PREPARED | PRESERVE Index: pgsql83/src/backend/parser/keywords.c =================================================================== *** pgsql83.orig/src/backend/parser/keywords.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/parser/keywords.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 124,129 **** --- 124,130 ---- {"delimiters", DELIMITERS}, {"desc", DESC}, {"disable", DISABLE_P}, + {"discard", DISCARD}, {"distinct", DISTINCT}, {"do", DO}, {"document", DOCUMENT_P}, *************** *** 269,274 **** --- 270,276 ---- {"partial", PARTIAL}, {"password", PASSWORD}, {"placing", PLACING}, + {"plans", PLANS}, {"position", POSITION}, {"precision", PRECISION}, {"prepare", PREPARE}, Index: pgsql83/src/backend/tcop/utility.c =================================================================== *** pgsql83.orig/src/backend/tcop/utility.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/tcop/utility.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 994,999 **** --- 994,1007 ---- } break; + case T_DiscardStmt: + { + DiscardStmt *n = (DiscardStmt *) parsetree; + + DiscardState(n->name, isTopLevel); + } + break; + case T_CreateTrigStmt: CreateTrigger((CreateTrigStmt *) parsetree, InvalidOid); break; *************** *** 1752,1763 **** break; case T_VariableResetStmt: { ! VariableResetStmt *stmt = (VariableResetStmt *) parsetree; ! if (pg_strcasecmp(stmt->name, "session") == 0) ! tag = "RESET SESSION"; else ! tag = "RESET"; } break; --- 1760,1779 ---- break; case T_VariableResetStmt: + tag = "RESET"; + break; + + case T_DiscardStmt: { ! DiscardStmt *stmt = (DiscardStmt *) parsetree; ! if (pg_strcasecmp(stmt->name, "all") == 0) ! tag = "DISCARD ALL"; ! else if (pg_strcasecmp(stmt->name, "plans") == 0) ! tag = "DISCARD PLANS"; ! else if (pg_strcasecmp(stmt->name, "temp") == 0) ! tag = "DISCARD TEMP"; else ! tag = "DISCARD ???"; } break; Index: pgsql83/src/backend/utils/misc/guc.c =================================================================== *** pgsql83.orig/src/backend/utils/misc/guc.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/utils/misc/guc.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 4971,4986 **** * 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(); --- 4971,4986 ---- * RESET SESSION command. */ 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(); *************** *** 4991,4996 **** --- 4991,5007 ---- ResetTempTableNamespace(); } + void + DiscardState(const char *name, bool isTopLevel) + { + if (pg_strcasecmp(name, "temp") == 0) + ResetTempTableNamespace(); + else if (pg_strcasecmp(name, "plans") == 0) + ResetPlanCache(); + else + DiscardAll(isTopLevel); + } + /* * RESET command */ *************** *** 4999,5011 **** { 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, --- 5010,5015 ---- Index: pgsql83/src/backend/utils/mmgr/portalmem.c =================================================================== *** pgsql83.orig/src/backend/utils/mmgr/portalmem.c 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/backend/utils/mmgr/portalmem.c 2007-04-17 16:26:31.000000000 +0300 *************** *** 455,461 **** /* * Delete all declared cursors. * ! * Used by commands: CLOSE ALL, RESET SESSION */ void PortalHashTableDeleteAll(void) --- 455,461 ---- /* * Delete all declared cursors. * ! * Used by commands: CLOSE ALL, DISCARD ALL */ void PortalHashTableDeleteAll(void) Index: pgsql83/src/include/nodes/nodes.h =================================================================== *** pgsql83.orig/src/include/nodes/nodes.h 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/include/nodes/nodes.h 2007-04-17 16:26:31.000000000 +0300 *************** *** 273,278 **** --- 273,279 ---- T_VariableSetStmt, T_VariableShowStmt, T_VariableResetStmt, + T_DiscardStmt, T_CreateTrigStmt, T_DropPropertyStmt, T_CreatePLangStmt, Index: pgsql83/src/include/nodes/parsenodes.h =================================================================== *** pgsql83.orig/src/include/nodes/parsenodes.h 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/include/nodes/parsenodes.h 2007-04-17 16:26:31.000000000 +0300 *************** *** 1871,1876 **** --- 1871,1887 ---- } VariableResetStmt; /* ---------------------- + * Discard Statement + * ---------------------- + */ + + typedef struct DiscardStmt + { + NodeTag type; + char *name; + } DiscardStmt; + + /* ---------------------- * LOCK Statement * ---------------------- */ Index: pgsql83/src/include/utils/guc.h =================================================================== *** pgsql83.orig/src/include/utils/guc.h 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/include/utils/guc.h 2007-04-17 16:26:31.000000000 +0300 *************** *** 198,203 **** --- 198,205 ---- extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow); extern int GetNumConfigOptions(void); + extern void DiscardState(const char *name, bool isTopLevel); + 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); Index: pgsql83/src/test/regress/expected/guc.out =================================================================== *** pgsql83.orig/src/test/regress/expected/guc.out 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/test/regress/expected/guc.out 2007-04-17 16:26:31.000000000 +0300 *************** *** 426,432 **** (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'; --- 426,432 ---- (1 row) -- ! -- Test DISCARD TEMP -- CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS; SELECT relname FROM pg_class WHERE relname = 'reset_test'; *************** *** 435,448 **** 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; --- 435,448 ---- reset_test (1 row) ! DISCARD TEMP; SELECT relname FROM pg_class WHERE relname = 'reset_test'; relname --------- (0 rows) -- ! -- Test DISCARD ALL -- -- do changes DECLARE foo CURSOR WITH HOLD FOR SELECT 1; *************** *** 489,496 **** t (1 row) ! -- big RESET ! RESET SESSION; -- look again SELECT relname FROM pg_listener; relname --- 489,496 ---- t (1 row) ! -- discard everything ! DISCARD ALL; -- look again SELECT relname FROM pg_listener; relname Index: pgsql83/src/test/regress/sql/guc.sql =================================================================== *** pgsql83.orig/src/test/regress/sql/guc.sql 2007-04-17 16:24:27.000000000 +0300 --- pgsql83/src/test/regress/sql/guc.sql 2007-04-17 16:26:31.000000000 +0300 *************** *** 125,139 **** 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 --- 125,139 ---- SELECT '2006-08-13 12:34:56'::timestamptz; -- ! -- Test DISCARD TEMP -- CREATE TEMP TABLE reset_test ( data text ) ON COMMIT DELETE ROWS; SELECT relname FROM pg_class WHERE relname = 'reset_test'; ! DISCARD TEMP; SELECT relname FROM pg_class WHERE relname = 'reset_test'; -- ! -- Test DISCARD ALL -- -- do changes *************** *** 151,158 **** 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; --- 151,158 ---- SHOW vacuum_cost_delay; SELECT relname from pg_class where relname = 'tmp_foo'; SELECT current_user = 'temp_reset_user'; ! -- discard everything ! DISCARD ALL; -- look again SELECT relname FROM pg_listener; SELECT name FROM pg_prepared_statements;