66#include "utils/fmgroids.h"
114static void movedb(
const char *
dbname,
const char *tblspcname);
117 Oid *dbIdP,
Oid *ownerIdP,
118 int *encodingP,
bool *dbIsTemplateP,
bool *dbAllowConnP,
bool *dbHasLoginEvtP,
120 Oid *dbTablespace,
char **dbCollate,
char **dbCtype,
char **dbLocale,
123 char **dbCollversion);
131 Oid dbid,
char *srcpath,
139 Oid src_tsid,
Oid dst_tsid);
149 Oid src_tsid,
Oid dst_tsid)
153 List *rlocatorlist = NULL;
179 srcrelid.
dbId = src_dboid;
180 dstrelid.
dbId = dst_dboid;
183 foreach(cell, rlocatorlist)
194 if (srcrlocator.
spcOid == src_tsid)
195 dstrlocator.
spcOid = dst_tsid;
199 dstrlocator.
dbOid = dst_dboid;
270 relid.
relId = RelationRelationId;
275 rlocator.
dbOid = dbid;
294 for (blkno = 0; blkno < nblocks; blkno++)
311 srcpath, rlocatorlist,
330 char *srcpath,
List *rlocatorlist,
376 rlocatorlist =
lappend(rlocatorlist, relinfo);
412 if (classForm->reltablespace == GLOBALTABLESPACE_OID ||
413 !RELKIND_HAS_STORAGE(classForm->relkind) ||
414 classForm->relpersistence == RELPERSISTENCE_TEMP)
422 relfilenumber = classForm->relfilenode;
429 elog(
ERROR,
"relation with OID %u does not have a valid relfilenumber",
441 relinfo->
reloid = classForm->oid;
444 Assert(classForm->relpersistence != RELPERSISTENCE_TEMP);
446 (classForm->relpersistence == RELPERSISTENCE_PERMANENT) ?
true :
false;
469 nbytes = strlen(PG_MAJORVERSION) + 1;
475 if (errno != EEXIST || !isRedo)
478 errmsg(
"could not create directory \"%s\": %m", dbpath)));
486 snprintf(versionfile,
sizeof(versionfile),
"%s/%s", dbpath,
"PG_VERSION");
489 if (
fd < 0 && errno == EEXIST && isRedo)
495 errmsg(
"could not create file \"%s\": %m", versionfile)));
507 errmsg(
"could not write to file \"%s\": %m", versionfile)));
515 errmsg(
"could not fsync file \"%s\": %m", versionfile)));
585 Oid srctablespace = spaceform->oid;
592 if (srctablespace == GLOBALTABLESPACE_OID)
605 if (srctablespace == src_tsid)
606 dsttablespace = dst_tsid;
608 dsttablespace = srctablespace;
623 xlrec.
db_id = dst_dboid;
688 int src_encoding = -1;
689 char *src_collate = NULL;
690 char *src_ctype = NULL;
691 char *src_locale = NULL;
692 char *src_icurules = NULL;
693 char src_locprovider =
'\0';
694 char *src_collversion = NULL;
696 bool src_hasloginevt =
false;
700 Oid src_deftablespace;
701 volatile Oid dst_deftablespace;
704 Datum new_record[Natts_pg_database] = {0};
705 bool new_record_nulls[Natts_pg_database] = {0};
709 DefElem *tablespacenameEl = NULL;
714 DefElem *builtinlocaleEl = NULL;
721 DefElem *allowconnectionsEl = NULL;
726 char *dbowner = NULL;
727 const char *dbtemplate = NULL;
728 char *dbcollate = NULL;
729 char *dbctype = NULL;
730 const char *dblocale = NULL;
731 char *dbicurules = NULL;
732 char dblocprovider =
'\0';
735 bool dbistemplate =
false;
736 bool dballowconnections =
true;
738 char *dbcollversion = NULL;
749 if (strcmp(defel->
defname,
"tablespace") == 0)
751 if (tablespacenameEl)
753 tablespacenameEl = defel;
755 else if (strcmp(defel->
defname,
"owner") == 0)
761 else if (strcmp(defel->
defname,
"template") == 0)
767 else if (strcmp(defel->
defname,
"encoding") == 0)
773 else if (strcmp(defel->
defname,
"locale") == 0)
779 else if (strcmp(defel->
defname,
"builtin_locale") == 0)
783 builtinlocaleEl = defel;
785 else if (strcmp(defel->
defname,
"lc_collate") == 0)
791 else if (strcmp(defel->
defname,
"lc_ctype") == 0)
797 else if (strcmp(defel->
defname,
"icu_locale") == 0)
803 else if (strcmp(defel->
defname,
"icu_rules") == 0)
809 else if (strcmp(defel->
defname,
"locale_provider") == 0)
813 locproviderEl = defel;
815 else if (strcmp(defel->
defname,
"is_template") == 0)
819 istemplateEl = defel;
821 else if (strcmp(defel->
defname,
"allow_connections") == 0)
823 if (allowconnectionsEl)
825 allowconnectionsEl = defel;
827 else if (strcmp(defel->
defname,
"connection_limit") == 0)
833 else if (strcmp(defel->
defname,
"collation_version") == 0)
837 collversionEl = defel;
839 else if (strcmp(defel->
defname,
"location") == 0)
842 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
843 errmsg(
"LOCATION is not supported anymore"),
844 errhint(
"Consider using tablespaces instead."),
847 else if (strcmp(defel->
defname,
"oid") == 0)
868 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
871 else if (strcmp(defel->
defname,
"strategy") == 0)
879 (
errcode(ERRCODE_SYNTAX_ERROR),
884 if (ownerEl && ownerEl->
arg)
886 if (templateEl && templateEl->
arg)
888 if (encodingEl && encodingEl->
arg)
890 const char *encoding_name;
896 if (strcmp(encoding_name,
"") == 0 ||
899 (
errcode(ERRCODE_UNDEFINED_OBJECT),
900 errmsg(
"%d is not a valid encoding code",
910 (
errcode(ERRCODE_UNDEFINED_OBJECT),
911 errmsg(
"%s is not a valid encoding name",
916 if (localeEl && localeEl->
arg)
922 if (builtinlocaleEl && builtinlocaleEl->
arg)
924 if (collateEl && collateEl->
arg)
926 if (ctypeEl && ctypeEl->
arg)
928 if (iculocaleEl && iculocaleEl->
arg)
930 if (icurulesEl && icurulesEl->
arg)
932 if (locproviderEl && locproviderEl->
arg)
937 dblocprovider = COLLPROVIDER_BUILTIN;
939 dblocprovider = COLLPROVIDER_ICU;
941 dblocprovider = COLLPROVIDER_LIBC;
944 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
945 errmsg(
"unrecognized locale provider: %s",
948 if (istemplateEl && istemplateEl->
arg)
950 if (allowconnectionsEl && allowconnectionsEl->
arg)
952 if (connlimitEl && connlimitEl->
arg)
957 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
958 errmsg(
"invalid connection limit: %d", dbconnlimit)));
978 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
979 errmsg(
"permission denied to create database")));
993 dbtemplate =
"template1";
996 &src_dboid, &src_owner, &src_encoding,
997 &src_istemplate, &src_allowconn, &src_hasloginevt,
998 &src_frozenxid, &src_minmxid, &src_deftablespace,
999 &src_collate, &src_ctype, &src_locale, &src_icurules, &src_locprovider,
1002 (
errcode(ERRCODE_UNDEFINED_DATABASE),
1003 errmsg(
"template database \"%s\" does not exist",
1012 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1013 errmsg(
"cannot use invalid database \"%s\" as template", dbtemplate),
1014 errhint(
"Use DROP DATABASE to drop invalid databases."));
1020 if (!src_istemplate)
1024 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1025 errmsg(
"permission denied to copy database \"%s\"",
1030 if (strategyEl && strategyEl->
arg)
1041 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1042 errmsg(
"invalid create database strategy \"%s\"", strategy),
1043 errhint(
"Valid strategies are \"wal_log\" and \"file_copy\".")));
1049 if (dbcollate == NULL)
1050 dbcollate = src_collate;
1051 if (dbctype == NULL)
1052 dbctype = src_ctype;
1053 if (dblocprovider ==
'\0')
1054 dblocprovider = src_locprovider;
1055 if (dblocale == NULL)
1056 dblocale = src_locale;
1057 if (dbicurules == NULL)
1058 dbicurules = src_icurules;
1063 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1069 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1070 errmsg(
"invalid LC_COLLATE locale name: \"%s\"", dbcollate),
1071 errhint(
"If the locale name is specific to ICU, use ICU_LOCALE.")));
1072 dbcollate = canonname;
1075 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1076 errmsg(
"invalid LC_CTYPE locale name: \"%s\"", dbctype),
1077 errhint(
"If the locale name is specific to ICU, use ICU_LOCALE.")));
1078 dbctype = canonname;
1083 if (dblocprovider != COLLPROVIDER_BUILTIN)
1085 if (builtinlocaleEl)
1087 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1088 errmsg(
"BUILTIN_LOCALE cannot be specified unless locale provider is builtin")));
1091 if (dblocprovider != COLLPROVIDER_ICU)
1095 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1096 errmsg(
"ICU locale cannot be specified unless locale provider is ICU")));
1100 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1101 errmsg(
"ICU rules cannot be specified unless locale provider is ICU")));
1105 if (dblocprovider == COLLPROVIDER_BUILTIN)
1113 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1114 errmsg(
"LOCALE or BUILTIN_LOCALE must be specified")));
1118 else if (dblocprovider == COLLPROVIDER_ICU)
1122 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1123 errmsg(
"encoding \"%s\" is not supported with ICU provider",
1132 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1133 errmsg(
"LOCALE or ICU_LOCALE must be specified")));
1145 if (langtag && strcmp(dblocale, langtag) != 0)
1148 (
errmsg(
"using standard form \"%s\" for ICU locale \"%s\"",
1149 langtag, dblocale)));
1159 if (dblocprovider == COLLPROVIDER_LIBC)
1172 if (strcmp(dbtemplate,
"template0") != 0)
1176 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1177 errmsg(
"new encoding (%s) is incompatible with the encoding of the template database (%s)",
1180 errhint(
"Use the same encoding as in the template database, or use template0 as template.")));
1182 if (strcmp(dbcollate, src_collate) != 0)
1184 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1185 errmsg(
"new collation (%s) is incompatible with the collation of the template database (%s)",
1186 dbcollate, src_collate),
1187 errhint(
"Use the same collation as in the template database, or use template0 as template.")));
1189 if (strcmp(dbctype, src_ctype) != 0)
1191 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1192 errmsg(
"new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)",
1193 dbctype, src_ctype),
1194 errhint(
"Use the same LC_CTYPE as in the template database, or use template0 as template.")));
1196 if (dblocprovider != src_locprovider)
1198 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1199 errmsg(
"new locale provider (%s) does not match locale provider of the template database (%s)",
1200 collprovider_name(dblocprovider), collprovider_name(src_locprovider)),
1201 errhint(
"Use the same locale provider as in the template database, or use template0 as template.")));
1203 if (dblocprovider == COLLPROVIDER_ICU)
1210 if (strcmp(dblocale, src_locale) != 0)
1212 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1213 errmsg(
"new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)",
1214 dblocale, src_locale),
1215 errhint(
"Use the same ICU locale as in the template database, or use template0 as template.")));
1220 val2 = src_icurules;
1223 if (strcmp(val1, val2) != 0)
1225 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1226 errmsg(
"new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)",
1228 errhint(
"Use the same ICU collation rules as in the template database, or use template0 as template.")));
1244 if (src_collversion && !collversionEl)
1246 char *actual_versionstr;
1249 if (dblocprovider == COLLPROVIDER_LIBC)
1255 if (!actual_versionstr)
1257 (
errmsg(
"template database \"%s\" has a collation version, but no actual collation version could be determined",
1260 if (strcmp(actual_versionstr, src_collversion) != 0)
1262 (
errmsg(
"template database \"%s\" has a collation version mismatch",
1264 errdetail(
"The template database was created using collation version %s, "
1265 "but the operating system provides version %s.",
1266 src_collversion, actual_versionstr),
1267 errhint(
"Rebuild all objects in the template database that use the default collation and run "
1268 "ALTER DATABASE %s REFRESH COLLATION VERSION, "
1269 "or build PostgreSQL with the right library version.",
1273 if (dbcollversion == NULL)
1274 dbcollversion = src_collversion;
1281 if (dbcollversion == NULL)
1285 if (dblocprovider == COLLPROVIDER_LIBC)
1294 if (tablespacenameEl && tablespacenameEl->
arg)
1296 char *tablespacename;
1309 if (dst_deftablespace == GLOBALTABLESPACE_OID)
1311 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1312 errmsg(
"pg_global cannot be used as default tablespace")));
1326 if (dst_deftablespace != src_deftablespace)
1333 if (
stat(srcpath, &st) == 0 &&
1337 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1338 errmsg(
"cannot assign new default tablespace \"%s\"",
1340 errdetail(
"There is a conflict because database \"%s\" already has some tables in this tablespace.",
1348 dst_deftablespace = src_deftablespace;
1357#ifdef ENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS
1359 elog(
WARNING,
"databases created by regression test cases should have names including \"regression\"");
1369 (
errcode(ERRCODE_DUPLICATE_DATABASE),
1383 (
errcode(ERRCODE_OBJECT_IN_USE),
1384 errmsg(
"source database \"%s\" is being accessed by other users",
1403 if (existing_dbname != NULL)
1405 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
1406 errmsg(
"database OID %u is already in use by database \"%s\"",
1407 dboid, existing_dbname));
1411 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
1412 errmsg(
"data directory with the specified OID %u already exists", dboid));
1420 Anum_pg_database_oid);
1430 Assert((dblocprovider != COLLPROVIDER_LIBC && dblocale) ||
1431 (dblocprovider == COLLPROVIDER_LIBC && !dblocale));
1435 new_record[Anum_pg_database_datname - 1] =
1439 new_record[Anum_pg_database_datlocprovider - 1] =
CharGetDatum(dblocprovider);
1440 new_record[Anum_pg_database_datistemplate - 1] =
BoolGetDatum(dbistemplate);
1441 new_record[Anum_pg_database_datallowconn - 1] =
BoolGetDatum(dballowconnections);
1442 new_record[Anum_pg_database_dathasloginevt - 1] =
BoolGetDatum(src_hasloginevt);
1443 new_record[Anum_pg_database_datconnlimit - 1] =
Int32GetDatum(dbconnlimit);
1446 new_record[Anum_pg_database_dattablespace - 1] =
ObjectIdGetDatum(dst_deftablespace);
1452 new_record_nulls[Anum_pg_database_datlocale - 1] =
true;
1456 new_record_nulls[Anum_pg_database_daticurules - 1] =
true;
1460 new_record_nulls[Anum_pg_database_datcollversion - 1] =
true;
1467 new_record_nulls[Anum_pg_database_datacl - 1] =
true;
1470 new_record, new_record_nulls);
1576 if (!(ctype_encoding ==
encoding ||
1578 ctype_encoding == -1 ||
1584 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1585 errmsg(
"encoding \"%s\" does not match locale \"%s\"",
1588 errdetail(
"The chosen LC_CTYPE setting requires encoding \"%s\".",
1591 if (!(collate_encoding ==
encoding ||
1593 collate_encoding == -1 ||
1599 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1600 errmsg(
"encoding \"%s\" does not match locale \"%s\"",
1603 errdetail(
"The chosen LC_COLLATE setting requires encoding \"%s\".",
1655 void *inplace_state;
1673 &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
1678 (
errcode(ERRCODE_UNDEFINED_DATABASE),
1686 (
errmsg(
"database \"%s\" does not exist, skipping",
1709 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1710 errmsg(
"cannot drop a template database")));
1715 (
errcode(ERRCODE_OBJECT_IN_USE),
1716 errmsg(
"cannot drop the currently open database")));
1728 (
errcode(ERRCODE_OBJECT_IN_USE),
1729 errmsg(
"database \"%s\" is used by an active logical replication slot",
1732 "There are %d active slots.",
1733 nslots_active, nslots_active)));
1744 (
errcode(ERRCODE_OBJECT_IN_USE),
1745 errmsg(
"database \"%s\" is being used by logical replication subscription",
1748 "There are %d subscriptions.",
1749 nsubscriptions, nsubscriptions)));
1767 (
errcode(ERRCODE_OBJECT_IN_USE),
1768 errmsg(
"database \"%s\" is being accessed by other users",
1805 Anum_pg_database_datname,
1809 NULL, 1, &scankey, &tup, &inplace_state);
1811 elog(
ERROR,
"cache lookup failed for database %u", db_id);
1894 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
1896 (
errcode(ERRCODE_UNDEFINED_DATABASE),
1897 errmsg(
"database \"%s\" does not exist", oldname)));
1907 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1908 errmsg(
"permission denied to rename database")));
1914#ifdef ENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS
1915 if (strstr(newname,
"regression") == NULL)
1916 elog(
WARNING,
"databases created by regression test cases should have names including \"regression\"");
1925 (
errcode(ERRCODE_DUPLICATE_DATABASE),
1926 errmsg(
"database \"%s\" already exists", newname)));
1936 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1937 errmsg(
"current database cannot be renamed")));
1947 (
errcode(ERRCODE_OBJECT_IN_USE),
1948 errmsg(
"database \"%s\" is being accessed by other users",
1955 elog(
ERROR,
"cache lookup failed for database %u", db_id);
2006 NULL, NULL, NULL, NULL, &src_tblspcoid, NULL, NULL, NULL, NULL, NULL, NULL))
2008 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2032 (
errcode(ERRCODE_OBJECT_IN_USE),
2033 errmsg(
"cannot change the tablespace of the currently open database")));
2052 if (dst_tblspcoid == GLOBALTABLESPACE_OID)
2054 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2055 errmsg(
"pg_global cannot be used as default tablespace")));
2060 if (src_tblspcoid == dst_tblspcoid)
2076 (
errcode(ERRCODE_OBJECT_IN_USE),
2077 errmsg(
"database \"%s\" is being accessed by other users",
2131 while ((xlde =
ReadDir(dstdir, dst_dbpath)) != NULL)
2133 if (strcmp(xlde->
d_name,
".") == 0 ||
2134 strcmp(xlde->
d_name,
"..") == 0)
2138 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
2139 errmsg(
"some relations of database \"%s\" are already in tablespace \"%s\"",
2141 errhint(
"You must move them back to the database's default tablespace before using this command.")));
2150 if (rmdir(dst_dbpath) != 0)
2151 elog(
ERROR,
"could not remove directory \"%s\": %m",
2166 Datum new_record[Natts_pg_database] = {0};
2167 bool new_record_nulls[Natts_pg_database] = {0};
2168 bool new_record_repl[Natts_pg_database] = {0};
2173 copydir(src_dbpath, dst_dbpath,
false);
2181 xlrec.
db_id = db_id;
2198 Anum_pg_database_datname,
2206 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2210 new_record[Anum_pg_database_dattablespace - 1] =
ObjectIdGetDatum(dst_tblspcoid);
2211 new_record_repl[Anum_pg_database_dattablespace - 1] =
true;
2215 new_record_nulls, new_record_repl);
2268 if (!
rmtree(src_dbpath,
true))
2270 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
2279 xlrec.
db_id = db_id;
2322 foreach(lc,
stmt->options)
2326 if (strcmp(opt->
defname,
"force") == 0)
2330 (
errcode(ERRCODE_SYNTAX_ERROR),
2331 errmsg(
"unrecognized DROP DATABASE option \"%s\"", opt->
defname),
2352 bool dbistemplate =
false;
2353 bool dballowconnections =
true;
2356 DefElem *dallowconnections = NULL;
2359 Datum new_record[Natts_pg_database] = {0};
2360 bool new_record_nulls[Natts_pg_database] = {0};
2361 bool new_record_repl[Natts_pg_database] = {0};
2368 if (strcmp(defel->
defname,
"is_template") == 0)
2372 distemplate = defel;
2374 else if (strcmp(defel->
defname,
"allow_connections") == 0)
2376 if (dallowconnections)
2378 dallowconnections = defel;
2380 else if (strcmp(defel->
defname,
"connection_limit") == 0)
2386 else if (strcmp(defel->
defname,
"tablespace") == 0)
2390 dtablespace = defel;
2394 (
errcode(ERRCODE_SYNTAX_ERROR),
2408 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2409 errmsg(
"option \"%s\" cannot be specified with other options",
2418 if (distemplate && distemplate->
arg)
2420 if (dallowconnections && dallowconnections->
arg)
2422 if (dconnlimit && dconnlimit->
arg)
2427 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2428 errmsg(
"invalid connection limit: %d", dbconnlimit)));
2438 Anum_pg_database_datname,
2446 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2447 errmsg(
"database \"%s\" does not exist",
stmt->dbname)));
2451 dboid = datform->oid;
2456 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
2457 errmsg(
"cannot alter invalid database \"%s\"",
stmt->dbname),
2458 errhint(
"Use DROP DATABASE to drop invalid databases."));
2473 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2474 errmsg(
"cannot disallow connections for current database")));
2481 new_record[Anum_pg_database_datistemplate - 1] =
BoolGetDatum(dbistemplate);
2482 new_record_repl[Anum_pg_database_datistemplate - 1] =
true;
2484 if (dallowconnections)
2486 new_record[Anum_pg_database_datallowconn - 1] =
BoolGetDatum(dballowconnections);
2487 new_record_repl[Anum_pg_database_datallowconn - 1] =
true;
2491 new_record[Anum_pg_database_datconnlimit - 1] =
Int32GetDatum(dbconnlimit);
2492 new_record_repl[Anum_pg_database_datconnlimit - 1] =
true;
2496 new_record_nulls, new_record_repl);
2531 Anum_pg_database_datname,
2539 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2540 errmsg(
"database \"%s\" does not exist",
stmt->dbname)));
2543 db_id = datForm->oid;
2553 if (datForm->datlocprovider == COLLPROVIDER_LIBC)
2557 elog(
ERROR,
"unexpected null in pg_database");
2563 elog(
ERROR,
"unexpected null in pg_database");
2570 if ((!oldversion && newversion) || (oldversion && !newversion))
2571 elog(
ERROR,
"invalid collation version change");
2572 else if (oldversion && newversion && strcmp(newversion, oldversion) != 0)
2574 bool nulls[Natts_pg_database] = {0};
2575 bool replaces[Natts_pg_database] = {0};
2580 (
errmsg(
"changing version from %s to %s",
2581 oldversion, newversion)));
2584 replaces[Anum_pg_database_datcollversion - 1] =
true;
2587 values, nulls, replaces);
2593 (
errmsg(
"version has not changed")));
2655 Anum_pg_database_datname,
2663 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2667 db_id = datForm->oid;
2674 if (datForm->datdba != newOwnerId)
2676 Datum repl_val[Natts_pg_database];
2677 bool repl_null[Natts_pg_database] = {0};
2678 bool repl_repl[Natts_pg_database] = {0};
2703 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2704 errmsg(
"permission denied to change owner of database")));
2708 repl_repl[Anum_pg_database_datdba - 1] =
true;
2716 Anum_pg_database_datacl,
2722 datForm->datdba, newOwnerId);
2723 repl_repl[Anum_pg_database_datacl - 1] =
true;
2762 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2763 errmsg(
"database with OID %u does not exist", dbid)));
2796 Oid *dbIdP,
Oid *ownerIdP,
2797 int *encodingP,
bool *dbIsTemplateP,
bool *dbAllowConnP,
bool *dbHasLoginEvtP,
2799 Oid *dbTablespace,
char **dbCollate,
char **dbCtype,
char **dbLocale,
2801 char *dbLocProvider,
2802 char **dbCollversion)
2804 bool result =
false;
2829 Anum_pg_database_datname,
2875 *ownerIdP = dbform->datdba;
2878 *encodingP = dbform->encoding;
2881 *dbIsTemplateP = dbform->datistemplate;
2884 *dbHasLoginEvtP = dbform->dathasloginevt;
2887 *dbAllowConnP = dbform->datallowconn;
2890 *dbFrozenXidP = dbform->datfrozenxid;
2893 *dbMinMultiP = dbform->datminmxid;
2896 *dbTablespace = dbform->dattablespace;
2899 *dbLocProvider = dbform->datlocprovider;
2912 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datlocale, &isnull);
2920 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_daticurules, &isnull);
2928 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datcollversion, &isnull);
2930 *dbCollversion = NULL;
2955 bool result =
false;
2987 Oid *tablespace_ids;
2994 Oid dsttablespace = spcform->oid;
2999 if (dsttablespace == GLOBALTABLESPACE_OID)
3013 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
3028 tablespace_ids = (
Oid *)
palloc(ntblspc *
sizeof(
Oid));
3030 foreach(cell, ltblspc)
3037 xlrec.
db_id = db_id;
3049 pfree(tablespace_ids);
3070 bool result =
false;
3080 Oid dsttablespace = spcform->oid;
3085 if (dsttablespace == GLOBALTABLESPACE_OID)
3113 if (notherbackends > 0 && npreparedxacts > 0)
3119 errdetail(
"There are %d other session(s) and %d prepared transaction(s) using the database.",
3120 notherbackends, npreparedxacts);
3121 else if (notherbackends > 0)
3123 "There are %d other sessions using the database.",
3128 "There are %d prepared transactions using the database.",
3155 Anum_pg_database_datname,
3174 (
errcode(ERRCODE_UNDEFINED_DATABASE),
3175 errmsg(
"database \"%s\" does not exist",
3230 elog(
ERROR,
"cache lookup failed for database %u", dboid);
3261 if (
stat(path, &st) == 0)
3265 elog(
PANIC,
"requested to created invalid directory: %s", path);
3269 errmsg(
"missing directory \"%s\"", path));
3272 "creating missing directory: %s", path);
3276 errmsg(
"could not create missing directory \"%s\": %m", path));
3310 if (!
rmtree(dst_path,
true))
3313 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
3321 parent_path =
pstrdup(dst_path);
3323 if (
stat(parent_path, &st) < 0)
3325 if (errno != ENOENT)
3327 errmsg(
"could not stat directory \"%s\": %m",
3341 if (
stat(src_path, &st) < 0 && errno == ENOENT)
3358 copydir(src_path, dst_path,
false);
3373 parent_path =
pstrdup(dbpath);
3424 if (!
rmtree(dst_path,
true))
3426 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
3444 elog(
PANIC,
"dbase_redo: unknown op code %u", info);
Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
Oid get_role_oid(const char *rolname, bool missing_ok)
void check_can_set_role(Oid member, Oid role)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
bool directory_is_empty(const char *path)
Oid get_tablespace_oid(const char *tablespacename, bool missing_ok)
bool allow_in_place_tablespaces
static Datum values[MAXATTR]
void DropDatabaseBuffers(Oid dbid)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void CreateAndCopyRelationData(RelFileLocator src_rlocator, RelFileLocator dst_rlocator, bool permanent)
void UnlockReleaseBuffer(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool permanent)
void FlushDatabaseBuffers(Oid dbid)
#define BUFFER_LOCK_SHARE
static Page BufferGetPage(Buffer buffer)
static bool PageIsEmpty(const PageData *page)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static bool PageIsNew(const PageData *page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define CStringGetTextDatum(s)
#define TextDatumGetCString(d)
TransactionId MultiXactId
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
void RequestCheckpoint(int flags)
void copydir(const char *fromdir, const char *todir, bool recurse)
static void remove_dbtablespaces(Oid db_id)
static void CreateDirAndVersionFile(char *dbpath, Oid dbid, Oid tsid, bool isRedo)
ObjectAddress AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt)
bool have_createdb_privilege(void)
ObjectAddress RenameDatabase(const char *oldname, const char *newname)
Oid get_database_oid(const char *dbname, bool missing_ok)
static void movedb_failure_callback(int code, Datum arg)
static void CreateDatabaseUsingWalLog(Oid src_dboid, Oid dst_dboid, Oid src_tsid, Oid dst_tsid)
static List * ScanSourceDatabasePgClass(Oid tbid, Oid dbid, char *srcpath)
static void recovery_create_dbdir(char *path, bool only_tblspc)
char * get_database_name(Oid dbid)
ObjectAddress AlterDatabaseOwner(const char *dbname, Oid newOwnerId)
bool database_is_invalid_form(Form_pg_database datform)
Datum pg_database_collation_actual_version(PG_FUNCTION_ARGS)
static void movedb(const char *dbname, const char *tblspcname)
static List * ScanSourceDatabasePgClassPage(Page page, Buffer buf, Oid tbid, Oid dbid, char *srcpath, List *rlocatorlist, Snapshot snapshot)
void check_encoding_locale_matches(int encoding, const char *collate, const char *ctype)
Oid createdb(ParseState *pstate, const CreatedbStmt *stmt)
Oid AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel)
static int errdetail_busy_db(int notherbackends, int npreparedxacts)
static CreateDBRelInfo * ScanSourceDatabasePgClassTuple(HeapTupleData *tuple, Oid tbid, Oid dbid, char *srcpath)
static bool check_db_file_conflict(Oid db_id)
struct CreateDBRelInfo CreateDBRelInfo
void dbase_redo(XLogReaderState *record)
static void CreateDatabaseUsingFileCopy(Oid src_dboid, Oid dst_dboid, Oid src_tsid, Oid dst_tsid)
void DropDatabase(ParseState *pstate, DropdbStmt *stmt)
void dropdb(const char *dbname, bool missing_ok, bool force)
Oid AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, bool *dbHasLoginEvtP, TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbLocale, char **dbIcurules, char *dbLocProvider, char **dbCollversion)
static void createdb_failure_callback(int code, Datum arg)
bool database_is_invalid_oid(Oid dboid)
#define XLOG_DBASE_CREATE_WAL_LOG
#define MinSizeOfDbaseDropRec
#define XLOG_DBASE_CREATE_FILE_COPY
int32 defGetInt32(DefElem *def)
char * defGetString(DefElem *def)
bool defGetBoolean(DefElem *def)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
Oid defGetObjectId(DefElem *def)
int errcode_for_file_access(void)
int errdetail(const char *fmt,...)
int errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool is_encoding_supported_by_icu(int encoding)
int MakePGDirectory(const char *directoryName)
int CloseTransientFile(int fd)
void fsync_fname(const char *fname, bool isdir)
int data_sync_elevel(int elevel)
DIR * AllocateDir(const char *dirname)
struct dirent * ReadDir(DIR *dir, const char *dirname)
int OpenTransientFile(const char *fileName, int fileFlags)
static char dstpath[MAXPGPATH]
#define DirectFunctionCall1(func, arg1)
#define PG_RETURN_TEXT_P(x)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
void systable_endscan(SysScanDesc sysscan)
void systable_inplace_update_begin(Relation relation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, const ScanKeyData *key, HeapTuple *oldtupcopy, void **state)
void systable_inplace_update_finish(void *state, HeapTuple tuple)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
bool allowSystemTableMods
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
bool HeapTupleSatisfiesVisibility(HeapTuple htup, Snapshot snapshot, Buffer buffer)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
HeapTupleHeaderData * HeapTupleHeader
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
invalidindex index d is invalid
#define ItemIdGetLength(itemId)
#define ItemIdIsNormal(itemId)
#define ItemIdIsDead(itemId)
#define ItemIdIsUsed(itemId)
#define ItemIdIsRedirected(itemId)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
void list_free_deep(List *list)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode)
void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void LockRelationId(LockRelId *relid, LOCKMODE lockmode)
void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
#define AccessExclusiveLock
#define InplaceUpdateTupleLock
char * pstrdup(const char *in)
void pfree(void *pointer)
void ForgetDatabaseSyncRequests(Oid dbid)
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define END_CRIT_SECTION()
#define InvalidMultiXactId
void namestrcpy(Name name, const char *str)
Datum namein(PG_FUNCTION_ARGS)
#define IsA(nodeptr, _type_)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define InvokeObjectDropHook(classId, objectId, subId)
#define ObjectAddressSet(addr, class_id, object_id)
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
int parser_errposition(ParseState *pstate, int location)
FormData_pg_authid * Form_pg_authid
FormData_pg_class * Form_pg_class
FormData_pg_database * Form_pg_database
#define DATCONNLIMIT_INVALID_DB
#define DATCONNLIMIT_UNLIMITED
void DropSetting(Oid databaseid, Oid roleid)
void AlterSetting(Oid databaseid, Oid roleid, VariableSetStmt *setstmt)
static int list_length(const List *l)
void icu_validate_locale(const char *loc_str)
char * get_collation_actual_version(char collprovider, const char *collcollate)
char * icu_language_tag(const char *loc_str, int elevel)
const char * builtin_validate_locale(int encoding, const char *locale)
bool check_locale(int category, const char *locale, char **canonname)
void dropDatabaseDependencies(Oid databaseId)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void copyTemplateDependencies(Oid templateDbId, Oid newDbId)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
void shdepLockAndCheckObject(Oid classId, Oid objectId)
int CountDBSubscriptions(Oid dbid)
FormData_pg_tablespace * Form_pg_tablespace
#define PG_VALID_BE_ENCODING(_enc)
#define pg_encoding_to_char
#define pg_valid_server_encoding
void pgstat_drop_database(Oid databaseid)
int pg_mkdir_p(char *path, int omode)
int pg_strcasecmp(const char *s1, const char *s2)
void get_parent_directory(char *path)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
static Datum PointerGetDatum(const void *X)
static Datum TransactionIdGetDatum(TransactionId X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
static int fd(const char *x, int i)
void TerminateOtherDBBackends(Oid databaseId)
bool CountOtherDBBackends(Oid databaseId, int *nbackends, int *nprepared)
#define INVALID_PROC_NUMBER
void WaitForProcSignalBarrier(uint64 generation)
uint64 EmitProcSignalBarrier(ProcSignalBarrierType type)
@ PROCSIGNAL_BARRIER_SMGRRELEASE
#define RelationGetDescr(relation)
RelFileNumber RelationMapOidToFilenumberForDatabase(char *dbpath, Oid relationId)
void RelationMapCopy(Oid dbid, Oid tsid, char *srcdbpath, char *dstdbpath)
char * GetDatabasePath(Oid dbOid, Oid spcOid)
#define PG_TBLSPC_DIR_SLASH
#define InvalidRelFileNumber
#define RelFileNumberIsValid(relnumber)
bool rmtree(const char *path, bool rmtopdir)
const char * quote_identifier(const char *ident)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void DeleteSharedSecurityLabel(Oid objectId, Oid classId)
bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive)
void ReplicationSlotsDropDBSlots(Oid dboid)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
void smgrclose(SMgrRelation reln)
Snapshot GetLatestSnapshot(void)
void UnregisterSnapshot(Snapshot snapshot)
Snapshot RegisterSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
void ResolveRecoveryConflictWithDatabase(Oid dbid)
#define BTEqualStrategyNumber
CreateDBStrategy strategy
Oid tablespace_ids[FLEXIBLE_ARRAY_MEMBER]
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCacheLockedCopy1(int cacheId, Datum key1)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
#define InvalidTransactionId
#define FirstNormalObjectId
text * cstring_to_text(const char *s)
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
void StartTransactionCommand(void)
void ForceSyncCommit(void)
void CommitTransactionCommand(void)
bool RecoveryInProgress(void)
XLogRecPtr XactLastRecEnd
void XLogFlush(XLogRecPtr record)
#define CHECKPOINT_FLUSH_ALL
#define CHECKPOINT_IMMEDIATE
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogBeginInsert(void)
#define XLogRecGetInfo(decoder)
#define XLogRecGetData(decoder)
#define XLogRecHasAnyBlockRefs(decoder)
#define XLR_SPECIAL_REL_UPDATE
void XLogDropDatabase(Oid dbid)