66 #include "utils/fmgroids.h"
114 static 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,
329 char *srcpath,
List *rlocatorlist,
375 rlocatorlist =
lappend(rlocatorlist, relinfo);
411 if (classForm->reltablespace == GLOBALTABLESPACE_OID ||
412 !RELKIND_HAS_STORAGE(classForm->relkind) ||
413 classForm->relpersistence == RELPERSISTENCE_TEMP)
421 relfilenumber = classForm->relfilenode;
428 elog(
ERROR,
"relation with OID %u does not have a valid relfilenumber",
440 relinfo->
reloid = classForm->oid;
443 Assert(classForm->relpersistence != RELPERSISTENCE_TEMP);
445 (classForm->relpersistence == RELPERSISTENCE_PERMANENT) ?
true :
false;
468 nbytes = strlen(PG_MAJORVERSION) + 1;
474 if (errno != EEXIST || !isRedo)
477 errmsg(
"could not create directory \"%s\": %m", dbpath)));
485 snprintf(versionfile,
sizeof(versionfile),
"%s/%s", dbpath,
"PG_VERSION");
488 if (
fd < 0 && errno == EEXIST && isRedo)
494 errmsg(
"could not create file \"%s\": %m", versionfile)));
506 errmsg(
"could not write to file \"%s\": %m", versionfile)));
514 errmsg(
"could not fsync file \"%s\": %m", versionfile)));
579 Oid srctablespace = spaceform->oid;
586 if (srctablespace == GLOBALTABLESPACE_OID)
599 if (srctablespace == src_tsid)
600 dsttablespace = dst_tsid;
602 dsttablespace = srctablespace;
617 xlrec.
db_id = dst_dboid;
674 int src_encoding = -1;
675 char *src_collate = NULL;
676 char *src_ctype = NULL;
677 char *src_locale = NULL;
678 char *src_icurules = NULL;
679 char src_locprovider =
'\0';
680 char *src_collversion = NULL;
682 bool src_hasloginevt =
false;
686 Oid src_deftablespace;
687 volatile Oid dst_deftablespace;
690 Datum new_record[Natts_pg_database] = {0};
691 bool new_record_nulls[Natts_pg_database] = {0};
695 DefElem *dtablespacename = NULL;
700 DefElem *dbuiltinlocale = NULL;
707 DefElem *dallowconnections = NULL;
712 char *dbowner = NULL;
713 const char *dbtemplate = NULL;
714 char *dbcollate = NULL;
715 char *dbctype = NULL;
716 const char *dblocale = NULL;
717 char *dbicurules = NULL;
718 char dblocprovider =
'\0';
721 bool dbistemplate =
false;
722 bool dballowconnections =
true;
724 char *dbcollversion = NULL;
735 if (strcmp(defel->
defname,
"tablespace") == 0)
739 dtablespacename = defel;
741 else if (strcmp(defel->
defname,
"owner") == 0)
747 else if (strcmp(defel->
defname,
"template") == 0)
753 else if (strcmp(defel->
defname,
"encoding") == 0)
759 else if (strcmp(defel->
defname,
"locale") == 0)
765 else if (strcmp(defel->
defname,
"builtin_locale") == 0)
769 dbuiltinlocale = defel;
771 else if (strcmp(defel->
defname,
"lc_collate") == 0)
777 else if (strcmp(defel->
defname,
"lc_ctype") == 0)
783 else if (strcmp(defel->
defname,
"icu_locale") == 0)
789 else if (strcmp(defel->
defname,
"icu_rules") == 0)
795 else if (strcmp(defel->
defname,
"locale_provider") == 0)
799 dlocprovider = defel;
801 else if (strcmp(defel->
defname,
"is_template") == 0)
807 else if (strcmp(defel->
defname,
"allow_connections") == 0)
809 if (dallowconnections)
811 dallowconnections = defel;
813 else if (strcmp(defel->
defname,
"connection_limit") == 0)
819 else if (strcmp(defel->
defname,
"collation_version") == 0)
823 dcollversion = defel;
825 else if (strcmp(defel->
defname,
"location") == 0)
828 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
829 errmsg(
"LOCATION is not supported anymore"),
830 errhint(
"Consider using tablespaces instead."),
833 else if (strcmp(defel->
defname,
"oid") == 0)
854 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
857 else if (strcmp(defel->
defname,
"strategy") == 0)
865 (
errcode(ERRCODE_SYNTAX_ERROR),
870 if (downer && downer->
arg)
872 if (dtemplate && dtemplate->
arg)
874 if (dencoding && dencoding->
arg)
876 const char *encoding_name;
882 if (strcmp(encoding_name,
"") == 0 ||
885 (
errcode(ERRCODE_UNDEFINED_OBJECT),
886 errmsg(
"%d is not a valid encoding code",
896 (
errcode(ERRCODE_UNDEFINED_OBJECT),
897 errmsg(
"%s is not a valid encoding name",
902 if (dlocale && dlocale->
arg)
908 if (dbuiltinlocale && dbuiltinlocale->
arg)
910 if (dcollate && dcollate->
arg)
912 if (dctype && dctype->
arg)
914 if (diculocale && diculocale->
arg)
916 if (dicurules && dicurules->
arg)
918 if (dlocprovider && dlocprovider->
arg)
923 dblocprovider = COLLPROVIDER_BUILTIN;
925 dblocprovider = COLLPROVIDER_ICU;
927 dblocprovider = COLLPROVIDER_LIBC;
930 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
931 errmsg(
"unrecognized locale provider: %s",
934 if (distemplate && distemplate->
arg)
936 if (dallowconnections && dallowconnections->
arg)
938 if (dconnlimit && dconnlimit->
arg)
943 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
944 errmsg(
"invalid connection limit: %d", dbconnlimit)));
964 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
965 errmsg(
"permission denied to create database")));
979 dbtemplate =
"template1";
982 &src_dboid, &src_owner, &src_encoding,
983 &src_istemplate, &src_allowconn, &src_hasloginevt,
984 &src_frozenxid, &src_minmxid, &src_deftablespace,
985 &src_collate, &src_ctype, &src_locale, &src_icurules, &src_locprovider,
988 (
errcode(ERRCODE_UNDEFINED_DATABASE),
989 errmsg(
"template database \"%s\" does not exist",
998 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
999 errmsg(
"cannot use invalid database \"%s\" as template", dbtemplate),
1000 errhint(
"Use DROP DATABASE to drop invalid databases."));
1006 if (!src_istemplate)
1010 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1011 errmsg(
"permission denied to copy database \"%s\"",
1016 if (dstrategy && dstrategy->
arg)
1021 if (strcmp(strategy,
"wal_log") == 0)
1023 else if (strcmp(strategy,
"file_copy") == 0)
1027 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1028 errmsg(
"invalid create database strategy \"%s\"", strategy),
1029 errhint(
"Valid strategies are \"wal_log\", and \"file_copy\".")));
1035 if (dbcollate == NULL)
1036 dbcollate = src_collate;
1037 if (dbctype == NULL)
1038 dbctype = src_ctype;
1039 if (dblocprovider ==
'\0')
1040 dblocprovider = src_locprovider;
1041 if (dblocale == NULL)
1042 dblocale = src_locale;
1043 if (dbicurules == NULL)
1044 dbicurules = src_icurules;
1049 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1055 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1056 errmsg(
"invalid LC_COLLATE locale name: \"%s\"", dbcollate),
1057 errhint(
"If the locale name is specific to ICU, use ICU_LOCALE.")));
1058 dbcollate = canonname;
1061 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1062 errmsg(
"invalid LC_CTYPE locale name: \"%s\"", dbctype),
1063 errhint(
"If the locale name is specific to ICU, use ICU_LOCALE.")));
1064 dbctype = canonname;
1069 if (dblocprovider != COLLPROVIDER_BUILTIN)
1073 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1074 errmsg(
"BUILTIN_LOCALE cannot be specified unless locale provider is builtin")));
1076 else if (dblocprovider != COLLPROVIDER_ICU)
1080 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1081 errmsg(
"ICU locale cannot be specified unless locale provider is ICU")));
1085 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1086 errmsg(
"ICU rules cannot be specified unless locale provider is ICU")));
1090 if (dblocprovider == COLLPROVIDER_BUILTIN)
1098 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1099 errmsg(
"LOCALE or BUILTIN_LOCALE must be specified")));
1103 else if (dblocprovider == COLLPROVIDER_ICU)
1107 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1108 errmsg(
"encoding \"%s\" is not supported with ICU provider",
1117 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1118 errmsg(
"LOCALE or ICU_LOCALE must be specified")));
1130 if (langtag && strcmp(dblocale, langtag) != 0)
1133 (
errmsg(
"using standard form \"%s\" for ICU locale \"%s\"",
1134 langtag, dblocale)));
1144 if (dblocprovider == COLLPROVIDER_LIBC)
1157 if (strcmp(dbtemplate,
"template0") != 0)
1161 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1162 errmsg(
"new encoding (%s) is incompatible with the encoding of the template database (%s)",
1165 errhint(
"Use the same encoding as in the template database, or use template0 as template.")));
1167 if (strcmp(dbcollate, src_collate) != 0)
1169 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1170 errmsg(
"new collation (%s) is incompatible with the collation of the template database (%s)",
1171 dbcollate, src_collate),
1172 errhint(
"Use the same collation as in the template database, or use template0 as template.")));
1174 if (strcmp(dbctype, src_ctype) != 0)
1176 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1177 errmsg(
"new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)",
1178 dbctype, src_ctype),
1179 errhint(
"Use the same LC_CTYPE as in the template database, or use template0 as template.")));
1181 if (dblocprovider != src_locprovider)
1183 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1184 errmsg(
"new locale provider (%s) does not match locale provider of the template database (%s)",
1185 collprovider_name(dblocprovider), collprovider_name(src_locprovider)),
1186 errhint(
"Use the same locale provider as in the template database, or use template0 as template.")));
1188 if (dblocprovider == COLLPROVIDER_ICU)
1195 if (strcmp(dblocale, src_locale) != 0)
1197 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1198 errmsg(
"new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)",
1199 dblocale, src_locale),
1200 errhint(
"Use the same ICU locale as in the template database, or use template0 as template.")));
1205 val2 = src_icurules;
1208 if (strcmp(val1, val2) != 0)
1210 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1211 errmsg(
"new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)",
1213 errhint(
"Use the same ICU collation rules as in the template database, or use template0 as template.")));
1229 if (src_collversion && !dcollversion)
1231 char *actual_versionstr;
1234 if (dblocprovider == COLLPROVIDER_LIBC)
1240 if (!actual_versionstr)
1242 (
errmsg(
"template database \"%s\" has a collation version, but no actual collation version could be determined",
1245 if (strcmp(actual_versionstr, src_collversion) != 0)
1247 (
errmsg(
"template database \"%s\" has a collation version mismatch",
1249 errdetail(
"The template database was created using collation version %s, "
1250 "but the operating system provides version %s.",
1251 src_collversion, actual_versionstr),
1252 errhint(
"Rebuild all objects in the template database that use the default collation and run "
1253 "ALTER DATABASE %s REFRESH COLLATION VERSION, "
1254 "or build PostgreSQL with the right library version.",
1258 if (dbcollversion == NULL)
1259 dbcollversion = src_collversion;
1266 if (dbcollversion == NULL)
1270 if (dblocprovider == COLLPROVIDER_LIBC)
1279 if (dtablespacename && dtablespacename->
arg)
1281 char *tablespacename;
1294 if (dst_deftablespace == GLOBALTABLESPACE_OID)
1296 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1297 errmsg(
"pg_global cannot be used as default tablespace")));
1311 if (dst_deftablespace != src_deftablespace)
1318 if (
stat(srcpath, &st) == 0 &&
1322 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1323 errmsg(
"cannot assign new default tablespace \"%s\"",
1325 errdetail(
"There is a conflict because database \"%s\" already has some tables in this tablespace.",
1333 dst_deftablespace = src_deftablespace;
1342 #ifdef ENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS
1344 elog(
WARNING,
"databases created by regression test cases should have names including \"regression\"");
1354 (
errcode(ERRCODE_DUPLICATE_DATABASE),
1368 (
errcode(ERRCODE_OBJECT_IN_USE),
1369 errmsg(
"source database \"%s\" is being accessed by other users",
1388 if (existing_dbname != NULL)
1390 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
1391 errmsg(
"database OID %u is already in use by database \"%s\"",
1392 dboid, existing_dbname));
1396 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE)),
1397 errmsg(
"data directory with the specified OID %u already exists", dboid));
1405 Anum_pg_database_oid);
1415 Assert((dblocprovider != COLLPROVIDER_LIBC && dblocale) ||
1416 (dblocprovider == COLLPROVIDER_LIBC && !dblocale));
1420 new_record[Anum_pg_database_datname - 1] =
1424 new_record[Anum_pg_database_datlocprovider - 1] =
CharGetDatum(dblocprovider);
1425 new_record[Anum_pg_database_datistemplate - 1] =
BoolGetDatum(dbistemplate);
1426 new_record[Anum_pg_database_datallowconn - 1] =
BoolGetDatum(dballowconnections);
1427 new_record[Anum_pg_database_dathasloginevt - 1] =
BoolGetDatum(src_hasloginevt);
1428 new_record[Anum_pg_database_datconnlimit - 1] =
Int32GetDatum(dbconnlimit);
1431 new_record[Anum_pg_database_dattablespace - 1] =
ObjectIdGetDatum(dst_deftablespace);
1437 new_record_nulls[Anum_pg_database_datlocale - 1] =
true;
1441 new_record_nulls[Anum_pg_database_daticurules - 1] =
true;
1445 new_record_nulls[Anum_pg_database_datcollversion - 1] =
true;
1452 new_record_nulls[Anum_pg_database_datacl - 1] =
true;
1455 new_record, new_record_nulls);
1561 if (!(ctype_encoding ==
encoding ||
1563 ctype_encoding == -1 ||
1569 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1570 errmsg(
"encoding \"%s\" does not match locale \"%s\"",
1573 errdetail(
"The chosen LC_CTYPE setting requires encoding \"%s\".",
1576 if (!(collate_encoding ==
encoding ||
1578 collate_encoding == -1 ||
1584 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1585 errmsg(
"encoding \"%s\" does not match locale \"%s\"",
1588 errdetail(
"The chosen LC_COLLATE setting requires encoding \"%s\".",
1656 &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
1661 (
errcode(ERRCODE_UNDEFINED_DATABASE),
1669 (
errmsg(
"database \"%s\" does not exist, skipping",
1692 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1693 errmsg(
"cannot drop a template database")));
1698 (
errcode(ERRCODE_OBJECT_IN_USE),
1699 errmsg(
"cannot drop the currently open database")));
1711 (
errcode(ERRCODE_OBJECT_IN_USE),
1712 errmsg(
"database \"%s\" is used by an active logical replication slot",
1715 "There are %d active slots.",
1716 nslots_active, nslots_active)));
1727 (
errcode(ERRCODE_OBJECT_IN_USE),
1728 errmsg(
"database \"%s\" is being used by logical replication subscription",
1731 "There are %d subscriptions.",
1732 nsubscriptions, nsubscriptions)));
1750 (
errcode(ERRCODE_OBJECT_IN_USE),
1751 errmsg(
"database \"%s\" is being accessed by other users",
1778 elog(
ERROR,
"cache lookup failed for database %u", db_id);
1871 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
1873 (
errcode(ERRCODE_UNDEFINED_DATABASE),
1874 errmsg(
"database \"%s\" does not exist", oldname)));
1884 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1885 errmsg(
"permission denied to rename database")));
1891 #ifdef ENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS
1892 if (strstr(newname,
"regression") == NULL)
1893 elog(
WARNING,
"databases created by regression test cases should have names including \"regression\"");
1902 (
errcode(ERRCODE_DUPLICATE_DATABASE),
1903 errmsg(
"database \"%s\" already exists", newname)));
1913 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1914 errmsg(
"current database cannot be renamed")));
1924 (
errcode(ERRCODE_OBJECT_IN_USE),
1925 errmsg(
"database \"%s\" is being accessed by other users",
1932 elog(
ERROR,
"cache lookup failed for database %u", db_id);
1981 NULL, NULL, NULL, NULL, &src_tblspcoid, NULL, NULL, NULL, NULL, NULL, NULL))
1983 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2007 (
errcode(ERRCODE_OBJECT_IN_USE),
2008 errmsg(
"cannot change the tablespace of the currently open database")));
2027 if (dst_tblspcoid == GLOBALTABLESPACE_OID)
2029 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2030 errmsg(
"pg_global cannot be used as default tablespace")));
2035 if (src_tblspcoid == dst_tblspcoid)
2051 (
errcode(ERRCODE_OBJECT_IN_USE),
2052 errmsg(
"database \"%s\" is being accessed by other users",
2106 while ((xlde =
ReadDir(dstdir, dst_dbpath)) != NULL)
2108 if (strcmp(xlde->
d_name,
".") == 0 ||
2109 strcmp(xlde->
d_name,
"..") == 0)
2113 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
2114 errmsg(
"some relations of database \"%s\" are already in tablespace \"%s\"",
2116 errhint(
"You must move them back to the database's default tablespace before using this command.")));
2125 if (rmdir(dst_dbpath) != 0)
2126 elog(
ERROR,
"could not remove directory \"%s\": %m",
2141 Datum new_record[Natts_pg_database] = {0};
2142 bool new_record_nulls[Natts_pg_database] = {0};
2143 bool new_record_repl[Natts_pg_database] = {0};
2148 copydir(src_dbpath, dst_dbpath,
false);
2156 xlrec.
db_id = db_id;
2173 Anum_pg_database_datname,
2181 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2184 new_record[Anum_pg_database_dattablespace - 1] =
ObjectIdGetDatum(dst_tblspcoid);
2185 new_record_repl[Anum_pg_database_dattablespace - 1] =
true;
2189 new_record_nulls, new_record_repl);
2241 if (!
rmtree(src_dbpath,
true))
2243 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
2252 xlrec.
db_id = db_id;
2295 foreach(lc,
stmt->options)
2299 if (strcmp(opt->
defname,
"force") == 0)
2303 (
errcode(ERRCODE_SYNTAX_ERROR),
2304 errmsg(
"unrecognized DROP DATABASE option \"%s\"", opt->
defname),
2325 bool dbistemplate =
false;
2326 bool dballowconnections =
true;
2329 DefElem *dallowconnections = NULL;
2332 Datum new_record[Natts_pg_database] = {0};
2333 bool new_record_nulls[Natts_pg_database] = {0};
2334 bool new_record_repl[Natts_pg_database] = {0};
2341 if (strcmp(defel->
defname,
"is_template") == 0)
2345 distemplate = defel;
2347 else if (strcmp(defel->
defname,
"allow_connections") == 0)
2349 if (dallowconnections)
2351 dallowconnections = defel;
2353 else if (strcmp(defel->
defname,
"connection_limit") == 0)
2359 else if (strcmp(defel->
defname,
"tablespace") == 0)
2363 dtablespace = defel;
2367 (
errcode(ERRCODE_SYNTAX_ERROR),
2381 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2382 errmsg(
"option \"%s\" cannot be specified with other options",
2391 if (distemplate && distemplate->
arg)
2393 if (dallowconnections && dallowconnections->
arg)
2395 if (dconnlimit && dconnlimit->
arg)
2400 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2401 errmsg(
"invalid connection limit: %d", dbconnlimit)));
2411 Anum_pg_database_datname,
2419 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2420 errmsg(
"database \"%s\" does not exist",
stmt->dbname)));
2423 dboid = datform->oid;
2428 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
2429 errmsg(
"cannot alter invalid database \"%s\"",
stmt->dbname),
2430 errhint(
"Use DROP DATABASE to drop invalid databases."));
2445 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2446 errmsg(
"cannot disallow connections for current database")));
2453 new_record[Anum_pg_database_datistemplate - 1] =
BoolGetDatum(dbistemplate);
2454 new_record_repl[Anum_pg_database_datistemplate - 1] =
true;
2456 if (dallowconnections)
2458 new_record[Anum_pg_database_datallowconn - 1] =
BoolGetDatum(dballowconnections);
2459 new_record_repl[Anum_pg_database_datallowconn - 1] =
true;
2463 new_record[Anum_pg_database_datconnlimit - 1] =
Int32GetDatum(dbconnlimit);
2464 new_record_repl[Anum_pg_database_datconnlimit - 1] =
true;
2468 new_record_nulls, new_record_repl);
2502 Anum_pg_database_datname,
2510 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2511 errmsg(
"database \"%s\" does not exist",
stmt->dbname)));
2514 db_id = datForm->oid;
2523 if (datForm->datlocprovider == COLLPROVIDER_LIBC)
2527 elog(
ERROR,
"unexpected null in pg_database");
2533 elog(
ERROR,
"unexpected null in pg_database");
2540 if ((!oldversion && newversion) || (oldversion && !newversion))
2541 elog(
ERROR,
"invalid collation version change");
2542 else if (oldversion && newversion && strcmp(newversion, oldversion) != 0)
2544 bool nulls[Natts_pg_database] = {0};
2545 bool replaces[Natts_pg_database] = {0};
2549 (
errmsg(
"changing version from %s to %s",
2550 oldversion, newversion)));
2553 replaces[Anum_pg_database_datcollversion - 1] =
true;
2556 values, nulls, replaces);
2562 (
errmsg(
"version has not changed")));
2623 Anum_pg_database_datname,
2631 (
errcode(ERRCODE_UNDEFINED_DATABASE),
2635 db_id = datForm->oid;
2642 if (datForm->datdba != newOwnerId)
2644 Datum repl_val[Natts_pg_database];
2645 bool repl_null[Natts_pg_database] = {0};
2646 bool repl_repl[Natts_pg_database] = {0};
2671 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2672 errmsg(
"permission denied to change owner of database")));
2674 repl_repl[Anum_pg_database_datdba - 1] =
true;
2682 Anum_pg_database_datacl,
2688 datForm->datdba, newOwnerId);
2689 repl_repl[Anum_pg_database_datacl - 1] =
true;
2727 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2728 errmsg(
"database with OID %u does not exist", dbid)));
2761 Oid *dbIdP,
Oid *ownerIdP,
2762 int *encodingP,
bool *dbIsTemplateP,
bool *dbAllowConnP,
bool *dbHasLoginEvtP,
2764 Oid *dbTablespace,
char **dbCollate,
char **dbCtype,
char **dbLocale,
2766 char *dbLocProvider,
2767 char **dbCollversion)
2769 bool result =
false;
2794 Anum_pg_database_datname,
2840 *ownerIdP = dbform->datdba;
2843 *encodingP = dbform->encoding;
2846 *dbIsTemplateP = dbform->datistemplate;
2849 *dbHasLoginEvtP = dbform->dathasloginevt;
2852 *dbAllowConnP = dbform->datallowconn;
2855 *dbFrozenXidP = dbform->datfrozenxid;
2858 *dbMinMultiP = dbform->datminmxid;
2861 *dbTablespace = dbform->dattablespace;
2864 *dbLocProvider = dbform->datlocprovider;
2877 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datlocale, &isnull);
2885 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_daticurules, &isnull);
2893 datum =
SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datcollversion, &isnull);
2895 *dbCollversion = NULL;
2920 bool result =
false;
2952 Oid *tablespace_ids;
2959 Oid dsttablespace = spcform->oid;
2964 if (dsttablespace == GLOBALTABLESPACE_OID)
2978 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
2993 tablespace_ids = (
Oid *)
palloc(ntblspc *
sizeof(
Oid));
2995 foreach(cell, ltblspc)
3002 xlrec.
db_id = db_id;
3014 pfree(tablespace_ids);
3035 bool result =
false;
3045 Oid dsttablespace = spcform->oid;
3050 if (dsttablespace == GLOBALTABLESPACE_OID)
3078 if (notherbackends > 0 && npreparedxacts > 0)
3084 errdetail(
"There are %d other session(s) and %d prepared transaction(s) using the database.",
3085 notherbackends, npreparedxacts);
3086 else if (notherbackends > 0)
3088 "There are %d other sessions using the database.",
3093 "There are %d prepared transactions using the database.",
3120 Anum_pg_database_datname,
3139 (
errcode(ERRCODE_UNDEFINED_DATABASE),
3140 errmsg(
"database \"%s\" does not exist",
3195 elog(
ERROR,
"cache lookup failed for database %u", dboid);
3226 if (
stat(path, &st) == 0)
3229 if (only_tblspc && strstr(path,
"pg_tblspc/") == NULL)
3230 elog(
PANIC,
"requested to created invalid directory: %s", path);
3234 errmsg(
"missing directory \"%s\"", path));
3237 "creating missing directory: %s", path);
3241 errmsg(
"could not create missing directory \"%s\": %m", path));
3275 if (!
rmtree(dst_path,
true))
3278 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
3286 parent_path =
pstrdup(dst_path);
3288 if (
stat(parent_path, &st) < 0)
3290 if (errno != ENOENT)
3292 errmsg(
"could not stat directory \"%s\": %m",
3306 if (
stat(src_path, &st) < 0 && errno == ENOENT)
3323 copydir(src_path, dst_path,
false);
3338 parent_path =
pstrdup(dbpath);
3389 if (!
rmtree(dst_path,
true))
3391 (
errmsg(
"some useless files may be left behind in old database directory \"%s\"",
3409 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(Page page)
static Item PageGetItem(Page page, ItemId itemId)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static bool PageIsNew(Page page)
static OffsetNumber PageGetMaxOffsetNumber(Page 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)
char * get_database_name(Oid dbid)
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)
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)
bool defGetBoolean(DefElem *def)
char * defGetString(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)
struct dirent * ReadDir(DIR *dir, const char *dirname)
int MakePGDirectory(const char *directoryName)
int CloseTransientFile(int fd)
void fsync_fname(const char *fname, bool isdir)
int data_sync_elevel(int elevel)
int OpenTransientFile(const char *fileName, int fileFlags)
DIR * AllocateDir(const char *dirname)
static char dstpath[MAXPGPATH]
#define DirectFunctionCall1(func, arg1)
#define PG_RETURN_TEXT_P(x)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
bool allowSystemTableMods
void heap_inplace_update(Relation relation, HeapTuple tuple)
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)
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)
Assert(fmt[strlen(fmt) - 1] !='\n')
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 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)
#define AccessExclusiveLock
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 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 PopActiveSnapshot(void)
void ResolveRecoveryConflictWithDatabase(Oid dbid)
#define BTEqualStrategyNumber
CreateDBStrategy strategy
Oid tablespace_ids[FLEXIBLE_ARRAY_MEMBER]
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
#define SearchSysCacheCopy1(cacheId, key1)
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
void XLogRegisterData(char *data, uint32 len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogBeginInsert(void)
#define XLogRecGetInfo(decoder)
#define XLogRecGetData(decoder)
#define XLogRecHasAnyBlockRefs(decoder)
#define XLR_SPECIAL_REL_UPDATE
void XLogDropDatabase(Oid dbid)