mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
Provide a parenthesized-options syntax for VACUUM, analogous to that recently
adopted for EXPLAIN. This will allow additional options to be implemented in future without having to make them fully-reserved keywords. The old syntax remains available for existing options, however. Itagaki Takahiro
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.141 2009/08/12 18:23:49 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.142 2009/11/16 21:32:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -135,7 +135,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
Oid save_userid;
|
||||
bool save_secdefcxt;
|
||||
|
||||
if (vacstmt->verbose)
|
||||
if (vacstmt->options & VACOPT_VERBOSE)
|
||||
elevel = INFO;
|
||||
else
|
||||
elevel = DEBUG2;
|
||||
@@ -173,7 +173,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
(pg_database_ownercheck(MyDatabaseId, GetUserId()) && !onerel->rd_rel->relisshared)))
|
||||
{
|
||||
/* No need for a WARNING if we already complained during VACUUM */
|
||||
if (!vacstmt->vacuum)
|
||||
if (!(vacstmt->options & VACOPT_VACUUM))
|
||||
{
|
||||
if (onerel->rd_rel->relisshared)
|
||||
ereport(WARNING,
|
||||
@@ -199,7 +199,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
if (onerel->rd_rel->relkind != RELKIND_RELATION)
|
||||
{
|
||||
/* No need for a WARNING if we already complained during VACUUM */
|
||||
if (!vacstmt->vacuum)
|
||||
if (!(vacstmt->options & VACOPT_VACUUM))
|
||||
ereport(WARNING,
|
||||
(errmsg("skipping \"%s\" --- cannot analyze indexes, views, or special system tables",
|
||||
RelationGetRelationName(onerel))));
|
||||
@@ -475,7 +475,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
* VACUUM ANALYZE, don't overwrite the accurate count already inserted by
|
||||
* VACUUM.
|
||||
*/
|
||||
if (!vacstmt->vacuum)
|
||||
if (!(vacstmt->options & VACOPT_VACUUM))
|
||||
{
|
||||
for (ind = 0; ind < nindexes; ind++)
|
||||
{
|
||||
@@ -493,7 +493,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
cleanup:
|
||||
|
||||
/* If this isn't part of VACUUM ANALYZE, let index AMs do cleanup */
|
||||
if (!vacstmt->vacuum)
|
||||
if (!(vacstmt->options & VACOPT_VACUUM))
|
||||
{
|
||||
for (ind = 0; ind < nindexes; ind++)
|
||||
{
|
||||
|
@@ -13,7 +13,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.395 2009/11/10 18:00:06 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.396 2009/11/16 21:32:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -289,14 +289,22 @@ void
|
||||
vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
BufferAccessStrategy bstrategy, bool for_wraparound, bool isTopLevel)
|
||||
{
|
||||
const char *stmttype = vacstmt->vacuum ? "VACUUM" : "ANALYZE";
|
||||
const char *stmttype;
|
||||
volatile MemoryContext anl_context = NULL;
|
||||
volatile bool all_rels,
|
||||
in_outer_xact,
|
||||
use_own_xacts;
|
||||
List *relations;
|
||||
|
||||
if (vacstmt->verbose)
|
||||
/* sanity checks on options */
|
||||
Assert(vacstmt->options & (VACOPT_VACUUM | VACOPT_ANALYZE));
|
||||
Assert((vacstmt->options & VACOPT_VACUUM) ||
|
||||
!(vacstmt->options & (VACOPT_FULL | VACOPT_FREEZE)));
|
||||
Assert((vacstmt->options & VACOPT_ANALYZE) || vacstmt->va_cols == NIL);
|
||||
|
||||
stmttype = (vacstmt->options & VACOPT_VACUUM) ? "VACUUM" : "ANALYZE";
|
||||
|
||||
if (vacstmt->options & VACOPT_VERBOSE)
|
||||
elevel = INFO;
|
||||
else
|
||||
elevel = DEBUG2;
|
||||
@@ -315,7 +323,7 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
*
|
||||
* ANALYZE (without VACUUM) can run either way.
|
||||
*/
|
||||
if (vacstmt->vacuum)
|
||||
if (vacstmt->options & VACOPT_VACUUM)
|
||||
{
|
||||
PreventTransactionChain(isTopLevel, stmttype);
|
||||
in_outer_xact = false;
|
||||
@@ -327,7 +335,7 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
* Send info about dead objects to the statistics collector, unless we are
|
||||
* in autovacuum --- autovacuum.c does this for itself.
|
||||
*/
|
||||
if (vacstmt->vacuum && !IsAutoVacuumWorkerProcess())
|
||||
if ((vacstmt->options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess())
|
||||
pgstat_vacuum_stat();
|
||||
|
||||
/*
|
||||
@@ -378,11 +386,11 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
* transaction block, and also in an autovacuum worker, use own
|
||||
* transactions so we can release locks sooner.
|
||||
*/
|
||||
if (vacstmt->vacuum)
|
||||
if (vacstmt->options & VACOPT_VACUUM)
|
||||
use_own_xacts = true;
|
||||
else
|
||||
{
|
||||
Assert(vacstmt->analyze);
|
||||
Assert(vacstmt->options & VACOPT_ANALYZE);
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
use_own_xacts = true;
|
||||
else if (in_outer_xact)
|
||||
@@ -438,11 +446,11 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
Oid relid = lfirst_oid(cur);
|
||||
bool scanned_all = false;
|
||||
|
||||
if (vacstmt->vacuum)
|
||||
if (vacstmt->options & VACOPT_VACUUM)
|
||||
vacuum_rel(relid, vacstmt, do_toast, for_wraparound,
|
||||
&scanned_all);
|
||||
|
||||
if (vacstmt->analyze)
|
||||
if (vacstmt->options & VACOPT_ANALYZE)
|
||||
{
|
||||
MemoryContext old_context = NULL;
|
||||
|
||||
@@ -502,7 +510,7 @@ vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
|
||||
StartTransactionCommand();
|
||||
}
|
||||
|
||||
if (vacstmt->vacuum && !IsAutoVacuumWorkerProcess())
|
||||
if ((vacstmt->options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess())
|
||||
{
|
||||
/*
|
||||
* Update pg_database.datfrozenxid, and truncate pg_clog if possible.
|
||||
@@ -1034,7 +1042,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast, bool for_wraparound,
|
||||
*/
|
||||
PushActiveSnapshot(GetTransactionSnapshot());
|
||||
|
||||
if (!vacstmt->full)
|
||||
if (!(vacstmt->options & VACOPT_FULL))
|
||||
{
|
||||
/*
|
||||
* In lazy vacuum, we can set the PROC_IN_VACUUM flag, which lets
|
||||
@@ -1074,7 +1082,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast, bool for_wraparound,
|
||||
* vacuum, but just ShareUpdateExclusiveLock for concurrent vacuum. Either
|
||||
* way, we can be sure that no other backend is vacuuming the same table.
|
||||
*/
|
||||
lmode = vacstmt->full ? AccessExclusiveLock : ShareUpdateExclusiveLock;
|
||||
lmode = (vacstmt->options & VACOPT_FULL) ? AccessExclusiveLock : ShareUpdateExclusiveLock;
|
||||
|
||||
/*
|
||||
* Open the relation and get the appropriate lock on it.
|
||||
@@ -1186,7 +1194,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast, bool for_wraparound,
|
||||
/*
|
||||
* Do the actual work --- either FULL or "lazy" vacuum
|
||||
*/
|
||||
if (vacstmt->full)
|
||||
if (vacstmt->options & VACOPT_FULL)
|
||||
heldoff = full_vacuum_rel(onerel, vacstmt);
|
||||
else
|
||||
heldoff = lazy_vacuum_rel(onerel, vacstmt, vac_strategy, scanned_all);
|
||||
@@ -1331,8 +1339,11 @@ full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt)
|
||||
vacrelstats->hasindex, FreezeLimit);
|
||||
|
||||
/* report results to the stats collector, too */
|
||||
pgstat_report_vacuum(RelationGetRelid(onerel), onerel->rd_rel->relisshared,
|
||||
true, vacstmt->analyze, vacrelstats->rel_tuples);
|
||||
pgstat_report_vacuum(RelationGetRelid(onerel),
|
||||
onerel->rd_rel->relisshared,
|
||||
true,
|
||||
(vacstmt->options & VACOPT_ANALYZE) != 0,
|
||||
vacrelstats->rel_tuples);
|
||||
|
||||
return heldoff;
|
||||
}
|
||||
|
@@ -29,7 +29,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.123 2009/11/10 18:00:06 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.124 2009/11/16 21:32:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -164,7 +164,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
if (IsAutoVacuumWorkerProcess() && Log_autovacuum_min_duration > 0)
|
||||
starttime = GetCurrentTimestamp();
|
||||
|
||||
if (vacstmt->verbose)
|
||||
if (vacstmt->options & VACOPT_VERBOSE)
|
||||
elevel = INFO;
|
||||
else
|
||||
elevel = DEBUG2;
|
||||
@@ -236,7 +236,8 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
||||
pgstat_report_vacuum(RelationGetRelid(onerel),
|
||||
onerel->rd_rel->relisshared,
|
||||
vacrelstats->scanned_all,
|
||||
vacstmt->analyze, vacrelstats->rel_tuples);
|
||||
(vacstmt->options & VACOPT_ANALYZE) != 0,
|
||||
vacrelstats->rel_tuples);
|
||||
|
||||
/* and log the action if appropriate */
|
||||
if (IsAutoVacuumWorkerProcess() && Log_autovacuum_min_duration >= 0)
|
||||
|
Reference in New Issue
Block a user