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; /* ----------------------