diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml
index 0a4c7d4..a224111 100644
--- a/doc/src/sgml/ref/reindex.sgml
+++ b/doc/src/sgml/ref/reindex.sgml
@@ -21,7 +21,7 @@ PostgreSQL documentation
-REINDEX { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } name [ FORCE ]
+REINDEX { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } [VERBOSE] name [ FORCE ]
@@ -81,6 +81,16 @@ REINDEX { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } relpersistence);
+ reindex_index(indOid, false, indexRelation->relpersistence, verbose);
return indOid;
}
@@ -1758,7 +1758,7 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation,
* Recreate all indexes of a table (and of its toast table, if any)
*/
Oid
-ReindexTable(RangeVar *relation)
+ReindexTable(RangeVar *relation, bool verbose)
{
Oid heapOid;
@@ -1768,7 +1768,8 @@ ReindexTable(RangeVar *relation)
if (!reindex_relation(heapOid,
REINDEX_REL_PROCESS_TOAST |
- REINDEX_REL_CHECK_CONSTRAINTS))
+ REINDEX_REL_CHECK_CONSTRAINTS,
+ verbose))
ereport(NOTICE,
(errmsg("table \"%s\" has no indexes",
relation->relname)));
@@ -1785,7 +1786,7 @@ ReindexTable(RangeVar *relation)
* That means this must not be called within a user transaction block!
*/
Oid
-ReindexObject(const char *objectName, ReindexObjectType objectKind)
+ReindexObject(const char *objectName, ReindexObjectType objectKind, bool verbose)
{
Oid objectOid;
Relation relationRelation;
@@ -1797,6 +1798,7 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
List *relids = NIL;
ListCell *l;
int num_keys;
+ int elevel = verbose ? INFO : DEBUG2;
AssertArg(objectName);
Assert(objectKind == REINDEX_OBJECT_SCHEMA ||
@@ -1939,9 +1941,10 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
PushActiveSnapshot(GetTransactionSnapshot());
if (reindex_relation(relid,
REINDEX_REL_PROCESS_TOAST |
- REINDEX_REL_CHECK_CONSTRAINTS))
- ereport(DEBUG1,
- (errmsg("table \"%s.%s\" was reindexed",
+ REINDEX_REL_CHECK_CONSTRAINTS,
+ verbose))
+ ereport(elevel,
+ (errmsg("indexes of whole table \"%s.%s\" were reindexed",
get_namespace_name(get_rel_namespace(relid)),
get_rel_name(relid))));
PopActiveSnapshot();
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 66d5083..16a57fd 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -1218,7 +1218,7 @@ ExecuteTruncate(TruncateStmt *stmt)
/*
* Reconstruct the indexes to match, and we're done.
*/
- reindex_relation(heap_relid, REINDEX_REL_PROCESS_TOAST);
+ reindex_relation(heap_relid, REINDEX_REL_PROCESS_TOAST, false);
}
}
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 36dac29..7f82c5f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -7318,43 +7318,48 @@ opt_if_exists: IF_P EXISTS { $$ = TRUE; }
*****************************************************************************/
ReindexStmt:
- REINDEX INDEX qualified_name opt_force
+ REINDEX INDEX opt_verbose qualified_name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->kind = REINDEX_OBJECT_INDEX;
- n->relation = $3;
+ n->verbose = $3;
+ n->relation = $4;
n->name = NULL;
$$ = (Node *)n;
}
- | REINDEX TABLE qualified_name opt_force
+ | REINDEX TABLE opt_verbose qualified_name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->kind = REINDEX_OBJECT_TABLE;
- n->relation = $3;
+ n->verbose = $3;
+ n->relation = $4;
n->name = NULL;
$$ = (Node *)n;
}
- | REINDEX SCHEMA name opt_force
+ | REINDEX SCHEMA opt_verbose name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->kind = REINDEX_OBJECT_SCHEMA;
- n->name = $3;
+ n->verbose = $3;
+ n->name = $4;
n->relation = NULL;
$$ = (Node *)n;
}
- | REINDEX SYSTEM_P name opt_force
+ | REINDEX SYSTEM_P opt_verbose name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->kind = REINDEX_OBJECT_SYSTEM;
- n->name = $3;
+ n->verbose = $3;
+ n->name = $4;
n->relation = NULL;
$$ = (Node *)n;
}
- | REINDEX DATABASE name opt_force
+ | REINDEX DATABASE opt_verbose name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->kind = REINDEX_OBJECT_DATABASE;
- n->name = $3;
+ n->verbose = $3;
+ n->name = $4;
n->relation = NULL;
$$ = (Node *)n;
}
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 3533cfa..19ebb90 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -750,10 +750,10 @@ standard_ProcessUtility(Node *parsetree,
switch (stmt->kind)
{
case REINDEX_OBJECT_INDEX:
- ReindexIndex(stmt->relation);
+ ReindexIndex(stmt->relation, stmt->verbose);
break;
case REINDEX_OBJECT_TABLE:
- ReindexTable(stmt->relation);
+ ReindexTable(stmt->relation, stmt->verbose);
break;
case REINDEX_OBJECT_SCHEMA:
case REINDEX_OBJECT_SYSTEM:
@@ -768,7 +768,7 @@ standard_ProcessUtility(Node *parsetree,
PreventTransactionChain(isTopLevel,
(stmt->kind == REINDEX_OBJECT_SCHEMA) ?
"REINDEX SCHEMA" : "REINDEX DATABASE");
- ReindexObject(stmt->name, stmt->kind);
+ ReindexObject(stmt->name, stmt->kind, stmt->verbose);
break;
default:
elog(ERROR, "unrecognized object type: %d",
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index e39a07c..5baa8aa 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3336,17 +3336,39 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH_LIST(list_REINDEX);
}
- else if (pg_strcasecmp(prev2_wd, "REINDEX") == 0)
+ else if ((pg_strcasecmp(prev2_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev_wd, "TABLE") == 0) ||
+ (pg_strcasecmp(prev3_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev2_wd, "TABLE") == 0 &&
+ pg_strcasecmp(prev_wd, "VERBOSE") == 0))
{
- if (pg_strcasecmp(prev_wd, "TABLE") == 0)
- COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, NULL);
- else if (pg_strcasecmp(prev_wd, "INDEX") == 0)
- COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL);
- else if (pg_strcasecmp(prev_wd, "SCHEMA") == 0 )
- COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
- else if (pg_strcasecmp(prev_wd, "SYSTEM") == 0 ||
- pg_strcasecmp(prev_wd, "DATABASE") == 0)
- COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, "UNION SELECT 'VERBOSE'");
+ }
+ else if ((pg_strcasecmp(prev2_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev_wd, "INDEX") == 0) ||
+ (pg_strcasecmp(prev3_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev2_wd, "INDEX") == 0 &&
+ pg_strcasecmp(prev_wd, "VERBOSE") == 0))
+ {
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, "UNION SELECT 'VERBOSE'");
+ }
+ else if ((pg_strcasecmp(prev2_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev_wd, "SYSTEM") == 0) ||
+ (pg_strcasecmp(prev3_wd, "REINDEX") == 0 &&
+ pg_strcasecmp(prev2_wd, "SYSTEM") == 0 &&
+ pg_strcasecmp(prev_wd, "VERBOSE") == 0))
+ {
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases "UNION SELECT 'VERBOSE'");
+ }
+ else if ((pg_strcasecmp(prev2_wd, "REINDEX") == 0 &&
+ (pg_strcasecmp(prev_wd, "SCHEMA") == 0 ||
+ pg_strcasecmp(prev_wd, "DATABASE") == 0)) ||
+ (pg_strcasecmp(prev3_wd, "REINDEX") == 0 &&
+ (pg_strcasecmp(prev2_wd, "SCHEMA") == 0 ||
+ pg_strcasecmp(prev2_wd, "DATABASE") == 0) &&
+ pg_strcasecmp(prev_wd, "VERBOSE") == 0))
+ {
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas "UNION SELECT 'VERBOSE'");
}
/* SECURITY LABEL */
diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h
index e7cc7a0..48f8660 100644
--- a/src/include/catalog/index.h
+++ b/src/include/catalog/index.h
@@ -112,7 +112,7 @@ extern void validate_index(Oid heapId, Oid indexId, Snapshot snapshot);
extern void index_set_state_flags(Oid indexId, IndexStateFlagsAction action);
extern void reindex_index(Oid indexId, bool skip_constraint_checks,
- char relpersistence);
+ char relpersistence, bool verbose);
/* Flag bits for reindex_relation(): */
#define REINDEX_REL_PROCESS_TOAST 0x01
@@ -121,7 +121,7 @@ extern void reindex_index(Oid indexId, bool skip_constraint_checks,
#define REINDEX_REL_FORCE_INDEXES_UNLOGGED 0x08
#define REINDEX_REL_FORCE_INDEXES_PERMANENT 0x10
-extern bool reindex_relation(Oid relid, int flags);
+extern bool reindex_relation(Oid relid, int flags, bool verbose);
extern bool ReindexIsProcessingHeap(Oid heapOid);
extern bool ReindexIsProcessingIndex(Oid indexOid);
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index cf586fe..8ebb2d5 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -28,9 +28,10 @@ extern Oid DefineIndex(Oid relationId,
bool check_rights,
bool skip_build,
bool quiet);
-extern Oid ReindexIndex(RangeVar *indexRelation);
-extern Oid ReindexTable(RangeVar *relation);
-extern Oid ReindexObject(const char *databaseName, ReindexObjectType kind);
+extern Oid ReindexIndex(RangeVar *indexRelation, bool verbose);
+extern Oid ReindexTable(RangeVar *relation, bool verbose);
+extern Oid ReindexObject(const char *databaseName, ReindexObjectType kind,
+ bool verbose);
extern char *makeObjectName(const char *name1, const char *name2,
const char *label);
extern char *ChooseRelationName(const char *name1, const char *name2,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index b1dfa85..c840e41 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2739,6 +2739,7 @@ typedef struct ReindexStmt
ReindexObjectType kind; /* REINDEX_OBJECT_INDEX, REINDEX_OBJECT_TABLE, etc. */
RangeVar *relation; /* Table or index to reindex */
const char *name; /* name of database to reindex */
+ bool verbose; /* print progress info */
} ReindexStmt;
/* ----------------------