mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Add option list to CHECKPOINT command.
This commit adds the boilerplate code for supporting a list of options in CHECKPOINT commands. No actual options are supported yet, but follow-up commits will add support for MODE and FLUSH_UNLOGGED. While at it, this commit refactors the code for executing CHECKPOINT commands to its own function since it's about to become significantly larger. Author: Christoph Berg <myon@debian.org> Reviewed-by: Fujii Masao <masao.fujii@oss.nttdata.com> Discussion: https://postgr.es/m/aDnaKTEf-0dLiEfz%40msg.df7cb.de
This commit is contained in:
@@ -2034,6 +2034,13 @@ CheckPointStmt:
|
||||
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
| CHECKPOINT '(' utility_option_list ')'
|
||||
{
|
||||
CheckPointStmt *n = makeNode(CheckPointStmt);
|
||||
|
||||
$$ = (Node *) n;
|
||||
n->options = $3;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "access/xlog.h"
|
||||
#include "access/xlog_internal.h"
|
||||
#include "access/xlogrecovery.h"
|
||||
#include "catalog/pg_authid.h"
|
||||
#include "libpq/pqsignal.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
@@ -61,6 +62,7 @@
|
||||
#include "storage/shmem.h"
|
||||
#include "storage/smgr.h"
|
||||
#include "storage/spin.h"
|
||||
#include "utils/acl.h"
|
||||
#include "utils/guc.h"
|
||||
#include "utils/memutils.h"
|
||||
#include "utils/resowner.h"
|
||||
@@ -976,6 +978,35 @@ CheckpointerShmemInit(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ExecCheckpoint
|
||||
* Primary entry point for manual CHECKPOINT commands
|
||||
*
|
||||
* This is mainly a wrapper for RequestCheckpoint().
|
||||
*/
|
||||
void
|
||||
ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
|
||||
{
|
||||
foreach_ptr(DefElem, opt, stmt->options)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("unrecognized CHECKPOINT option \"%s\"", opt->defname),
|
||||
parser_errposition(pstate, opt->location)));
|
||||
|
||||
if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
/* translator: %s is name of an SQL command (e.g., CHECKPOINT) */
|
||||
errmsg("permission denied to execute %s command",
|
||||
"CHECKPOINT"),
|
||||
errdetail("Only roles with privileges of the \"%s\" role may execute this command.",
|
||||
"pg_checkpoint")));
|
||||
|
||||
RequestCheckpoint(CHECKPOINT_WAIT |
|
||||
CHECKPOINT_FAST |
|
||||
(RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
|
||||
}
|
||||
|
||||
/*
|
||||
* RequestCheckpoint
|
||||
* Called in backend processes to request a checkpoint
|
||||
|
||||
@@ -943,17 +943,7 @@ standard_ProcessUtility(PlannedStmt *pstmt,
|
||||
break;
|
||||
|
||||
case T_CheckPointStmt:
|
||||
if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
/* translator: %s is name of a SQL command, eg CHECKPOINT */
|
||||
errmsg("permission denied to execute %s command",
|
||||
"CHECKPOINT"),
|
||||
errdetail("Only roles with privileges of the \"%s\" role may execute this command.",
|
||||
"pg_checkpoint")));
|
||||
|
||||
RequestCheckpoint(CHECKPOINT_FAST | CHECKPOINT_WAIT |
|
||||
(RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
|
||||
ExecCheckpoint(pstate, (CheckPointStmt *) parsetree);
|
||||
break;
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user