On 5/7/15, Sawada Masahiko <sawada.m...@gmail.com> wrote: > On Wed, May 6, 2015 at 5:42 AM, Robert Haas <robertmh...@gmail.com > <javascript:;>> wrote: >> On Tue, May 5, 2015 at 11:10 AM, Sawada Masahiko <sawada.m...@gmail.com > <javascript:;>> wrote: >>> On Fri, May 1, 2015 at 9:04 PM, Robert Haas <robertmh...@gmail.com > <javascript:;>> wrote: >>>> On Thu, Apr 30, 2015 at 11:05 PM, Sawada Masahiko >>>> <sawada.m...@gmail.com > <javascript:;>> wrote: >>>>> VACUUM has both syntax: with parentheses and without parentheses. >>>>> I think we should have both syntax for REINDEX like VACUUM does >>>>> because it would be pain to put parentheses whenever we want to do >>>>> REINDEX. >>>>> Are the parentheses optional in REINDEX command? >>>> >>>> No. The unparenthesized VACUUM syntax was added back before we >>>> realized that that kind of syntax is a terrible idea. It requires >>>> every option to be a keyword, and those keywords have to be in a fixed >>>> order. I believe the intention is to keep the old VACUUM syntax >>>> around for backward-compatibility, but not to extend it. Same for >>>> EXPLAIN and COPY. >>> >>> REINDEX will have only one option VERBOSE for now. >>> Even we're in a situation like that it's not clear to be added newly >>> additional option to REINDEX now, we should need to put parenthesis? >> >> In my opinion, yes. The whole point of a flexible options syntax is >> that we can add new options without changing the grammar. That >> involves some compromise on the syntax, which doesn't bother me a bit. >> Our previous experiments with this for EXPLAIN and COPY and VACUUM >> have worked out quite well, and I see no reason for pessimism here. > > I agree that flexible option syntax does not need to change grammar > whenever we add new options. > Attached patch is changed based on your suggestion. > And the patch for reindexdb is also attached. > Please feedbacks. > >>> Also I'm not sure that both implementation and documentation regarding >>> VERBOSE option should be optional. >> >> I don't know what this means. >> > > Sorry for confusing you. > Please ignore this. >
Sorry, I forgot attach files. Regards, ------- Sawada Masahiko
diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index 998340c..703b760 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -21,7 +21,7 @@ PostgreSQL documentation <refsynopsisdiv> <synopsis> -REINDEX { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } <replaceable class="PARAMETER">name</replaceable> +REINDEX [ ( { VERBOSE } [, ...] ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } <replaceable class="PARAMETER">name</replaceable> </synopsis> </refsynopsisdiv> @@ -150,6 +150,15 @@ REINDEX { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } <replaceable class="PARAM </para> </listitem> </varlistentry> + + <varlistentry> + <term><literal>VERBOSE</literal></term> + <listitem> + <para> + Prints a progress report as each index is reindexed. + </para> + </listitem> + </varlistentry> </variablelist> </refsect1> diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index ac3b785..c04b907 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -63,6 +63,7 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/pg_rusage.h" #include "utils/syscache.h" #include "utils/tuplesort.h" #include "utils/snapmgr.h" @@ -3133,13 +3134,22 @@ IndexGetRelation(Oid indexId, bool missing_ok) * reindex_index - This routine is used to recreate a single index */ void -reindex_index(Oid indexId, bool skip_constraint_checks, char persistence) +reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, + uint8 options) { Relation iRel, heapRelation; Oid heapId; IndexInfo *indexInfo; volatile bool skipped_constraint = false; + int elevel = DEBUG2; + PGRUsage ru0; + + pg_rusage_init(&ru0); + + /* Set option(s) */ + if (options & REINDEXOPT_VERBOSE) + elevel = INFO; /* * Open and lock the parent heap relation. ShareLock is sufficient since @@ -3283,6 +3293,13 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence) heap_close(pg_index, RowExclusiveLock); } + /* Log what we did */ + ereport(elevel, + (errmsg("index \"%s\" was reindexed.", + get_rel_name(indexId)), + errdetail("%s.", + pg_rusage_show(&ru0)))); + /* Close rels, but keep locks */ index_close(iRel, NoLock); heap_close(heapRelation, NoLock); @@ -3324,7 +3341,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence) * index rebuild. */ bool -reindex_relation(Oid relid, int flags) +reindex_relation(Oid relid, int flags, uint8 options) { Relation rel; Oid toast_relid; @@ -3415,7 +3432,7 @@ reindex_relation(Oid relid, int flags) RelationSetIndexList(rel, doneIndexes, InvalidOid); reindex_index(indexOid, !(flags & REINDEX_REL_CHECK_CONSTRAINTS), - persistence); + persistence, options); CommandCounterIncrement(); @@ -3450,7 +3467,7 @@ reindex_relation(Oid relid, int flags) * still hold the lock on the master table. */ if ((flags & REINDEX_REL_PROCESS_TOAST) && OidIsValid(toast_relid)) - result |= reindex_relation(toast_relid, flags); + result |= reindex_relation(toast_relid, flags, options); return result; } diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 3febdd5..34ffaba 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -1532,7 +1532,7 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, else if (newrelpersistence == RELPERSISTENCE_PERMANENT) reindex_flags |= REINDEX_REL_FORCE_INDEXES_PERMANENT; - reindex_relation(OIDOldHeap, reindex_flags); + reindex_relation(OIDOldHeap, reindex_flags, false); /* * If the relation being rebuild is pg_class, swap_relation_files() diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 351d48e..fa63611 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -1681,7 +1681,7 @@ ChooseIndexColumnNames(List *indexElems) * Recreate a specific index. */ Oid -ReindexIndex(RangeVar *indexRelation) +ReindexIndex(RangeVar *indexRelation, uint8 options) { Oid indOid; Oid heapOid = InvalidOid; @@ -1706,7 +1706,7 @@ ReindexIndex(RangeVar *indexRelation) persistence = irel->rd_rel->relpersistence; index_close(irel, NoLock); - reindex_index(indOid, false, persistence); + reindex_index(indOid, false, persistence, options); return indOid; } @@ -1775,7 +1775,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, uint8 options) { Oid heapOid; @@ -1785,7 +1785,8 @@ ReindexTable(RangeVar *relation) if (!reindex_relation(heapOid, REINDEX_REL_PROCESS_TOAST | - REINDEX_REL_CHECK_CONSTRAINTS)) + REINDEX_REL_CHECK_CONSTRAINTS, + options)) ereport(NOTICE, (errmsg("table \"%s\" has no indexes", relation->relname))); @@ -1802,7 +1803,8 @@ ReindexTable(RangeVar *relation) * That means this must not be called within a user transaction block! */ void -ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind) +ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, + uint8 options) { Oid objectOid; Relation relationRelation; @@ -1814,12 +1816,17 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind) List *relids = NIL; ListCell *l; int num_keys; + int elevel = DEBUG2; AssertArg(objectName); Assert(objectKind == REINDEX_OBJECT_SCHEMA || objectKind == REINDEX_OBJECT_SYSTEM || objectKind == REINDEX_OBJECT_DATABASE); + /* Set option(s) */ + if (options & REINDEXOPT_VERBOSE) + elevel = INFO; + /* * Get OID of object to reindex, being the database currently being used * by session for a database or for system catalogs, or the schema defined @@ -1938,9 +1945,10 @@ ReindexMultipleTables(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, + options)) + ereport(elevel, + (errmsg("indexes of 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 299d8cc..925ad5d 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1234,7 +1234,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); } pgstat_count_truncate(rel); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 805045d..dc4409c 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -3783,6 +3783,7 @@ _copyReindexStmt(const ReindexStmt *from) COPY_SCALAR_FIELD(kind); COPY_NODE_FIELD(relation); COPY_STRING_FIELD(name); + COPY_SCALAR_FIELD(options); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 578ead5..a89afd6 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1908,6 +1908,7 @@ _equalReindexStmt(const ReindexStmt *a, const ReindexStmt *b) COMPARE_SCALAR_FIELD(kind); COMPARE_NODE_FIELD(relation); COMPARE_STRING_FIELD(name); + COMPARE_SCALAR_FIELD(options); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 0180530..8a0e569 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -459,6 +459,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <node> explain_option_arg %type <defelt> explain_option_elem %type <list> explain_option_list + +%type <ival> reindex_target_type reindex_target_multitable +%type <ival> reindex_option_list reindex_option_elem + %type <node> copy_generic_opt_arg copy_generic_opt_arg_list_item %type <defelt> copy_generic_opt_elem %type <list> copy_generic_opt_list copy_generic_opt_arg_list @@ -7383,52 +7387,63 @@ DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_d * * QUERY: * - * REINDEX type <name> + * REINDEX [ (options) ] type <name> *****************************************************************************/ ReindexStmt: - REINDEX INDEX qualified_name + REINDEX reindex_target_type qualified_name { ReindexStmt *n = makeNode(ReindexStmt); - n->kind = REINDEX_OBJECT_INDEX; + n->kind = $2; n->relation = $3; n->name = NULL; + n->options = 0; $$ = (Node *)n; } - | REINDEX TABLE qualified_name + | REINDEX reindex_target_multitable name { ReindexStmt *n = makeNode(ReindexStmt); - n->kind = REINDEX_OBJECT_TABLE; - n->relation = $3; - n->name = NULL; - $$ = (Node *)n; - } - | REINDEX SCHEMA name - { - ReindexStmt *n = makeNode(ReindexStmt); - n->kind = REINDEX_OBJECT_SCHEMA; + n->kind = $2; n->name = $3; n->relation = NULL; + n->options = 0; $$ = (Node *)n; } - | REINDEX SYSTEM_P name + | REINDEX '(' reindex_option_list ')' reindex_target_type qualified_name { ReindexStmt *n = makeNode(ReindexStmt); - n->kind = REINDEX_OBJECT_SYSTEM; - n->name = $3; - n->relation = NULL; + n->kind = $5; + n->relation = $6; + n->name = NULL; + n->options = $3; $$ = (Node *)n; } - | REINDEX DATABASE name + | REINDEX '(' reindex_option_list ')' reindex_target_multitable name { ReindexStmt *n = makeNode(ReindexStmt); - n->kind = REINDEX_OBJECT_DATABASE; - n->name = $3; + n->kind = $5; + n->name = $6; n->relation = NULL; + n->options = $3; $$ = (Node *)n; } ; - +reindex_target_type: + INDEX { $$ = REINDEX_OBJECT_INDEX; } + | TABLE { $$ = REINDEX_OBJECT_TABLE; } + ; +reindex_target_multitable: + SCHEMA { $$ = REINDEX_OBJECT_SCHEMA; } + | SYSTEM_P { $$ = REINDEX_OBJECT_SYSTEM; } + | DATABASE { $$ = REINDEX_OBJECT_DATABASE; } + ; +reindex_option_list: + reindex_option_elem { $$ = $1; } + | reindex_option_list ',' reindex_option_elem { $$ = $1 | $3; } + ; +reindex_option_elem: + VERBOSE { $$ = REINDEXOPT_VERBOSE; } + ; /***************************************************************************** * diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 59f09dc..6bae061 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -762,10 +762,10 @@ standard_ProcessUtility(Node *parsetree, switch (stmt->kind) { case REINDEX_OBJECT_INDEX: - ReindexIndex(stmt->relation); + ReindexIndex(stmt->relation, stmt->options); break; case REINDEX_OBJECT_TABLE: - ReindexTable(stmt->relation); + ReindexTable(stmt->relation, stmt->options); break; case REINDEX_OBJECT_SCHEMA: case REINDEX_OBJECT_SYSTEM: @@ -781,7 +781,7 @@ standard_ProcessUtility(Node *parsetree, (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" : (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" : "REINDEX DATABASE"); - ReindexMultipleTables(stmt->name, stmt->kind); + ReindexMultipleTables(stmt->name, stmt->kind, stmt->options); 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 750e29d..55b0df5 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -3335,7 +3335,6 @@ psql_completion(const char *text, int start, int end) /* REINDEX */ else if (pg_strcasecmp(prev_wd, "REINDEX") == 0) { - static const char *const list_REINDEX[] = {"TABLE", "INDEX", "SYSTEM", "SCHEMA", "DATABASE", NULL}; COMPLETE_WITH_LIST(list_REINDEX); @@ -3346,13 +3345,14 @@ psql_completion(const char *text, int start, int end) 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 ) + 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); } + /* SECURITY LABEL */ else if (pg_strcasecmp(prev_wd, "SECURITY") == 0) COMPLETE_WITH_CONST("LABEL"); diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index a04def9..994a2f2 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -113,7 +113,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, uint8 options); /* Flag bits for reindex_relation(): */ #define REINDEX_REL_PROCESS_TOAST 0x01 @@ -122,7 +122,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, uint8 options); 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 335f09c..80b3d30 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -29,9 +29,10 @@ extern ObjectAddress DefineIndex(Oid relationId, bool check_rights, bool skip_build, bool quiet); -extern Oid ReindexIndex(RangeVar *indexRelation); -extern Oid ReindexTable(RangeVar *relation); -extern void ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind); +extern Oid ReindexIndex(RangeVar *indexRelation, uint8 options); +extern Oid ReindexTable(RangeVar *relation, uint8 options); +extern void ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, + uint8 options); 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 852eb4f..aae328c 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -2745,6 +2745,11 @@ typedef struct ConstraintsSetStmt * REINDEX Statement * ---------------------- */ +typedef enum ReindexOption +{ + REINDEXOPT_VERBOSE = 1 << 0 /* pint progress info */ +} ReindexOption; + typedef enum ReindexObjectType { REINDEX_OBJECT_INDEX, /* index */ @@ -2760,6 +2765,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 */ + uint8 options; /* ReindexOption flags*/ } ReindexStmt; /* ---------------------- diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index abe64e5..cba11b4 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -2832,6 +2832,14 @@ explain (costs off) (2 rows) -- +-- REINDEX (VERBOSE) +-- +CREATE TABLE reindex_verbose(id integer primary key); +\set VERBOSITY terse +REINDEX (VERBOSE) TABLE reindex_verbose; +INFO: index "reindex_verbose_pkey" was reindexed. +DROP TABLE reindex_verbose; +-- -- REINDEX SCHEMA -- REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index f779fa0..6333a30 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -966,6 +966,14 @@ explain (costs off) select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null)); -- +-- REINDEX (VERBOSE) +-- +CREATE TABLE reindex_verbose(id integer primary key); +\set VERBOSITY terse +REINDEX (VERBOSE) TABLE reindex_verbose; +DROP TABLE reindex_verbose; + +-- -- REINDEX SCHEMA -- REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index 778d72a..fdb79f1 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -18,16 +18,16 @@ static void reindex_one_database(const char *name, const char *dbname, const char *type, const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, - bool echo); + bool echo, bool verbose); static void reindex_all_databases(const char *maintenance_db, const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, - bool quiet); + bool quiet, bool verbose); static void reindex_system_catalogs(const char *dbname, const char *host, const char *port, const char *username, enum trivalue prompt_password, - const char *progname, bool echo); + const char *progname, bool echo, bool verbose); static void help(const char *progname); int @@ -47,6 +47,7 @@ main(int argc, char *argv[]) {"system", no_argument, NULL, 's'}, {"table", required_argument, NULL, 't'}, {"index", required_argument, NULL, 'i'}, + {"verbose", no_argument, NULL, 'v'}, {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -65,6 +66,7 @@ main(int argc, char *argv[]) bool alldb = false; bool echo = false; bool quiet = false; + bool verbose = false; SimpleStringList indexes = {NULL, NULL}; SimpleStringList tables = {NULL, NULL}; SimpleStringList schemas = {NULL, NULL}; @@ -118,6 +120,9 @@ main(int argc, char *argv[]) case 'i': simple_string_list_append(&indexes, optarg); break; + case 'v': + verbose = true; + break; case 2: maintenance_db = pg_strdup(optarg); break; @@ -176,7 +181,7 @@ main(int argc, char *argv[]) } reindex_all_databases(maintenance_db, host, port, username, - prompt_password, progname, echo, quiet); + prompt_password, progname, echo, quiet, verbose); } else if (syscatalog) { @@ -207,7 +212,7 @@ main(int argc, char *argv[]) } reindex_system_catalogs(dbname, host, port, username, prompt_password, - progname, echo); + progname, echo, verbose); } else { @@ -228,7 +233,7 @@ main(int argc, char *argv[]) for (cell = schemas.head; cell; cell = cell->next) { reindex_one_database(cell->val, dbname, "SCHEMA", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, verbose); } } @@ -239,7 +244,7 @@ main(int argc, char *argv[]) for (cell = indexes.head; cell; cell = cell->next) { reindex_one_database(cell->val, dbname, "INDEX", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, verbose); } } if (tables.head != NULL) @@ -249,13 +254,13 @@ main(int argc, char *argv[]) for (cell = tables.head; cell; cell = cell->next) { reindex_one_database(cell->val, dbname, "TABLE", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, verbose); } } /* reindex database only if neither index nor table nor schema is specified */ if (indexes.head == NULL && tables.head == NULL && schemas.head == NULL) reindex_one_database(dbname, dbname, "DATABASE", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, verbose); } exit(0); @@ -264,7 +269,8 @@ main(int argc, char *argv[]) static void reindex_one_database(const char *name, const char *dbname, const char *type, const char *host, const char *port, const char *username, - enum trivalue prompt_password, const char *progname, bool echo) + enum trivalue prompt_password, const char *progname, bool echo, + bool verbose) { PQExpBufferData sql; @@ -273,6 +279,10 @@ reindex_one_database(const char *name, const char *dbname, const char *type, initPQExpBuffer(&sql); appendPQExpBufferStr(&sql, "REINDEX"); + + if (verbose) + appendPQExpBufferStr(&sql, " (VERBOSE) "); + if (strcmp(type, "TABLE") == 0) appendPQExpBuffer(&sql, " TABLE %s", name); else if (strcmp(type, "INDEX") == 0) @@ -312,7 +322,7 @@ static void reindex_all_databases(const char *maintenance_db, const char *host, const char *port, const char *username, enum trivalue prompt_password, - const char *progname, bool echo, bool quiet) + const char *progname, bool echo, bool quiet, bool verbose) { PGconn *conn; PGresult *result; @@ -334,7 +344,7 @@ reindex_all_databases(const char *maintenance_db, } reindex_one_database(dbname, dbname, "DATABASE", host, port, username, - prompt_password, progname, echo); + prompt_password, progname, echo, verbose); } PQclear(result); @@ -343,7 +353,7 @@ reindex_all_databases(const char *maintenance_db, static void reindex_system_catalogs(const char *dbname, const char *host, const char *port, const char *username, enum trivalue prompt_password, - const char *progname, bool echo) + const char *progname, bool echo, bool verbose) { PQExpBufferData sql; @@ -351,7 +361,12 @@ reindex_system_catalogs(const char *dbname, const char *host, const char *port, initPQExpBuffer(&sql); - appendPQExpBuffer(&sql, "REINDEX SYSTEM %s;", dbname); + appendPQExpBuffer(&sql, "REINDEX"); + + if (verbose) + appendPQExpBuffer(&sql, " (VERBOSE) "); + + appendPQExpBuffer(&sql, " SYSTEM %s;", dbname); conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); @@ -380,6 +395,7 @@ help(const char *progname) printf(_(" -q, --quiet don't write any messages\n")); printf(_(" -s, --system reindex system catalogs\n")); printf(_(" -S, --schema=SCHEMA recreate specific schema(s) only\n")); + printf(_(" -v, --verbose write a lot of output\n")); printf(_(" -t, --table=TABLE reindex specific table(s) only\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n"));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers