17#include "catalog/pg_class_d.h"
62 const char *
name,
bool echo,
68main(
int argc,
char *argv[])
98 const char *host =
NULL;
201 pg_log_error(
"too many command-line arguments (first is \"%s\")",
217 pg_fatal(
"cannot use multiple jobs to reindex system catalogs");
222 pg_fatal(
"cannot reindex all databases and a specific one at the same time");
236 else if (
getenv(
"PGUSER"))
302 pg_fatal(
"cannot use the \"%s\" option on server versions older than PostgreSQL %s",
303 "concurrently",
"12");
309 pg_fatal(
"cannot use the \"%s\" option on server versions older than PostgreSQL %s",
420 const char *objname = cell->
val;
469 }
while (cell !=
NULL);
503 const char *
paren =
"(";
504 const char *
comma =
", ";
597 pg_log_error(
"reindexing of database \"%s\" failed: %s",
601 pg_log_error(
"reindexing of index \"%s\" in database \"%s\" failed: %s",
605 pg_log_error(
"reindexing of schema \"%s\" in database \"%s\" failed: %s",
609 pg_log_error(
"reindexing of system catalogs in database \"%s\" failed: %s",
613 pg_log_error(
"reindexing of table \"%s\" in database \"%s\" failed: %s",
648 "SELECT c.relname, ns.nspname\n"
649 " FROM pg_catalog.pg_class c\n"
650 " JOIN pg_catalog.pg_namespace ns"
651 " ON c.relnamespace = ns.oid\n"
652 " WHERE ns.nspname != 'pg_catalog'\n"
653 " AND c.relkind IN ("
656 " AND c.relpersistence != "
658 " ORDER BY c.relpages DESC;");
672 "SELECT c.relname, ns.nspname\n"
673 " FROM pg_catalog.pg_class c\n"
674 " JOIN pg_catalog.pg_namespace ns"
675 " ON c.relnamespace = ns.oid\n"
676 " WHERE c.relkind IN ("
679 " AND c.relpersistence != "
681 " AND ns.nspname IN (");
692 " ORDER BY c.relpages DESC;");
719 for (
int i = 0;
i < ntups;
i++)
771 "SELECT x.indrelid, n.nspname, i.relname\n"
772 "FROM pg_catalog.pg_index x\n"
773 "JOIN pg_catalog.pg_class i ON i.oid = x.indexrelid\n"
774 "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = i.relnamespace\n"
775 "WHERE x.indexrelid = ANY(ARRAY['");
790 "']::pg_catalog.regclass[])\n"
791 "ORDER BY max(i.relpages) OVER \n"
792 " (PARTITION BY x.indrelid),\n"
793 " x.indrelid, i.relpages;\n");
818 for (
int i = 0;
i < ntups;
i++)
844 "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
901 printf(
_(
" -a, --all reindex all databases\n"));
902 printf(
_(
" --concurrently reindex concurrently\n"));
903 printf(
_(
" -d, --dbname=DBNAME database to reindex\n"));
904 printf(
_(
" -e, --echo show the commands being sent to the server\n"));
905 printf(
_(
" -i, --index=INDEX recreate specific index(es) only\n"));
906 printf(
_(
" -j, --jobs=NUM use this many concurrent connections to reindex\n"));
907 printf(
_(
" -q, --quiet don't write any messages\n"));
908 printf(
_(
" -s, --system reindex system catalogs only\n"));
909 printf(
_(
" -S, --schema=SCHEMA reindex specific schema(s) only\n"));
910 printf(
_(
" -t, --table=TABLE reindex specific table(s) only\n"));
911 printf(
_(
" --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"));
912 printf(
_(
" -v, --verbose write a lot of output\n"));
913 printf(
_(
" -V, --version output version information, then exit\n"));
914 printf(
_(
" -?, --help show this help, then exit\n"));
915 printf(
_(
"\nConnection options:\n"));
916 printf(
_(
" -h, --host=HOSTNAME database server host or socket directory\n"));
917 printf(
_(
" -p, --port=PORT database server port\n"));
918 printf(
_(
" -U, --username=USERNAME user name to connect as\n"));
919 printf(
_(
" -w, --no-password never prompt for password\n"));
920 printf(
_(
" -W, --password force password prompt\n"));
921 printf(
_(
" --maintenance-db=DBNAME alternate maintenance database\n"));
922 printf(
_(
"\nRead the description of the SQL command REINDEX for details.\n"));
void appendQualifiedRelation(PQExpBuffer buf, const char *spec, PGconn *conn, bool echo)
#define Assert(condition)
#define PG_TEXTDOMAIN(domain)
volatile sig_atomic_t CancelRequested
void setup_cancel_handler(void(*query_cancel_callback)(void))
void set_pglocale_pgservice(const char *argv0, const char *app)
PGconn * connectMaintenanceDatabase(ConnParams *cparams, const char *progname, bool echo)
PGconn * connectDatabase(const ConnParams *cparams, const char *progname, bool echo, bool fail_ok, bool allow_password_reuse)
PGresult * executeQuery(PGconn *conn, const char *query)
int PQserverVersion(const PGconn *conn)
char * PQdb(const PGconn *conn)
int PQclientEncoding(const PGconn *conn)
void PQfinish(PGconn *conn)
char * PQerrorMessage(const PGconn *conn)
int PQsendQuery(PGconn *conn, const char *query)
char * pg_strdup(const char *in)
void * pg_malloc0(size_t size)
int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)
#define required_argument
void pg_logging_init(const char *argv0)
#define pg_log_error(...)
#define pg_log_error_hint(...)
void pfree(void *pointer)
bool option_parse_int(const char *optarg, const char *optname, int min_range, int max_range, int *result)
void handle_help_version_opts(int argc, char *argv[], const char *fixed_progname, help_handler hlp)
ParallelSlotArray * ParallelSlotsSetup(int numslots, ConnParams *cparams, const char *progname, bool echo, const char *initcmd)
bool ParallelSlotsWaitCompletion(ParallelSlotArray *sa)
bool TableCommandResultHandler(PGresult *res, PGconn *conn, void *context)
ParallelSlot * ParallelSlotsGetIdle(ParallelSlotArray *sa, const char *dbname)
void ParallelSlotsTerminate(ParallelSlotArray *sa)
void ParallelSlotsAdoptConn(ParallelSlotArray *sa, PGconn *conn)
static void ParallelSlotSetHandler(ParallelSlot *slot, ParallelSlotResultHandler handler, void *context)
PGDLLIMPORT char * optarg
const char * get_progname(const char *argv0)
void initPQExpBuffer(PQExpBuffer str)
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void appendPQExpBufferChar(PQExpBuffer str, char ch)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
void termPQExpBuffer(PQExpBuffer str)
static void get_parallel_tabidx_list(PGconn *conn, SimpleStringList *index_list, SimpleOidList **table_list, bool echo)
static void reindex_all_databases(ConnParams *cparams, const char *progname, bool echo, bool quiet, bool verbose, bool concurrently, int concurrentCons, const char *tablespace, bool syscatalog, SimpleStringList *schemas, SimpleStringList *tables, SimpleStringList *indexes)
static SimpleStringList * get_parallel_tables_list(PGconn *conn, ReindexType type, SimpleStringList *user_list, bool echo)
static void reindex_one_database(ConnParams *cparams, ReindexType type, SimpleStringList *user_list, const char *progname, bool echo, bool verbose, bool concurrently, int concurrentCons, const char *tablespace)
static void run_reindex_command(PGconn *conn, ReindexType type, const char *name, bool echo, PQExpBufferData *sql)
static void gen_reindex_command(PGconn *conn, ReindexType type, const char *name, bool echo, bool verbose, bool concurrently, const char *tablespace, PQExpBufferData *sql)
void simple_oid_list_destroy(SimpleOidList *list)
void simple_string_list_append(SimpleStringList *list, const char *val)
void simple_string_list_destroy(SimpleStringList *list)
void simple_oid_list_append(SimpleOidList *list, Oid val)
const char * fmtIdEnc(const char *rawid, int encoding)
const char * fmtQualifiedIdEnc(const char *schema, const char *id, int encoding)
void appendStringLiteralConn(PQExpBuffer buf, const char *str, PGconn *conn)
char val[FLEXIBLE_ARRAY_MEMBER]
struct SimpleStringListCell * next
SimpleStringListCell * head
enum trivalue prompt_password
const char * get_user_name_or_exit(const char *progname)