57#include <unicode/ucol.h>
68#include "catalog/pg_authid_d.h"
69#include "catalog/pg_class_d.h"
70#include "catalog/pg_collation_d.h"
71#include "catalog/pg_database_d.h"
97 "trust",
"reject",
"scram-sha-256",
"md5",
"password",
"ident",
"radius",
119 "trust",
"reject",
"scram-sha-256",
"md5",
"password",
"peer",
"radius",
208#define AUTHTRUST_WARNING \
209"# CAUTION: Configuring the system for local \"trust\" authentication\n" \
210"# allows any local user to connect as any PostgreSQL user, including\n" \
211"# the database superuser. If you do not trust all your local users,\n" \
212"# use another authentication method.\n"
226static const char *
const backend_options =
"--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true -c log_checkpoints=false";
233 "pg_wal/archive_status",
243 "pg_multixact/members",
244 "pg_multixact/offsets",
253 "pg_logical/snapshots",
254 "pg_logical/mappings"
263 const char *
token,
const char *replacement);
265 const char *guc_name,
const char *guc_value,
266 bool mark_as_comment);
268static char **
readfile(
const char *path);
269static void writefile(
char *path,
char **lines);
319#define PG_CMD_DECL FILE *cmdfd
321#define PG_CMD_OPEN(cmd) \
323 cmdfd = popen_check(cmd, "w"); \
328#define PG_CMD_CLOSE() \
330 if (pclose_check(cmdfd)) \
334#define PG_CMD_PUTS(line) \
336 if (fputs(line, cmdfd) < 0 || fflush(cmdfd) < 0) \
337 output_failed = true, output_errno = errno; \
340#define PG_CMD_PRINTF(fmt, ...) \
342 if (fprintf(cmdfd, fmt, __VA_ARGS__) < 0 || fflush(cmdfd) < 0) \
343 output_failed = true, output_errno = errno; \
370 save = _wsetlocale(category, NULL);
392 if (!_wsetlocale(category, save))
393 pg_fatal(
"failed to restore old locale");
396 pg_fatal(
"failed to restore old locale \"%s\"", save);
432 for (datap =
data; *datap; datap++)
451 newentry->
next = NULL;
452 if (*listhead == NULL)
453 *listhead = newentry;
456 for (oldentry = *listhead; oldentry->
next; oldentry = oldentry->
next)
458 oldentry->
next = newentry;
479 toklen = strlen(
token);
480 replen = strlen(replacement);
481 diff = replen - toklen;
483 for (
int i = 0; lines[
i];
i++)
490 if ((where = strstr(lines[
i],
token)) == NULL)
497 pre = where - lines[
i];
501 memcpy(
newline + pre, replacement, replen);
503 strcpy(
newline + pre + replen, lines[
i] + pre + toklen);
529 bool mark_as_comment)
531 int namelen = strlen(guc_name);
544 for (
i = 0; lines[
i];
i++)
547 const char *namestart;
556 while (*where ==
'#' || isspace((
unsigned char) *where))
562 while (isspace((
unsigned char) *where))
568 memcpy(&
newline->data[mark_as_comment ? 1 : 0], namestart, namelen);
571 where = strrchr(where,
'#');
582 for (ptr = lines[
i]; ptr < where; ptr++)
585 oldindent += 8 - (oldindent % 8);
592 oldindent =
Max(oldindent, newindent + 1);
593 while (newindent < oldindent)
595 int newindent_if_tab = newindent + 8 - (newindent % 8);
597 if (newindent_if_tab <= oldindent)
600 newindent = newindent_if_tab;
621 if (lines[
i] == NULL)
647#define LETTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
648#define DIGITS "0123456789"
650 if (*guc_value ==
'\0')
652 if (strchr(
LETTERS, *guc_value))
658 if (strchr(
DIGITS, *guc_value))
661 guc_value += strspn(guc_value,
DIGITS);
663 if (strspn(guc_value,
LETTERS) == strlen(guc_value))
684 if ((
infile = fopen(path,
"r")) == NULL)
685 pg_fatal(
"could not open file \"%s\" for reading: %m", path);
690 result = (
char **)
pg_malloc(maxlines *
sizeof(
char *));
696 if (n >= maxlines - 1)
699 result = (
char **)
pg_realloc(result, maxlines *
sizeof(
char *));
728 if ((out_file = fopen(path,
"w")) == NULL)
729 pg_fatal(
"could not open file \"%s\" for writing: %m", path);
730 for (line = lines; *line != NULL; line++)
732 if (fputs(*line, out_file) < 0)
733 pg_fatal(
"could not write file \"%s\": %m", path);
736 if (fclose(out_file))
737 pg_fatal(
"could not close file \"%s\": %m", path);
751 cmdfd = popen(command,
mode);
753 pg_log_error(
"could not execute command \"%s\": %m", command);
777 pg_log_info(
"removing contents of data directory \"%s\"",
780 pg_log_error(
"failed to remove contents of data directory");
793 pg_log_error(
"failed to remove contents of WAL directory");
800 pg_log_info(
"data directory \"%s\" not removed at user's request",
804 pg_log_info(
"WAL directory \"%s\" not removed at user's request",
823 pg_log_error_hint(
"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process.");
850 if (encoding_name && *encoding_name)
855 pg_fatal(
"\"%s\" is not a valid server encoding name",
856 encoding_name ? encoding_name :
"(null)");
872 {
"arabic",
"Arabic"},
874 {
"armenian",
"Armenian"},
876 {
"basque",
"Basque"},
878 {
"catalan",
"Catalan"},
880 {
"danish",
"Danish"},
884 {
"english",
"POSIX"},
886 {
"english",
"English"},
888 {
"estonian",
"Estonian"},
890 {
"finnish",
"Finnish"},
892 {
"french",
"French"},
894 {
"german",
"German"},
900 {
"hungarian",
"Hungarian"},
901 {
"indonesian",
"id"},
902 {
"indonesian",
"Indonesian"},
906 {
"italian",
"Italian"},
907 {
"lithuanian",
"lt"},
908 {
"lithuanian",
"Lithuanian"},
910 {
"nepali",
"Nepali"},
912 {
"norwegian",
"Norwegian"},
913 {
"portuguese",
"pt"},
914 {
"portuguese",
"Portuguese"},
917 {
"russian",
"Russian"},
919 {
"serbian",
"Serbian"},
921 {
"spanish",
"Spanish"},
923 {
"swedish",
"Swedish"},
927 {
"turkish",
"Turkish"},
929 {
"yiddish",
"Yiddish"},
961 *ptr !=
'_' && *ptr !=
'-' && *ptr !=
'.' && *ptr !=
'@')
997 if (
stat(path, &statbuf) != 0)
1002 pg_log_error_hint(
"This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
1006 pg_log_error(
"could not access file \"%s\": %m", path);
1007 pg_log_error_hint(
"This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
1013 pg_log_error(
"file \"%s\" is not a regular file", path);
1014 pg_log_error_hint(
"This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
1029 if (extrapath == NULL)
1035 pg_fatal(
"could not open file \"%s\" for writing: %m", path);
1038 pg_fatal(
"could not write file \"%s\": %m", path);
1055 pg_fatal(
"could not open file \"%s\" for writing: %m", path);
1057 pg_fatal(
"could not write file \"%s\": %m", path);
1078#if defined(HAVE_SHM_OPEN) && !defined(__sun__)
1093 if ((
fd = shm_open(
name, O_CREAT | O_RDWR | O_EXCL, 0600)) != -1)
1099 if (errno != EEXIST)
1124#define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10)
1136#define AV_SLOTS_FOR_CONNS(nconns) ((nconns) / 6)
1138 static const int trial_conns[] = {
1141 static const int trial_bufs[] = {
1142 16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,
1143 1000, 900, 800, 700, 600, 500,
1144 400, 300, 200, 100, 50
1147 const int connslen =
sizeof(trial_conns) /
sizeof(
int);
1148 const int bufslen =
sizeof(trial_bufs) /
sizeof(
int);
1158 printf(
_(
"selecting dynamic shared memory implementation ... "));
1168 printf(
_(
"selecting default \"max_connections\" ... "));
1171 for (
i = 0;
i < connslen;
i++)
1173 test_conns = trial_conns[
i];
1179 ok_buffers = test_buffs;
1193 printf(
_(
"selecting default \"autovacuum_worker_slots\" ... %d\n"),
1196 printf(
_(
"selecting default \"shared_buffers\" ... "));
1199 for (
i = 0;
i < bufslen;
i++)
1202 test_buffs = (trial_bufs[
i] * 8192) / BLCKSZ;
1203 if (test_buffs <= ok_buffers)
1205 test_buffs = ok_buffers;
1214 if ((
n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
1219 printf(
_(
"selecting default time zone ... "));
1240 "\"%s\" --check %s %s "
1241 "-c max_connections=%d "
1242 "-c autovacuum_worker_slots=%d "
1243 "-c shared_buffers=%d "
1244 "-c dynamic_shared_memory_type=%s",
1246 test_conns, test_av_slots, test_buffs,
1252 gnames = gnames->
next, gvalues = gvalues->
next)
1259 " < \"%s\" > \"%s\" 2>&1",
1263 status = system(cmd.
data);
1267 return (status == 0);
1279 if ((sz % 1024) == 0)
1280 snprintf(result, 14,
"%dGB", sz / 1024);
1299 fputs(
_(
"creating configuration files ... "),
stdout);
1314 if ((
n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
1315 snprintf(repltok,
sizeof(repltok),
"%dMB",
1318 snprintf(repltok,
sizeof(repltok),
"%dkB",
1338 strcpy(repltok,
"iso, ymd");
1341 strcpy(repltok,
"iso, dmy");
1345 strcpy(repltok,
"iso, mdy");
1351 snprintf(repltok,
sizeof(repltok),
"pg_catalog.%s",
1382 DEF_PGPORT_STR,
true);
1384#if DEFAULT_BACKEND_FLUSH_AFTER > 0
1385 snprintf(repltok,
sizeof(repltok),
"%dkB",
1391#if DEFAULT_BGWRITER_FLUSH_AFTER > 0
1392 snprintf(repltok,
sizeof(repltok),
"%dkB",
1398#if DEFAULT_CHECKPOINT_FLUSH_AFTER > 0
1399 snprintf(repltok,
sizeof(repltok),
"%dkB",
1440 gnames = gnames->
next, gvalues = gvalues->
next)
1443 gvalues->
str,
false);
1451 pg_fatal(
"could not change permissions of \"%s\": %m", path);
1457 conflines[0] =
pg_strdup(
"# Do not edit this file manually!\n");
1458 conflines[1] =
pg_strdup(
"# It will be overwritten by the ALTER SYSTEM command.\n");
1459 conflines[2] = NULL;
1465 pg_fatal(
"could not change permissions of \"%s\": %m", path);
1472 conflines =
replace_token(conflines,
"@remove-line-for-nolocal@",
"");
1483 struct addrinfo *gai_result;
1484 struct addrinfo hints;
1491 err = WSAStartup(MAKEWORD(2, 2), &wsaData);
1495 hints.ai_flags = AI_NUMERICHOST;
1496 hints.ai_family = AF_UNSPEC;
1497 hints.ai_socktype = 0;
1498 hints.ai_protocol = 0;
1499 hints.ai_addrlen = 0;
1500 hints.ai_canonname = NULL;
1501 hints.ai_addr = NULL;
1502 hints.ai_next = NULL;
1505 getaddrinfo(
"::1", NULL, &hints, &gai_result) != 0)
1509 "#host all all ::1");
1511 "host replication all ::1",
1512 "#host replication all ::1");
1521 "@authmethodlocal@",
1532 pg_fatal(
"could not change permissions of \"%s\": %m", path);
1543 pg_fatal(
"could not change permissions of \"%s\": %m", path);
1562 printf(
_(
"running bootstrap script ... "));
1569 snprintf(headerline,
sizeof(headerline),
"# PostgreSQL %s\n",
1572 if (strcmp(headerline, *bki_lines) != 0)
1574 pg_log_error(
"input file \"%s\" does not belong to PostgreSQL %s",
1589 (
sizeof(
Pointer) == 4) ?
"i" :
"d");
1630 for (line = bki_lines; *line != NULL; line++)
1654 PG_CMD_PUTS(
"REVOKE ALL ON pg_authid FROM public;\n\n");
1678 pwd1 =
simple_prompt(
"Enter new superuser password: ",
false);
1680 if (strcmp(pwd1, pwd2) != 0)
1682 fprintf(stderr,
_(
"Passwords didn't match.\n"));
1700 pg_fatal(
"could not open file \"%s\" for reading: %m",
1706 pg_fatal(
"could not read password from file \"%s\": %m",
1709 pg_fatal(
"password file \"%s\" is empty",
1730 PG_CMD_PUTS(
"SELECT pg_stop_making_pinned_objects();\n\n");
1743 for (
char **line = lines; *line != NULL; line++)
1762 "SELECT p.oid as p_oid, o.oid as o_oid, oprname "
1763 "FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid ) "
1764 "INSERT INTO pg_description "
1765 " SELECT p_oid, 'pg_proc'::regclass, 0, "
1766 " 'implementation of ' || oprname || ' operator' "
1768 " WHERE NOT EXISTS (SELECT 1 FROM pg_description "
1769 " WHERE objoid = p_oid AND classoid = 'pg_proc'::regclass) "
1770 " AND NOT EXISTS (SELECT 1 FROM pg_description "
1771 " WHERE objoid = o_oid AND classoid = 'pg_operator'::regclass"
1772 " AND description LIKE 'deprecated%');\n\n");
1786 PG_CMD_PUTS(
"UPDATE pg_collation SET collversion = pg_collation_actual_version(oid) WHERE collname = 'unicode';\n\n");
1789 PG_CMD_PUTS(
"SELECT pg_import_system_collations('pg_catalog');\n\n");
1815 " SET relacl = (SELECT array_agg(a.acl) FROM "
1816 " (SELECT E'=r/\"%s\"' as acl "
1817 " UNION SELECT unnest(pg_catalog.acldefault("
1818 " CASE WHEN relkind = " CppAsString2(RELKIND_SEQUENCE)
" THEN 's' "
1819 " ELSE 'r' END::\"char\"," CppAsString2(BOOTSTRAP_SUPERUSERID)
"::oid))"
1821 " WHERE relkind IN (" CppAsString2(RELKIND_RELATION)
", "
1824 " AND relacl IS NULL;\n\n",
1826 PG_CMD_PUTS(
"GRANT USAGE ON SCHEMA pg_catalog, public TO PUBLIC;\n\n");
1827 PG_CMD_PUTS(
"REVOKE ALL ON pg_largeobject FROM PUBLIC;\n\n");
1829 " (objoid, classoid, objsubid, initprivs, privtype)"
1832 " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
1839 " relacl IS NOT NULL"
1840 " AND relkind IN (" CppAsString2(RELKIND_RELATION)
", "
1844 " (objoid, classoid, objsubid, initprivs, privtype)"
1847 " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
1848 " pg_attribute.attnum,"
1849 " pg_attribute.attacl,"
1853 " JOIN pg_attribute ON (pg_class.oid = pg_attribute.attrelid)"
1855 " pg_attribute.attacl IS NOT NULL"
1856 " AND pg_class.relkind IN (" CppAsString2(RELKIND_RELATION)
", "
1860 " (objoid, classoid, objsubid, initprivs, privtype)"
1863 " (SELECT oid FROM pg_class WHERE relname = 'pg_proc'),"
1870 " proacl IS NOT NULL;\n\n");
1872 " (objoid, classoid, objsubid, initprivs, privtype)"
1875 " (SELECT oid FROM pg_class WHERE relname = 'pg_type'),"
1882 " typacl IS NOT NULL;\n\n");
1884 " (objoid, classoid, objsubid, initprivs, privtype)"
1887 " (SELECT oid FROM pg_class WHERE relname = 'pg_language'),"
1894 " lanacl IS NOT NULL;\n\n");
1896 " (objoid, classoid, objsubid, initprivs, privtype)"
1899 " (SELECT oid FROM pg_class WHERE "
1900 " relname = 'pg_largeobject_metadata'),"
1905 " pg_largeobject_metadata"
1907 " lomacl IS NOT NULL;\n\n");
1909 " (objoid, classoid, objsubid, initprivs, privtype)"
1912 " (SELECT oid FROM pg_class WHERE relname = 'pg_namespace'),"
1919 " nspacl IS NOT NULL;\n\n");
1921 " (objoid, classoid, objsubid, initprivs, privtype)"
1924 " (SELECT oid FROM pg_class WHERE "
1925 " relname = 'pg_foreign_data_wrapper'),"
1930 " pg_foreign_data_wrapper"
1932 " fdwacl IS NOT NULL;\n\n");
1934 " (objoid, classoid, objsubid, initprivs, privtype)"
1937 " (SELECT oid FROM pg_class "
1938 " WHERE relname = 'pg_foreign_server'),"
1943 " pg_foreign_server"
1945 " srvacl IS NOT NULL;\n\n");
1955 char *letterversion;
1963 ptr = vstr + (strlen(vstr) - 1);
1964 while (ptr != vstr && (*ptr < '0' || *ptr >
'9'))
1966 letterversion = ptr + 1;
1967 major = strtol(vstr, &endptr, 10);
1969 minor = strtol(endptr + 1, &endptr, 10);
1971 micro = strtol(endptr + 1, &endptr, 10);
1973 major, minor, micro, letterversion);
1984 PG_CMD_PRINTF(
"UPDATE information_schema.sql_implementation_info "
1985 " SET character_value = '%s' "
1986 " WHERE implementation_info_name = 'DBMS VERSION';\n\n",
1990 " (feature_id, feature_name, sub_feature_id, "
1991 " sub_feature_name, is_supported, comments) "
2038 PG_CMD_PUTS(
"CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false"
2040 " STRATEGY = file_copy;\n\n");
2047 PG_CMD_PUTS(
"UPDATE pg_database SET datcollversion = NULL WHERE datname = 'template0';\n\n");
2052 PG_CMD_PUTS(
"UPDATE pg_database SET datcollversion = pg_database_collation_actual_version(oid) WHERE datname = 'template1';\n\n");
2058 PG_CMD_PUTS(
"REVOKE CREATE,TEMPORARY ON DATABASE template1 FROM public;\n\n");
2059 PG_CMD_PUTS(
"REVOKE CREATE,TEMPORARY ON DATABASE template0 FROM public;\n\n");
2061 PG_CMD_PUTS(
"COMMENT ON DATABASE template0 IS 'unmodifiable empty database';\n\n");
2080 " STRATEGY = file_copy;\n\n");
2081 PG_CMD_PUTS(
"COMMENT ON DATABASE postgres IS 'default administrative connection database';\n\n");
2127 printf(
_(
"could not write to child process: %s\n"),
2144 return strftime(s, max, fmt,
tm);
2168 memset(&testtime, 0,
sizeof(testtime));
2169 testtime.tm_mday = 22;
2170 testtime.tm_mon = 10;
2171 testtime.tm_year = 133;
2180 posM = strstr(
buf,
"11");
2181 posD = strstr(
buf,
"22");
2182 posY = strstr(
buf,
"33");
2184 if (!posM || !posD || !posY)
2187 if (posY < posM && posM < posD)
2189 else if (posD < posM)
2217 pg_fatal(
"locale name \"%s\" contains non-ASCII characters",
locale);
2232 if (res && canonname)
2257 pg_fatal(
"invalid locale settings; check LANG and LC_* environment variables");
2263 pg_fatal(
"locale name \"%s\" contains non-ASCII characters",
2280 if (!(locale_enc == user_enc ||
2290 "selected locale uses (%s) do not match. This would lead to "
2291 "misbehavior in various character string processing functions.",
2295 "or choose a matching combination.",
2313 pg_log_error_detail(
"The encoding you selected (%s) is not supported with the ICU provider.",
2316 "or choose a matching combination.",
2334 const bool strict =
true;
2345 status = U_ZERO_ERROR;
2346 uloc_toLanguageTag(loc_str, langtag, buflen, strict, &status);
2349 if (status == U_BUFFER_OVERFLOW_ERROR ||
2350 status == U_STRING_NOT_TERMINATED_WARNING)
2352 buflen = buflen * 2;
2360 if (U_FAILURE(status))
2364 pg_fatal(
"could not convert locale name \"%s\" to language tag: %s",
2365 loc_str, u_errorName(status));
2370 pg_fatal(
"ICU is not supported in this build");
2385 char lang[ULOC_LANG_CAPACITY];
2389 status = U_ZERO_ERROR;
2390 uloc_getLanguage(loc_str, lang, ULOC_LANG_CAPACITY, &status);
2391 if (U_FAILURE(status))
2393 pg_fatal(
"could not get language from locale \"%s\": %s",
2394 loc_str, u_errorName(status));
2399 if (strcmp(lang,
"") == 0 ||
2400 strcmp(lang,
"root") == 0 || strcmp(lang,
"und") == 0)
2404 for (int32_t
i = 0; !found &&
i < uloc_countAvailable();
i++)
2406 const char *otherloc = uloc_getAvailable(
i);
2407 char otherlang[ULOC_LANG_CAPACITY];
2409 status = U_ZERO_ERROR;
2410 uloc_getLanguage(otherloc, otherlang, ULOC_LANG_CAPACITY, &status);
2411 if (U_FAILURE(status))
2414 if (strcmp(lang, otherlang) == 0)
2419 pg_fatal(
"locale \"%s\" has unknown language \"%s\"",
2422 pg_fatal(
"ICU is not supported in this build");
2470#if defined(LC_MESSAGES) && !defined(WIN32)
2480 pg_fatal(
"locale must be specified if provider is %s",
2487 else if (strcmp(
datlocale,
"C.UTF-8") == 0 ||
2489 canonname =
"C.UTF-8";
2490 else if (strcmp(
datlocale,
"PG_UNICODE_FAST") == 0)
2491 canonname =
"PG_UNICODE_FAST";
2493 pg_fatal(
"invalid locale name \"%s\" for builtin provider",
2504 printf(
_(
"Using language tag \"%s\" for ICU locale \"%s\".\n"),
2516 pg_fatal(
"ICU is not supported in this build");
2527 printf(
_(
"%s initializes a PostgreSQL database cluster.\n\n"),
progname);
2531 printf(
_(
" -A, --auth=METHOD default authentication method for local connections\n"));
2532 printf(
_(
" --auth-host=METHOD default authentication method for local TCP/IP connections\n"));
2533 printf(
_(
" --auth-local=METHOD default authentication method for local-socket connections\n"));
2534 printf(
_(
" [-D, --pgdata=]DATADIR location for this database cluster\n"));
2535 printf(
_(
" -E, --encoding=ENCODING set default encoding for new databases\n"));
2536 printf(
_(
" -g, --allow-group-access allow group read/execute on data directory\n"));
2537 printf(
_(
" --icu-locale=LOCALE set ICU locale ID for new databases\n"));
2538 printf(
_(
" --icu-rules=RULES set additional ICU collation rules for new databases\n"));
2539 printf(
_(
" -k, --data-checksums use data page checksums\n"));
2540 printf(
_(
" --locale=LOCALE set default locale for new databases\n"));
2541 printf(
_(
" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
2542 " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
2543 " set default locale in the respective category for\n"
2544 " new databases (default taken from environment)\n"));
2545 printf(
_(
" --no-locale equivalent to --locale=C\n"));
2546 printf(
_(
" --builtin-locale=LOCALE\n"
2547 " set builtin locale name for new databases\n"));
2548 printf(
_(
" --locale-provider={builtin|libc|icu}\n"
2549 " set default locale provider for new databases\n"));
2550 printf(
_(
" --no-data-checksums do not use data page checksums\n"));
2551 printf(
_(
" --pwfile=FILE read password for the new superuser from file\n"));
2552 printf(
_(
" -T, --text-search-config=CFG\n"
2553 " default text search configuration\n"));
2554 printf(
_(
" -U, --username=NAME database superuser name\n"));
2555 printf(
_(
" -W, --pwprompt prompt for a password for the new superuser\n"));
2556 printf(
_(
" -X, --waldir=WALDIR location for the write-ahead log directory\n"));
2557 printf(
_(
" --wal-segsize=SIZE size of WAL segments, in megabytes\n"));
2558 printf(
_(
"\nLess commonly used options:\n"));
2559 printf(
_(
" -c, --set NAME=VALUE override default setting for server parameter\n"));
2560 printf(
_(
" -d, --debug generate lots of debugging output\n"));
2561 printf(
_(
" --discard-caches set debug_discard_caches=1\n"));
2562 printf(
_(
" -L DIRECTORY where to find the input files\n"));
2563 printf(
_(
" -n, --no-clean do not clean up after errors\n"));
2564 printf(
_(
" -N, --no-sync do not wait for changes to be written safely to disk\n"));
2565 printf(
_(
" --no-sync-data-files do not sync files within database directories\n"));
2566 printf(
_(
" --no-instructions do not print instructions for next steps\n"));
2567 printf(
_(
" -s, --show show internal settings, then exit\n"));
2568 printf(
_(
" --sync-method=METHOD set method for syncing files to disk\n"));
2569 printf(
_(
" -S, --sync-only only sync database files to disk, then exit\n"));
2570 printf(
_(
"\nOther options:\n"));
2571 printf(
_(
" -V, --version output version information, then exit\n"));
2572 printf(
_(
" -?, --help show this help, then exit\n"));
2573 printf(
_(
"\nIf the data directory is not specified, the environment variable PGDATA\n"
2575 printf(
_(
"\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
2576 printf(
_(
"%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
2582 if (*authmethod == NULL)
2585 *authmethod =
"trust";
2592 const char *
const *p;
2594 for (p = valid_methods; *p; p++)
2596 if (strcmp(authmethod, *p) == 0)
2600 pg_fatal(
"invalid authentication method \"%s\" for \"%s\" connections",
2601 authmethod, conntype);
2614 pg_fatal(
"must specify a password for the superuser to enable password authentication");
2621 char *pgdata_get_env;
2625 pgdata_get_env = getenv(
"PGDATA");
2626 if (pgdata_get_env && strlen(pgdata_get_env))
2634 pg_log_error_hint(
"You must identify the directory where the data for this database system "
2635 "will reside. Do this with either the invocation option -D or the "
2636 "environment variable PGDATA.");
2651 pg_fatal(
"could not set environment");
2669 pg_fatal(
"program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
2672 pg_fatal(
"program \"%s\" was found by \"%s\" but was not the same version as %s",
2687 pg_fatal(
"input file location must be an absolute path");
2704 printf(
_(
"The database cluster will be initialized with locale \"%s\".\n"),
lc_ctype);
2707 printf(
_(
"The database cluster will be initialized with this locale configuration:\n"));
2713 " LC_MESSAGES: %s\n"
2714 " LC_MONETARY: %s\n"
2738 if (ctype_enc == -1)
2741 pg_log_error(
"could not find suitable encoding for locale \"%s\"",
2756 printf(
_(
"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
2757 "The default database encoding will be set to \"%s\" instead.\n"),
2761 pg_log_error(
"locale \"%s\" requires unsupported encoding \"%s\"",
2773 printf(
_(
"The default database encoding has accordingly been set to \"%s\".\n"),
2786 if ((strcmp(
datlocale,
"C.UTF-8") == 0 ||
2787 strcmp(
datlocale,
"PG_UNICODE_FAST") == 0) &&
2789 pg_fatal(
"builtin provider locale \"%s\" requires encoding \"%s\"",
2817 "PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
2818 "POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
2819 "POSTGRESQL_CONF_SAMPLE=%s\n"
2820 "PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
2851 pg_log_info(
"could not find suitable text search configuration for locale \"%s\"",
2860 if (checkmatch == NULL)
2862 pg_log_warning(
"suitable text search configuration for locale \"%s\" is unknown",
2867 pg_log_warning(
"specified text search configuration \"%s\" might not match locale \"%s\"",
2872 printf(
_(
"The default text search configuration will be set to \"%s\".\n"),
2906 printf(
_(
"creating directory %s ... "),
2920 printf(
_(
"fixing permissions on existing directory %s ... "),
2925 pg_fatal(
"could not change permissions of directory \"%s\": %m",
2941 pg_log_error_hint(
"If you want to create a new database system, either remove or empty "
2942 "the directory \"%s\" or run %s "
2943 "with an argument other than \"%s\".",
2970 pg_fatal(
"WAL directory location must be an absolute path");
2977 printf(
_(
"creating directory %s ... "),
2982 pg_fatal(
"could not create directory \"%s\": %m",
2992 printf(
_(
"fixing permissions on existing directory %s ... "),
2997 pg_fatal(
"could not change permissions of directory \"%s\": %m",
3013 pg_log_error_hint(
"If you want to store the WAL there, either remove or empty the directory \"%s\".",
3023 pg_fatal(
"could not create symbolic link \"%s\": %m",
3030 pg_fatal(
"could not create directory \"%s\": %m",
3042 pg_log_error_detail(
"It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.");
3043 else if (
error == 3)
3044 pg_log_error_detail(
"It contains a lost+found directory, perhaps due to it being a mount point.");
3046 pg_log_error_hint(
"Using a mount point directly as the data directory is not recommended.\n"
3047 "Create a subdirectory under the mount point.");
3073 printf(
_(
"creating subdirectories ... "));
3087 pg_fatal(
"could not create directory \"%s\": %m", path);
3116 fputs(
_(
"performing post-bootstrap initialization ... "),
stdout);
3168 static struct option long_options[] = {
3218 char *effective_user;
3236 if (strcmp(argv[1],
"--help") == 0 || strcmp(argv[1],
"-?") == 0)
3241 if (strcmp(argv[1],
"--version") == 0 || strcmp(argv[1],
"-V") == 0)
3243 puts(
"initdb (PostgreSQL) " PG_VERSION);
3250 while ((
c =
getopt_long(argc, argv,
"A:c:dD:E:gkL:nNsST:U:WX:",
3251 long_options, &option_index)) != -1)
3277 char *equals = strchr(
buf,
'=');
3306 printf(
_(
"Running in debug mode.\n"));
3310 printf(
_(
"Running in no-clean mode. Mistakes will not be cleaned up.\n"));
3373 "-c debug_discard_caches=1");
3376 if (strcmp(
optarg,
"builtin") == 0)
3378 else if (strcmp(
optarg,
"icu") == 0)
3380 else if (strcmp(
optarg,
"libc") == 0)
3426 pg_log_error(
"too many command-line arguments (first is \"%s\")",
3433 pg_fatal(
"%s cannot be specified unless locale provider \"%s\" is chosen",
3434 "--builtin-locale",
"builtin");
3437 pg_fatal(
"%s cannot be specified unless locale provider \"%s\" is chosen",
3438 "--icu-locale",
"icu");
3441 pg_fatal(
"%s cannot be specified unless locale provider \"%s\" is chosen",
3442 "--icu-rules",
"icu");
3455 fputs(
_(
"syncing data to disk ... "),
stdout);
3463 pg_fatal(
"password prompt and password file cannot be specified together");
3474 pg_fatal(
"argument of %s must be a power of two between 1 and 1024",
"--wal-segsize");
3482 effective_user =
get_id();
3486 if (strncmp(
username,
"pg_", 3) == 0)
3487 pg_fatal(
"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"",
username);
3489 printf(
_(
"The files belonging to this database system will be owned "
3491 "This user must also own the server process.\n\n"),
3505 printf(
_(
"Data page checksums are enabled.\n"));
3507 printf(
_(
"Data page checksums are disabled.\n"));
3518 fputs(
_(
"syncing data to disk ... "),
stdout);
3524 printf(
_(
"\nSync to disk skipped.\nThe data directory might become corrupt if the operating system crashes.\n"));
3529 pg_log_warning(
"enabling \"trust\" authentication for local connections");
3530 pg_log_warning_hint(
"You can change this by editing pg_hba.conf or using the option -A, or "
3531 "--auth-local and --auth-host, the next time you run initdb.");
3562 printf(
_(
"\nSuccess. You can now start the database server using:\n\n"
3564 start_db_cmd->
data);
#define PG_TEXTDOMAIN(domain)
int find_my_exec(const char *argv0, char *retpath)
void set_pglocale_pgservice(const char *argv0, const char *app)
int find_other_exec(const char *argv0, const char *target, const char *versionstr, char *retpath)
#define fprintf(file, fmt, msg)
bool is_encoding_supported_by_icu(int encoding)
void err(int eval, const char *fmt,...)
void * pg_malloc(size_t size)
char * pg_strdup(const char *in)
void * pg_realloc(void *ptr, size_t size)
#define pg_realloc_array(pointer, type, count)
#define pg_malloc_array(type, count)
void SetDataDirectoryCreatePerm(int dataDirMode)
#define PG_DIR_MODE_GROUP
@ DATA_DIR_SYNC_METHOD_FSYNC
int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)
#define required_argument
static char * escape_quotes_bki(const char *src)
static void usage(const char *progname)
static const char * default_timezone
static char * superuser_password
static char * encodingid_to_string(int enc)
int main(int argc, char *argv[])
static char * get_id(void)
void warn_on_mount_point(int error)
static void setup_depend(FILE *cmdfd)
static bool found_existing_pgdata
static bool found_existing_xlogdir
static char * pgdata_native
#define PG_CMD_PUTS(line)
static void check_authmethod_valid(const char *authmethod, const char *const *valid_methods, const char *conntype)
static bool sync_data_files
static char ** readfile(const char *path)
static bool icu_locale_specified
static bool noinstructions
void initialize_data_directory(void)
static void setup_collation(FILE *cmdfd)
static bool check_icu_locale_encoding(int user_enc)
static char backend_exec[MAXPGPATH]
static void restore_global_locale(int category, save_locale_t save)
static bool data_checksums
void setup_text_search(void)
static int get_encoding_id(const char *encoding_name)
static char infoversion[100]
static FILE * popen_check(const char *command, const char *mode)
static char * icu_language_tag(const char *loc_str)
static const char * authmethodhost
void create_data_directory(void)
static bool guc_value_requires_quotes(const char *guc_value)
static char * features_file
struct _stringlist _stringlist
void setup_bin_paths(const char *argv0)
static bool check_locale_encoding(const char *locale, int user_enc)
static void check_authmethod_unspecified(const char **authmethod)
static char locale_provider
static const char *const auth_methods_host[]
static int wal_segment_size_mb
static void bootstrap_template1(void)
void setup_locale_encoding(void)
static void setup_run_file(FILE *cmdfd, const char *filename)
static const char *const auth_methods_local[]
static char ** replace_token(char **lines, const char *token, const char *replacement)
static bool test_specific_config_settings(int test_conns, int test_av_slots, int test_buffs)
static size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm)
static void setlocales(void)
static save_locale_t save_global_locale(int category)
static bool made_new_xlogdir
static void setup_auth(FILE *cmdfd)
static void check_need_password(const char *authmethodlocal, const char *authmethodhost)
static int locale_date_order(const char *locale)
static void make_postgres(FILE *cmdfd)
static void test_config_settings(void)
static void cleanup_directories_atexit(void)
static const char *const backend_options
static void setup_config(void)
static char * lc_messages
static void setup_privileges(FILE *cmdfd)
static void write_version_file(const char *extrapath)
static const char * find_matching_ts_config(const char *lc_type)
static void trapsig(SIGNAL_ARGS)
static bool output_failed
static char * system_views_file
static void setup_description(FILE *cmdfd)
static char * escape_quotes(const char *src)
#define PG_CMD_PRINTF(fmt,...)
static bool builtin_locale_specified
static char * pretty_wal_size(int segment_count)
static void vacuum_db(FILE *cmdfd)
static const char *const subdirs[]
static void set_info_version(void)
static const struct tsearch_config_match tsearch_config_languages[]
void setup_data_file_paths(void)
static void set_input(char **dest, const char *filename)
static bool made_new_pgdata
static char ** replace_guc_value(char **lines, const char *guc_name, const char *guc_value, bool mark_as_comment)
#define MIN_BUFS_FOR_CONNS(nconns)
static DataDirSyncMethod sync_method
static char bin_path[MAXPGPATH]
void create_xlog_or_symlink(void)
static char * system_functions_file
static _stringlist * extra_guc_names
#define AV_SLOTS_FOR_CONNS(nconns)
static const char * dynamic_shared_memory_type
static void check_input(char *path)
static void add_stringlist_item(_stringlist **listhead, const char *str)
static bool caught_signal
static const char * progname
static _stringlist * extra_guc_values
#define AUTHTRUST_WARNING
static const char * choose_dsm_implementation(void)
static char * dictionary_file
static void writefile(char *path, char **lines)
static void setup_schema(FILE *cmdfd)
const char * select_default_timezone(const char *share_path)
static void check_ok(void)
static char * system_constraints_file
static void set_null_conf(void)
static char * extra_options
static const char * authmethodlocal
static const char *const boot_options
static void make_template0(FILE *cmdfd)
static char * info_schema_file
static void load_plpgsql(FILE *cmdfd)
static const char * default_text_search_config
static void check_locale_name(int category, const char *locale, char **canonname)
static char * lc_monetary
static void icu_validate_locale(const char *loc_str)
static void get_su_pwd(void)
void pg_logging_init(const char *argv0)
#define pg_log_error(...)
#define pg_log_error_hint(...)
#define pg_log_warning_hint(...)
#define pg_log_error_detail(...)
void pfree(void *pointer)
bool option_parse_int(const char *optarg, const char *optname, int min_range, int max_range, int *result)
bool parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method)
static PgChecksumMode mode
#define DEFAULT_PGSOCKET_DIR
#define DEFAULT_XLOG_SEG_SIZE
#define DEFAULT_BACKEND_FLUSH_AFTER
#define DEFAULT_CHECKPOINT_FLUSH_AFTER
#define DEFAULT_BGWRITER_FLUSH_AFTER
static char * pg_ctl_path
static char version_file[MAXPGPATH]
char * pg_get_line(FILE *stream, PromptInterruptContext *prompt_ctx)
bool pg_get_line_buf(FILE *stream, StringInfo buf)
PGDLLIMPORT char * optarg
uint32 pg_prng_uint32(pg_prng_state *state)
void pg_prng_seed(pg_prng_state *state, uint64 seed)
#define pg_encoding_to_char
#define pg_valid_server_encoding_id
#define pg_valid_server_encoding
#define pg_log_warning(...)
void get_share_path(const char *my_exec_path, char *ret_path)
void join_path_components(char *ret_path, const char *head, const char *tail)
int pg_mkdir_p(char *path, int omode)
#define is_absolute_path(filename)
char * last_dir_separator(const char *filename)
int pg_strcasecmp(const char *s1, const char *s2)
char * escape_single_quotes_ascii(const char *src)
void canonicalize_path(char *path)
void get_parent_directory(char *path)
int pg_check_dir(const char *dir)
void make_native_path(char *filename)
#define PG_BACKEND_VERSIONSTR
const char * get_progname(const char *argv0)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
size_t strlcpy(char *dst, const char *src, size_t siz)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
void printfPQExpBuffer(PQExpBuffer str, const char *fmt,...)
PQExpBuffer createPQExpBuffer(void)
void initPQExpBuffer(PQExpBuffer str)
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void destroyPQExpBuffer(PQExpBuffer str)
void appendPQExpBufferChar(PQExpBuffer str, char ch)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
void termPQExpBuffer(PQExpBuffer str)
static int fd(const char *x, int i)
static pg_prng_state prng_state
char * psprintf(const char *fmt,...)
void get_restricted_token(void)
bool rmtree(const char *path, bool rmtopdir)
char * simple_prompt(const char *prompt, bool echo)
int pg_strip_crlf(char *str)
bool pg_is_ascii(const char *str)
void appendShellString(PQExpBuffer buf, const char *str)
void initStringInfo(StringInfo str)
struct _stringlist * next
const char * get_user_name_or_exit(const char *progname)
#define symlink(oldpath, newpath)
#define IsValidWalSegSize(size)
#define DEFAULT_MAX_WAL_SEGS
#define DEFAULT_MIN_WAL_SEGS
static void infile(const char *name)