PostgreSQL Source Code git master
check.c
Go to the documentation of this file.
1/*
2 * check.c
3 *
4 * server checks and output routines
5 *
6 * Copyright (c) 2010-2025, PostgreSQL Global Development Group
7 * src/bin/pg_upgrade/check.c
8 */
9
10#include "postgres_fe.h"
11
12#include "catalog/pg_authid_d.h"
13#include "catalog/pg_class_d.h"
15#include "pg_upgrade.h"
17
18static void check_new_cluster_is_empty(void);
27static void check_for_new_tablespace_dir(void);
32static void check_old_cluster_for_valid_slots(void);
34
35/*
36 * DataTypesUsageChecks - definitions of data type checks for the old cluster
37 * in order to determine if an upgrade can be performed. See the comment on
38 * data_types_usage_checks below for a more detailed description.
39 */
40typedef struct
41{
42 /* Status line to print to the user */
43 const char *status;
44 /* Filename to store report to */
45 const char *report_filename;
46 /* Query to extract the oid of the datatype */
47 const char *base_query;
48 /* Text to store to report in case of error */
49 const char *report_text;
50 /* The latest version where the check applies */
52 /* A function pointer for determining if the check applies */
55
56/*
57 * Special values for threshold_version for indicating that a check applies to
58 * all versions, or that a custom function needs to be invoked to determine
59 * if the check applies.
60 */
61#define MANUAL_CHECK 1
62#define ALL_VERSIONS -1
63
64/*--
65 * Data type usage checks. Each check for problematic data type usage is
66 * defined in this array with metadata, SQL query for finding the data type
67 * and functionality for deciding if the check is applicable to the version
68 * of the old cluster. The struct members are described in detail below:
69 *
70 * status A oneline string which can be printed to the user to
71 * inform about progress. Should not end with newline.
72 * report_filename The filename in which the list of problems detected by
73 * the check will be printed.
74 * base_query A query which extracts the Oid of the datatype checked
75 * for.
76 * report_text The text which will be printed to the user to explain
77 * what the check did, and why it failed. The text should
78 * end with a newline, and does not need to refer to the
79 * report_filename as that is automatically appended to
80 * the report with the path to the log folder.
81 * threshold_version The major version of PostgreSQL for which to run the
82 * check. Iff the old cluster is less than, or equal to,
83 * the threshold version then the check will be executed.
84 * If the old version is greater than the threshold then
85 * the check is skipped. If the threshold_version is set
86 * to ALL_VERSIONS then it will be run unconditionally,
87 * if set to MANUAL_CHECK then the version_hook function
88 * will be executed in order to determine whether or not
89 * to run.
90 * version_hook A function pointer to a version check function of type
91 * DataTypesUsageVersionCheck which is used to determine
92 * if the check is applicable to the old cluster. If the
93 * version_hook returns true then the check will be run,
94 * else it will be skipped. The function will only be
95 * executed iff threshold_version is set to MANUAL_CHECK.
96 */
98{
99 /*
100 * Look for composite types that were made during initdb *or* belong to
101 * information_schema; that's important in case information_schema was
102 * dropped and reloaded.
103 *
104 * The cutoff OID here should match the source cluster's value of
105 * FirstNormalObjectId. We hardcode it rather than using that C #define
106 * because, if that #define is ever changed, our own version's value is
107 * NOT what to use. Eventually we may need a test on the source cluster's
108 * version to select the correct value.
109 */
110 {
111 .status = gettext_noop("Checking for system-defined composite types in user tables"),
112 .report_filename = "tables_using_composite.txt",
113 .base_query =
114 "SELECT t.oid FROM pg_catalog.pg_type t "
115 "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid "
116 " WHERE typtype = 'c' AND (t.oid < 16384 OR nspname = 'information_schema')",
117 .report_text =
118 gettext_noop("Your installation contains system-defined composite types in user tables.\n"
119 "These type OIDs are not stable across PostgreSQL versions,\n"
120 "so this cluster cannot currently be upgraded. You can drop the\n"
121 "problem columns and restart the upgrade.\n"),
122 .threshold_version = ALL_VERSIONS
123 },
124
125 /*
126 * 9.3 -> 9.4 Fully implement the 'line' data type in 9.4, which
127 * previously returned "not enabled" by default and was only functionally
128 * enabled with a compile-time switch; as of 9.4 "line" has a different
129 * on-disk representation format.
130 */
131 {
132 .status = gettext_noop("Checking for incompatible \"line\" data type"),
133 .report_filename = "tables_using_line.txt",
134 .base_query =
135 "SELECT 'pg_catalog.line'::pg_catalog.regtype AS oid",
136 .report_text =
137 gettext_noop("Your installation contains the \"line\" data type in user tables.\n"
138 "This data type changed its internal and input/output format\n"
139 "between your old and new versions so this\n"
140 "cluster cannot currently be upgraded. You can\n"
141 "drop the problem columns and restart the upgrade.\n"),
142 .threshold_version = 903
143 },
144
145 /*
146 * pg_upgrade only preserves these system values: pg_class.oid pg_type.oid
147 * pg_enum.oid
148 *
149 * Many of the reg* data types reference system catalog info that is not
150 * preserved, and hence these data types cannot be used in user tables
151 * upgraded by pg_upgrade.
152 */
153 {
154 .status = gettext_noop("Checking for reg* data types in user tables"),
155 .report_filename = "tables_using_reg.txt",
156
157 /*
158 * Note: older servers will not have all of these reg* types, so we
159 * have to write the query like this rather than depending on casts to
160 * regtype.
161 */
162 .base_query =
163 "SELECT oid FROM pg_catalog.pg_type t "
164 "WHERE t.typnamespace = "
165 " (SELECT oid FROM pg_catalog.pg_namespace "
166 " WHERE nspname = 'pg_catalog') "
167 " AND t.typname IN ( "
168 /* pg_class.oid is preserved, so 'regclass' is OK */
169 " 'regcollation', "
170 " 'regconfig', "
171 " 'regdictionary', "
172 " 'regnamespace', "
173 " 'regoper', "
174 " 'regoperator', "
175 " 'regproc', "
176 " 'regprocedure' "
177 /* pg_authid.oid is preserved, so 'regrole' is OK */
178 /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */
179 " )",
180 .report_text =
181 gettext_noop("Your installation contains one of the reg* data types in user tables.\n"
182 "These data types reference system OIDs that are not preserved by\n"
183 "pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
184 "drop the problem columns and restart the upgrade.\n"),
185 .threshold_version = ALL_VERSIONS
186 },
187
188 /*
189 * PG 16 increased the size of the 'aclitem' type, which breaks the
190 * on-disk format for existing data.
191 */
192 {
193 .status = gettext_noop("Checking for incompatible \"aclitem\" data type"),
194 .report_filename = "tables_using_aclitem.txt",
195 .base_query =
196 "SELECT 'pg_catalog.aclitem'::pg_catalog.regtype AS oid",
197 .report_text =
198 gettext_noop("Your installation contains the \"aclitem\" data type in user tables.\n"
199 "The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
200 "so this cluster cannot currently be upgraded. You can drop the\n"
201 "problem columns and restart the upgrade.\n"),
202 .threshold_version = 1500
203 },
204
205 /*
206 * It's no longer allowed to create tables or views with "unknown"-type
207 * columns. We do not complain about views with such columns, because
208 * they should get silently converted to "text" columns during the DDL
209 * dump and reload; it seems unlikely to be worth making users do that by
210 * hand. However, if there's a table with such a column, the DDL reload
211 * will fail, so we should pre-detect that rather than failing
212 * mid-upgrade. Worse, if there's a matview with such a column, the DDL
213 * reload will silently change it to "text" which won't match the on-disk
214 * storage (which is like "cstring"). So we *must* reject that.
215 */
216 {
217 .status = gettext_noop("Checking for invalid \"unknown\" user columns"),
218 .report_filename = "tables_using_unknown.txt",
219 .base_query =
220 "SELECT 'pg_catalog.unknown'::pg_catalog.regtype AS oid",
221 .report_text =
222 gettext_noop("Your installation contains the \"unknown\" data type in user tables.\n"
223 "This data type is no longer allowed in tables, so this cluster\n"
224 "cannot currently be upgraded. You can drop the problem columns\n"
225 "and restart the upgrade.\n"),
226 .threshold_version = 906
227 },
228
229 /*
230 * PG 12 changed the 'sql_identifier' type storage to be based on name,
231 * not varchar, which breaks on-disk format for existing data. So we need
232 * to prevent upgrade when used in user objects (tables, indexes, ...). In
233 * 12, the sql_identifier data type was switched from name to varchar,
234 * which does affect the storage (name is by-ref, but not varlena). This
235 * means user tables using sql_identifier for columns are broken because
236 * the on-disk format is different.
237 */
238 {
239 .status = gettext_noop("Checking for invalid \"sql_identifier\" user columns"),
240 .report_filename = "tables_using_sql_identifier.txt",
241 .base_query =
242 "SELECT 'information_schema.sql_identifier'::pg_catalog.regtype AS oid",
243 .report_text =
244 gettext_noop("Your installation contains the \"sql_identifier\" data type in user tables.\n"
245 "The on-disk format for this data type has changed, so this\n"
246 "cluster cannot currently be upgraded. You can drop the problem\n"
247 "columns and restart the upgrade.\n"),
248 .threshold_version = 1100
249 },
250
251 /*
252 * JSONB changed its storage format during 9.4 beta, so check for it.
253 */
254 {
255 .status = gettext_noop("Checking for incompatible \"jsonb\" data type in user tables"),
256 .report_filename = "tables_using_jsonb.txt",
257 .base_query =
258 "SELECT 'pg_catalog.jsonb'::pg_catalog.regtype AS oid",
259 .report_text =
260 gettext_noop("Your installation contains the \"jsonb\" data type in user tables.\n"
261 "The internal format of \"jsonb\" changed during 9.4 beta so this\n"
262 "cluster cannot currently be upgraded. You can drop the problem \n"
263 "columns and restart the upgrade.\n"),
264 .threshold_version = MANUAL_CHECK,
265 .version_hook = jsonb_9_4_check_applicable
266 },
267
268 /*
269 * PG 12 removed types abstime, reltime, tinterval.
270 */
271 {
272 .status = gettext_noop("Checking for removed \"abstime\" data type in user tables"),
273 .report_filename = "tables_using_abstime.txt",
274 .base_query =
275 "SELECT 'pg_catalog.abstime'::pg_catalog.regtype AS oid",
276 .report_text =
277 gettext_noop("Your installation contains the \"abstime\" data type in user tables.\n"
278 "The \"abstime\" type has been removed in PostgreSQL version 12,\n"
279 "so this cluster cannot currently be upgraded. You can drop the\n"
280 "problem columns, or change them to another data type, and restart\n"
281 "the upgrade.\n"),
282 .threshold_version = 1100
283 },
284 {
285 .status = gettext_noop("Checking for removed \"reltime\" data type in user tables"),
286 .report_filename = "tables_using_reltime.txt",
287 .base_query =
288 "SELECT 'pg_catalog.reltime'::pg_catalog.regtype AS oid",
289 .report_text =
290 gettext_noop("Your installation contains the \"reltime\" data type in user tables.\n"
291 "The \"reltime\" type has been removed in PostgreSQL version 12,\n"
292 "so this cluster cannot currently be upgraded. You can drop the\n"
293 "problem columns, or change them to another data type, and restart\n"
294 "the upgrade.\n"),
295 .threshold_version = 1100
296 },
297 {
298 .status = gettext_noop("Checking for removed \"tinterval\" data type in user tables"),
299 .report_filename = "tables_using_tinterval.txt",
300 .base_query =
301 "SELECT 'pg_catalog.tinterval'::pg_catalog.regtype AS oid",
302 .report_text =
303 gettext_noop("Your installation contains the \"tinterval\" data type in user tables.\n"
304 "The \"tinterval\" type has been removed in PostgreSQL version 12,\n"
305 "so this cluster cannot currently be upgraded. You can drop the\n"
306 "problem columns, or change them to another data type, and restart\n"
307 "the upgrade.\n"),
308 .threshold_version = 1100
309 },
310
311 /* End of checks marker, must remain last */
312 {
313 NULL, NULL, NULL, NULL, 0, NULL
314 }
315};
316
317/*
318 * Private state for check_for_data_types_usage()'s UpgradeTask.
319 */
321{
322 DataTypesUsageChecks *check; /* the check for this step */
323 bool result; /* true if check failed for any database */
324 PQExpBuffer *report; /* buffer for report on failed checks */
325};
326
327/*
328 * Returns a palloc'd query string for the data type check, for use by
329 * check_for_data_types_usage()'s UpgradeTask.
330 */
331static char *
333{
335
336 return psprintf("WITH RECURSIVE oids AS ( "
337 /* start with the type(s) returned by base_query */
338 " %s "
339 " UNION ALL "
340 " SELECT * FROM ( "
341 /* inner WITH because we can only reference the CTE once */
342 " WITH x AS (SELECT oid FROM oids) "
343 /* domains on any type selected so far */
344 " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
345 " UNION ALL "
346 /* arrays over any type selected so far */
347 " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' "
348 " UNION ALL "
349 /* composite types containing any type selected so far */
350 " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
351 " WHERE t.typtype = 'c' AND "
352 " t.oid = c.reltype AND "
353 " c.oid = a.attrelid AND "
354 " NOT a.attisdropped AND "
355 " a.atttypid = x.oid "
356 " UNION ALL "
357 /* ranges containing any type selected so far */
358 " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
359 " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid"
360 " ) foo "
361 ") "
362 /* now look for stored columns of any such type */
363 "SELECT n.nspname, c.relname, a.attname "
364 "FROM pg_catalog.pg_class c, "
365 " pg_catalog.pg_namespace n, "
366 " pg_catalog.pg_attribute a "
367 "WHERE c.oid = a.attrelid AND "
368 " NOT a.attisdropped AND "
369 " a.atttypid IN (SELECT oid FROM oids) AND "
370 " c.relkind IN ("
371 CppAsString2(RELKIND_RELATION) ", "
372 CppAsString2(RELKIND_MATVIEW) ", "
373 CppAsString2(RELKIND_INDEX) ") AND "
374 " c.relnamespace = n.oid AND "
375 /* exclude possible orphaned temp tables */
376 " n.nspname !~ '^pg_temp_' AND "
377 " n.nspname !~ '^pg_toast_temp_' AND "
378 /* exclude system catalogs, too */
379 " n.nspname NOT IN ('pg_catalog', 'information_schema')",
380 check->base_query);
381}
382
383/*
384 * Callback function for processing results of queries for
385 * check_for_data_types_usage()'s UpgradeTask. If the query returned any rows
386 * (i.e., the check failed), write the details to the report file.
387 */
388static void
390{
392 int ntups = PQntuples(res);
393 char output_path[MAXPGPATH];
394 int i_nspname = PQfnumber(res, "nspname");
395 int i_relname = PQfnumber(res, "relname");
396 int i_attname = PQfnumber(res, "attname");
397 FILE *script = NULL;
398
400
401 if (ntups == 0)
402 return;
403
404 snprintf(output_path, sizeof(output_path), "%s/%s",
406 state->check->report_filename);
407
408 /*
409 * Make sure we have a buffer to save reports to now that we found a first
410 * failing check.
411 */
412 if (*state->report == NULL)
413 *state->report = createPQExpBuffer();
414
415 /*
416 * If this is the first time we see an error for the check in question
417 * then print a status message of the failure.
418 */
419 if (!state->result)
420 {
421 pg_log(PG_REPORT, "failed check: %s", _(state->check->status));
422 appendPQExpBuffer(*state->report, "\n%s\n%s %s\n",
423 _(state->check->report_text),
424 _("A list of the problem columns is in the file:"),
425 output_path);
426 }
427 state->result = true;
428
429 if ((script = fopen_priv(output_path, "a")) == NULL)
430 pg_fatal("could not open file \"%s\": %m", output_path);
431
432 fprintf(script, "In database: %s\n", dbinfo->db_name);
433
434 for (int rowno = 0; rowno < ntups; rowno++)
435 fprintf(script, " %s.%s.%s\n",
436 PQgetvalue(res, rowno, i_nspname),
437 PQgetvalue(res, rowno, i_relname),
438 PQgetvalue(res, rowno, i_attname));
439
440 fclose(script);
441}
442
443/*
444 * check_for_data_types_usage()
445 * Detect whether there are any stored columns depending on given type(s)
446 *
447 * If so, write a report to the given file name and signal a failure to the
448 * user.
449 *
450 * The checks to run are defined in a DataTypesUsageChecks structure where
451 * each check has a metadata for explaining errors to the user, a base_query,
452 * a report filename and a function pointer hook for validating if the check
453 * should be executed given the cluster at hand.
454 *
455 * base_query should be a SELECT yielding a single column named "oid",
456 * containing the pg_type OIDs of one or more types that are known to have
457 * inconsistent on-disk representations across server versions.
458 *
459 * We check for the type(s) in tables, matviews, and indexes, but not views;
460 * there's no storage involved in a view.
461 */
462static void
464{
465 PQExpBuffer report = NULL;
467 int n_data_types_usage_checks = 0;
469 char **queries = NULL;
470 struct data_type_check_state *states;
471
472 prep_status("Checking data type usage");
473
474 /* Gather number of checks to perform */
475 while (tmp->status != NULL)
476 {
477 n_data_types_usage_checks++;
478 tmp++;
479 }
480
481 /* Allocate memory for queries and for task states */
482 queries = pg_malloc0(sizeof(char *) * n_data_types_usage_checks);
483 states = pg_malloc0(sizeof(struct data_type_check_state) * n_data_types_usage_checks);
484
485 for (int i = 0; i < n_data_types_usage_checks; i++)
486 {
488
490 {
492
493 /*
494 * Make sure that the check applies to the current cluster version
495 * and skip it if not.
496 */
498 continue;
499 }
501 {
502 if (GET_MAJOR_VERSION(cluster->major_version) > check->threshold_version)
503 continue;
504 }
505 else
507
508 queries[i] = data_type_check_query(i);
509
510 states[i].check = check;
511 states[i].report = &report;
512
514 true, &states[i]);
515 }
516
517 /*
518 * Connect to each database in the cluster and run all defined checks
519 * against that database before trying the next one.
520 */
522 upgrade_task_free(task);
523
524 if (report)
525 {
526 pg_fatal("Data type checks failed: %s", report->data);
528 }
529
530 for (int i = 0; i < n_data_types_usage_checks; i++)
531 {
532 if (queries[i])
533 pg_free(queries[i]);
534 }
535 pg_free(queries);
536 pg_free(states);
537
538 check_ok();
539}
540
541/*
542 * fix_path_separator
543 * For non-Windows, just return the argument.
544 * For Windows convert any forward slash to a backslash
545 * such as is suitable for arguments to builtin commands
546 * like RMDIR and DEL.
547 */
548static char *
550{
551#ifdef WIN32
552
553 char *result;
554 char *c;
555
556 result = pg_strdup(path);
557
558 for (c = result; *c != '\0'; c++)
559 if (*c == '/')
560 *c = '\\';
561
562 return result;
563#else
564
565 return path;
566#endif
567}
568
569void
571{
573 {
575 "Performing Consistency Checks on Old Live Server\n"
576 "------------------------------------------------");
577 }
578 else
579 {
581 "Performing Consistency Checks\n"
582 "-----------------------------");
583 }
584}
585
586
587void
589{
590 /* -- OLD -- */
591
594
595 /*
596 * First check that all databases allow connections since we'll otherwise
597 * fail in later stages.
598 */
600
601 /*
602 * Extract a list of databases, tables, and logical replication slots from
603 * the old cluster.
604 */
606
608
610
611
612 /*
613 * Check for various failure cases
614 */
618
620 {
621 /*
622 * Logical replication slots can be migrated since PG17. See comments
623 * atop get_old_cluster_logical_slot_infos().
624 */
626
627 /*
628 * Subscriptions and their dependencies can be migrated since PG17.
629 * Before that the logical slots are not upgraded, so we will not be
630 * able to upgrade the logical replication clusters completely.
631 */
634 }
635
637
638 /*
639 * Unicode updates can affect some objects that use expressions with
640 * functions dependent on Unicode.
641 */
643
644 /*
645 * PG 14 changed the function signature of encoding conversion functions.
646 * Conversions from older versions cannot be upgraded automatically
647 * because the user-defined functions used by the encoding conversions
648 * need to be changed to match the new signature.
649 */
652
653 /*
654 * Pre-PG 14 allowed user defined postfix operators, which are not
655 * supported anymore. Verify there are none, iff applicable.
656 */
659
660 /*
661 * PG 14 changed polymorphic functions from anyarray to
662 * anycompatiblearray.
663 */
666
667 /*
668 * Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
669 * supported anymore. Verify there are none, iff applicable.
670 */
673
674 /*
675 * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged
676 * hash indexes
677 */
679 {
680 if (user_opts.check)
682 }
683
684 /* 9.5 and below should not have roles starting with pg_ */
687
688 /*
689 * While not a check option, we do this now because this is the only time
690 * the old server is running.
691 */
692 if (!user_opts.check)
694
696 stop_postmaster(false);
697}
698
699
700void
702{
704
706
708
709 switch (user_opts.transfer_mode)
710 {
713 break;
715 break;
718 break;
721 break;
723
724 /*
725 * We do the hard link check for --swap, too, since it's an easy
726 * way to verify the clusters are in the same file system. This
727 * allows us to take some shortcuts in the file synchronization
728 * step. With some more effort, we could probably support the
729 * separate-file-system use case, but this mode is unlikely to
730 * offer much benefit if we have to copy the files across file
731 * system boundaries.
732 */
734
735 /*
736 * There are a few known issues with using --swap to upgrade from
737 * versions older than 10. For example, the sequence tuple format
738 * changed in v10, and the visibility map format changed in 9.6.
739 * While such problems are not insurmountable (and we may have to
740 * deal with similar problems in the future, anyway), it doesn't
741 * seem worth the effort to support swap mode for upgrades from
742 * long-unsupported versions.
743 */
745 pg_fatal("Swap mode can only upgrade clusters from PostgreSQL version %s and later.",
746 "10");
747
748 break;
749 }
750
752
754
756
758
760}
761
762
763void
765{
766 if (user_opts.check)
767 {
768 pg_log(PG_REPORT, "\n*Clusters are compatible*");
769 /* stops new cluster */
770 stop_postmaster(false);
771
773 exit(0);
774 }
775
776 pg_log(PG_REPORT, "\n"
777 "If pg_upgrade fails after this point, you must re-initdb the\n"
778 "new cluster before continuing.");
779}
780
781
782void
784{
785 /*
786 * We unconditionally start/stop the new server because pg_resetwal -o set
787 * wal_level to 'minimum'. If the user is upgrading standby servers using
788 * the rsync instructions, they will need pg_upgrade to write its final
789 * WAL record showing wal_level as 'replica'.
790 */
792
793 /* Reindex hash indexes for old < 10.0 */
796
798
799 stop_postmaster(false);
800}
801
802
803void
804output_completion_banner(char *deletion_script_file_name)
805{
806 PQExpBufferData user_specification;
807
808 initPQExpBuffer(&user_specification);
810 {
811 appendPQExpBufferStr(&user_specification, "-U ");
812 appendShellString(&user_specification, os_info.user);
813 appendPQExpBufferChar(&user_specification, ' ');
814 }
815
817 "Some statistics are not transferred by pg_upgrade.\n"
818 "Once you start the new server, consider running these two commands:\n"
819 " %s/vacuumdb %s--all --analyze-in-stages --missing-stats-only\n"
820 " %s/vacuumdb %s--all --analyze-only",
821 new_cluster.bindir, user_specification.data,
822 new_cluster.bindir, user_specification.data);
823
824 if (deletion_script_file_name)
826 "Running this script will delete the old cluster's data files:\n"
827 " %s",
828 deletion_script_file_name);
829 else
831 "Could not create a script to delete the old cluster's data files\n"
832 "because user-defined tablespaces or the new cluster's data directory\n"
833 "exist in the old cluster directory. The old cluster's contents must\n"
834 "be deleted manually.");
835
836 termPQExpBuffer(&user_specification);
837}
838
839
840void
842{
843 prep_status("Checking cluster versions");
844
845 /* cluster versions should already have been obtained */
848
849 /*
850 * We allow upgrades from/to the same major version for alpha/beta
851 * upgrades
852 */
853
855 pg_fatal("This utility can only upgrade from PostgreSQL version %s and later.",
856 "9.2");
857
858 /* Only current PG version is supported as a target */
860 pg_fatal("This utility can only upgrade to PostgreSQL version %s.",
861 PG_MAJORVERSION);
862
863 /*
864 * We can't allow downgrading because we use the target pg_dump, and
865 * pg_dump cannot operate on newer database versions, only current and
866 * older versions.
867 */
869 pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.");
870
871 /* Ensure binaries match the designated data directories */
874 pg_fatal("Old cluster data and binary directories are from different major versions.");
877 pg_fatal("New cluster data and binary directories are from different major versions.");
878
879 /*
880 * Since from version 18, newly created database clusters always have
881 * 'signed' default char-signedness, it makes less sense to use
882 * --set-char-signedness option for upgrading from version 18 or later.
883 * Users who want to change the default char signedness of the new
884 * cluster, they can use pg_resetwal manually before the upgrade.
885 */
888 pg_fatal("%s option cannot be used to upgrade from PostgreSQL %s and later.",
889 "--set-char-signedness", "18");
890
891 check_ok();
892}
893
894
895void
897{
898 /* get/check pg_control data of servers */
902
904 pg_fatal("When checking a live server, "
905 "the old and new port numbers must be different.");
906}
907
908
909static void
911{
912 int dbnum;
913
914 for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
915 {
916 int relnum;
917 RelInfoArr *rel_arr = &new_cluster.dbarr.dbs[dbnum].rel_arr;
918
919 for (relnum = 0; relnum < rel_arr->nrels;
920 relnum++)
921 {
922 /* pg_largeobject and its index should be skipped */
923 if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0)
924 pg_fatal("New cluster database \"%s\" is not empty: found relation \"%s.%s\"",
926 rel_arr->rels[relnum].nspname,
927 rel_arr->rels[relnum].relname);
928 }
929 }
930}
931
932/*
933 * A previous run of pg_upgrade might have failed and the new cluster
934 * directory recreated, but they might have forgotten to remove
935 * the new cluster's tablespace directories. Therefore, check that
936 * new cluster tablespace directories do not already exist. If
937 * they do, it would cause an error while restoring global objects.
938 * This allows the failure to be detected at check time, rather than
939 * during schema restore.
940 */
941static void
943{
944 int tblnum;
945 char new_tablespace_dir[MAXPGPATH];
946
947 prep_status("Checking for new cluster tablespace directories");
948
949 for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
950 {
951 struct stat statbuf;
952
953 snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
954 os_info.old_tablespaces[tblnum],
956
957 if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
958 pg_fatal("new cluster tablespace directory already exists: \"%s\"",
959 new_tablespace_dir);
960 }
961
962 check_ok();
963}
964
965/*
966 * create_script_for_old_cluster_deletion()
967 *
968 * This is particularly useful for tablespace deletion.
969 */
970void
971create_script_for_old_cluster_deletion(char **deletion_script_file_name)
972{
973 FILE *script = NULL;
974 int tblnum;
975 char old_cluster_pgdata[MAXPGPATH],
976 new_cluster_pgdata[MAXPGPATH];
977 char *old_tblspc_suffix;
978
979 *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
981
982 strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
983 canonicalize_path(old_cluster_pgdata);
984
985 strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
986 canonicalize_path(new_cluster_pgdata);
987
988 /* Some people put the new data directory inside the old one. */
989 if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
990 {
992 "\nWARNING: new data directory should not be inside the old data directory, i.e. %s", old_cluster_pgdata);
993
994 /* Unlink file in case it is left over from a previous run. */
995 unlink(*deletion_script_file_name);
996 pg_free(*deletion_script_file_name);
997 *deletion_script_file_name = NULL;
998 return;
999 }
1000
1001 /*
1002 * Some users (oddly) create tablespaces inside the cluster data
1003 * directory. We can't create a proper old cluster delete script in that
1004 * case.
1005 */
1006 for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
1007 {
1008 char old_tablespace_dir[MAXPGPATH];
1009
1010 strlcpy(old_tablespace_dir, os_info.old_tablespaces[tblnum], MAXPGPATH);
1011 canonicalize_path(old_tablespace_dir);
1012 if (path_is_prefix_of_path(old_cluster_pgdata, old_tablespace_dir))
1013 {
1014 /* reproduce warning from CREATE TABLESPACE that is in the log */
1016 "\nWARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s", old_tablespace_dir);
1017
1018 /* Unlink file in case it is left over from a previous run. */
1019 unlink(*deletion_script_file_name);
1020 pg_free(*deletion_script_file_name);
1021 *deletion_script_file_name = NULL;
1022 return;
1023 }
1024 }
1025
1026 prep_status("Creating script to delete old cluster");
1027
1028 if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
1029 pg_fatal("could not open file \"%s\": %m",
1030 *deletion_script_file_name);
1031
1032#ifndef WIN32
1033 /* add shebang header */
1034 fprintf(script, "#!/bin/sh\n\n");
1035#endif
1036
1037 /* delete old cluster's default tablespace */
1038 fprintf(script, RMDIR_CMD " %c%s%c\n", PATH_QUOTE,
1040
1041 /* delete old cluster's alternate tablespaces */
1042 old_tblspc_suffix = pg_strdup(old_cluster.tablespace_suffix);
1043 fix_path_separator(old_tblspc_suffix);
1044 for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
1045 fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
1047 old_tblspc_suffix, PATH_QUOTE);
1048 pfree(old_tblspc_suffix);
1049
1050 fclose(script);
1051
1052#ifndef WIN32
1053 if (chmod(*deletion_script_file_name, S_IRWXU) != 0)
1054 pg_fatal("could not add execute permission to file \"%s\": %m",
1055 *deletion_script_file_name);
1056#endif
1057
1058 check_ok();
1059}
1060
1061
1062/*
1063 * check_is_install_user()
1064 *
1065 * Check we are the install user, and that the new cluster
1066 * has no other users.
1067 */
1068static void
1070{
1071 PGresult *res;
1072 PGconn *conn = connectToServer(cluster, "template1");
1073
1074 prep_status("Checking database user is the install user");
1075
1076 /* Can't use pg_authid because only superusers can view it. */
1077 res = executeQueryOrDie(conn,
1078 "SELECT rolsuper, oid "
1079 "FROM pg_catalog.pg_roles "
1080 "WHERE rolname = current_user "
1081 "AND rolname !~ '^pg_'");
1082
1083 /*
1084 * We only allow the install user in the new cluster (see comment below)
1085 * and we preserve pg_authid.oid, so this must be the install user in the
1086 * old cluster too.
1087 */
1088 if (PQntuples(res) != 1 ||
1089 atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID)
1090 pg_fatal("database user \"%s\" is not the install user",
1091 os_info.user);
1092
1093 PQclear(res);
1094
1095 res = executeQueryOrDie(conn,
1096 "SELECT COUNT(*) "
1097 "FROM pg_catalog.pg_roles "
1098 "WHERE rolname !~ '^pg_'");
1099
1100 if (PQntuples(res) != 1)
1101 pg_fatal("could not determine the number of users");
1102
1103 /*
1104 * We only allow the install user in the new cluster because other defined
1105 * users might match users defined in the old cluster and generate an
1106 * error during pg_dump restore.
1107 */
1108 if (cluster == &new_cluster && strcmp(PQgetvalue(res, 0, 0), "1") != 0)
1109 pg_fatal("Only the install user can be defined in the new cluster.");
1110
1111 PQclear(res);
1112
1113 PQfinish(conn);
1114
1115 check_ok();
1116}
1117
1118
1119/*
1120 * check_for_connection_status
1121 *
1122 * Ensure that all non-template0 databases allow connections since they
1123 * otherwise won't be restored; and that template0 explicitly doesn't allow
1124 * connections since it would make pg_dumpall --globals restore fail.
1125 */
1126static void
1128{
1129 int dbnum;
1130 PGconn *conn_template1;
1131 PGresult *dbres;
1132 int ntups;
1133 int i_datname;
1134 int i_datallowconn;
1135 int i_datconnlimit;
1136 FILE *script = NULL;
1137 char output_path[MAXPGPATH];
1138
1139 prep_status("Checking database connection settings");
1140
1141 snprintf(output_path, sizeof(output_path), "%s/%s",
1143 "databases_cannot_connect_to.txt");
1144
1145 conn_template1 = connectToServer(cluster, "template1");
1146
1147 /* get database names */
1148 dbres = executeQueryOrDie(conn_template1,
1149 "SELECT datname, datallowconn, datconnlimit "
1150 "FROM pg_catalog.pg_database");
1151
1152 i_datname = PQfnumber(dbres, "datname");
1153 i_datallowconn = PQfnumber(dbres, "datallowconn");
1154 i_datconnlimit = PQfnumber(dbres, "datconnlimit");
1155
1156 ntups = PQntuples(dbres);
1157 for (dbnum = 0; dbnum < ntups; dbnum++)
1158 {
1159 char *datname = PQgetvalue(dbres, dbnum, i_datname);
1160 char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
1161 char *datconnlimit = PQgetvalue(dbres, dbnum, i_datconnlimit);
1162
1163 if (strcmp(datname, "template0") == 0)
1164 {
1165 /* avoid restore failure when pg_dumpall tries to create template0 */
1166 if (strcmp(datallowconn, "t") == 0)
1167 pg_fatal("template0 must not allow connections, "
1168 "i.e. its pg_database.datallowconn must be false");
1169 }
1170 else
1171 {
1172 /*
1173 * Avoid datallowconn == false databases from being skipped on
1174 * restore, and ensure that no databases are marked invalid with
1175 * datconnlimit == -2.
1176 */
1177 if ((strcmp(datallowconn, "f") == 0) || strcmp(datconnlimit, "-2") == 0)
1178 {
1179 if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
1180 pg_fatal("could not open file \"%s\": %m", output_path);
1181
1182 fprintf(script, "%s\n", datname);
1183 }
1184 }
1185 }
1186
1187 PQclear(dbres);
1188
1189 PQfinish(conn_template1);
1190
1191 if (script)
1192 {
1193 fclose(script);
1194 pg_log(PG_REPORT, "fatal");
1195 pg_fatal("All non-template0 databases must allow connections, i.e. their\n"
1196 "pg_database.datallowconn must be true and pg_database.datconnlimit\n"
1197 "must not be -2. Your installation contains non-template0 databases\n"
1198 "which cannot be connected to. Consider allowing connection for all\n"
1199 "non-template0 databases or drop the databases which do not allow\n"
1200 "connections. A list of databases with the problem is in the file:\n"
1201 " %s", output_path);
1202 }
1203 else
1204 check_ok();
1205}
1206
1207
1208/*
1209 * check_for_prepared_transactions()
1210 *
1211 * Make sure there are no prepared transactions because the storage format
1212 * might have changed.
1213 */
1214static void
1216{
1217 PGresult *res;
1218 PGconn *conn = connectToServer(cluster, "template1");
1219
1220 prep_status("Checking for prepared transactions");
1221
1222 res = executeQueryOrDie(conn,
1223 "SELECT * "
1224 "FROM pg_catalog.pg_prepared_xacts");
1225
1226 if (PQntuples(res) != 0)
1227 {
1228 if (cluster == &old_cluster)
1229 pg_fatal("The source cluster contains prepared transactions");
1230 else
1231 pg_fatal("The target cluster contains prepared transactions");
1232 }
1233
1234 PQclear(res);
1235
1236 PQfinish(conn);
1237
1238 check_ok();
1239}
1240
1241/*
1242 * Callback function for processing result of query for
1243 * check_for_isn_and_int8_passing_mismatch()'s UpgradeTask. If the query
1244 * returned any rows (i.e., the check failed), write the details to the report
1245 * file.
1246 */
1247static void
1249{
1250 int ntups = PQntuples(res);
1251 int i_nspname = PQfnumber(res, "nspname");
1252 int i_proname = PQfnumber(res, "proname");
1254
1257
1258 if (ntups == 0)
1259 return;
1260
1261 if (report->file == NULL &&
1262 (report->file = fopen_priv(report->path, "w")) == NULL)
1263 pg_fatal("could not open file \"%s\": %m", report->path);
1264
1265 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1266
1267 for (int rowno = 0; rowno < ntups; rowno++)
1268 fprintf(report->file, " %s.%s\n",
1269 PQgetvalue(res, rowno, i_nspname),
1270 PQgetvalue(res, rowno, i_proname));
1271}
1272
1273/*
1274 * check_for_isn_and_int8_passing_mismatch()
1275 *
1276 * contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
1277 * by value. The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
1278 * it must match for the old and new servers.
1279 */
1280static void
1282{
1283 UpgradeTask *task;
1284 UpgradeTaskReport report;
1285 const char *query = "SELECT n.nspname, p.proname "
1286 "FROM pg_catalog.pg_proc p, "
1287 " pg_catalog.pg_namespace n "
1288 "WHERE p.pronamespace = n.oid AND "
1289 " p.probin = '$libdir/isn'";
1290
1291 prep_status("Checking for contrib/isn with bigint-passing mismatch");
1292
1295 {
1296 /* no mismatch */
1297 check_ok();
1298 return;
1299 }
1300
1301 report.file = NULL;
1302 snprintf(report.path, sizeof(report.path), "%s/%s",
1304 "contrib_isn_and_int8_pass_by_value.txt");
1305
1306 task = upgrade_task_create();
1308 true, &report);
1310 upgrade_task_free(task);
1311
1312 if (report.file)
1313 {
1314 fclose(report.file);
1315 pg_log(PG_REPORT, "fatal");
1316 pg_fatal("Your installation contains \"contrib/isn\" functions which rely on the\n"
1317 "bigint data type. Your old and new clusters pass bigint values\n"
1318 "differently so this cluster cannot currently be upgraded. You can\n"
1319 "manually dump databases in the old cluster that use \"contrib/isn\"\n"
1320 "facilities, drop them, perform the upgrade, and then restore them. A\n"
1321 "list of the problem functions is in the file:\n"
1322 " %s", report.path);
1323 }
1324 else
1325 check_ok();
1326}
1327
1328/*
1329 * Callback function for processing result of query for
1330 * check_for_user_defined_postfix_ops()'s UpgradeTask. If the query returned
1331 * any rows (i.e., the check failed), write the details to the report file.
1332 */
1333static void
1335{
1337 int ntups = PQntuples(res);
1338 int i_oproid = PQfnumber(res, "oproid");
1339 int i_oprnsp = PQfnumber(res, "oprnsp");
1340 int i_oprname = PQfnumber(res, "oprname");
1341 int i_typnsp = PQfnumber(res, "typnsp");
1342 int i_typname = PQfnumber(res, "typname");
1343
1346
1347 if (ntups == 0)
1348 return;
1349
1350 if (report->file == NULL &&
1351 (report->file = fopen_priv(report->path, "w")) == NULL)
1352 pg_fatal("could not open file \"%s\": %m", report->path);
1353
1354 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1355
1356 for (int rowno = 0; rowno < ntups; rowno++)
1357 fprintf(report->file, " (oid=%s) %s.%s (%s.%s, NONE)\n",
1358 PQgetvalue(res, rowno, i_oproid),
1359 PQgetvalue(res, rowno, i_oprnsp),
1360 PQgetvalue(res, rowno, i_oprname),
1361 PQgetvalue(res, rowno, i_typnsp),
1362 PQgetvalue(res, rowno, i_typname));
1363}
1364
1365/*
1366 * Verify that no user defined postfix operators exist.
1367 */
1368static void
1370{
1371 UpgradeTaskReport report;
1373 const char *query;
1374
1375 /*
1376 * The query below hardcodes FirstNormalObjectId as 16384 rather than
1377 * interpolating that C #define into the query because, if that #define is
1378 * ever changed, the cutoff we want to use is the value used by
1379 * pre-version 14 servers, not that of some future version.
1380 */
1381 query = "SELECT o.oid AS oproid, "
1382 " n.nspname AS oprnsp, "
1383 " o.oprname, "
1384 " tn.nspname AS typnsp, "
1385 " t.typname "
1386 "FROM pg_catalog.pg_operator o, "
1387 " pg_catalog.pg_namespace n, "
1388 " pg_catalog.pg_type t, "
1389 " pg_catalog.pg_namespace tn "
1390 "WHERE o.oprnamespace = n.oid AND "
1391 " o.oprleft = t.oid AND "
1392 " t.typnamespace = tn.oid AND "
1393 " o.oprright = 0 AND "
1394 " o.oid >= 16384";
1395
1396 prep_status("Checking for user-defined postfix operators");
1397
1398 report.file = NULL;
1399 snprintf(report.path, sizeof(report.path), "%s/%s",
1401 "postfix_ops.txt");
1402
1404 true, &report);
1406 upgrade_task_free(task);
1407
1408 if (report.file)
1409 {
1410 fclose(report.file);
1411 pg_log(PG_REPORT, "fatal");
1412 pg_fatal("Your installation contains user-defined postfix operators, which are not\n"
1413 "supported anymore. Consider dropping the postfix operators and replacing\n"
1414 "them with prefix operators or function calls.\n"
1415 "A list of user-defined postfix operators is in the file:\n"
1416 " %s", report.path);
1417 }
1418 else
1419 check_ok();
1420}
1421
1422/*
1423 * Callback function for processing results of query for
1424 * check_for_incompatible_polymorphics()'s UpgradeTask. If the query returned
1425 * any rows (i.e., the check failed), write the details to the report file.
1426 */
1427static void
1429{
1431 int ntups = PQntuples(res);
1432 int i_objkind = PQfnumber(res, "objkind");
1433 int i_objname = PQfnumber(res, "objname");
1434
1437
1438 if (ntups == 0)
1439 return;
1440
1441 if (report->file == NULL &&
1442 (report->file = fopen_priv(report->path, "w")) == NULL)
1443 pg_fatal("could not open file \"%s\": %m", report->path);
1444
1445 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1446
1447 for (int rowno = 0; rowno < ntups; rowno++)
1448 fprintf(report->file, " %s: %s\n",
1449 PQgetvalue(res, rowno, i_objkind),
1450 PQgetvalue(res, rowno, i_objname));
1451}
1452
1453/*
1454 * check_for_incompatible_polymorphics()
1455 *
1456 * Make sure nothing is using old polymorphic functions with
1457 * anyarray/anyelement rather than the new anycompatible variants.
1458 */
1459static void
1461{
1462 PQExpBufferData old_polymorphics;
1464 UpgradeTaskReport report;
1465 char *query;
1466
1467 prep_status("Checking for incompatible polymorphic functions");
1468
1469 report.file = NULL;
1470 snprintf(report.path, sizeof(report.path), "%s/%s",
1472 "incompatible_polymorphics.txt");
1473
1474 /* The set of problematic functions varies a bit in different versions */
1475 initPQExpBuffer(&old_polymorphics);
1476
1477 appendPQExpBufferStr(&old_polymorphics,
1478 "'array_append(anyarray,anyelement)'"
1479 ", 'array_cat(anyarray,anyarray)'"
1480 ", 'array_prepend(anyelement,anyarray)'");
1481
1482 if (GET_MAJOR_VERSION(cluster->major_version) >= 903)
1483 appendPQExpBufferStr(&old_polymorphics,
1484 ", 'array_remove(anyarray,anyelement)'"
1485 ", 'array_replace(anyarray,anyelement,anyelement)'");
1486
1487 if (GET_MAJOR_VERSION(cluster->major_version) >= 905)
1488 appendPQExpBufferStr(&old_polymorphics,
1489 ", 'array_position(anyarray,anyelement)'"
1490 ", 'array_position(anyarray,anyelement,integer)'"
1491 ", 'array_positions(anyarray,anyelement)'"
1492 ", 'width_bucket(anyelement,anyarray)'");
1493
1494 /*
1495 * The query below hardcodes FirstNormalObjectId as 16384 rather than
1496 * interpolating that C #define into the query because, if that #define is
1497 * ever changed, the cutoff we want to use is the value used by
1498 * pre-version 14 servers, not that of some future version.
1499 */
1500
1501 /* Aggregate transition functions */
1502 query = psprintf("SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
1503 "FROM pg_proc AS p "
1504 "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
1505 "JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn "
1506 "WHERE p.oid >= 16384 "
1507 "AND a.aggtransfn = ANY(ARRAY[%s]::regprocedure[]) "
1508 "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
1509
1510 /* Aggregate final functions */
1511 "UNION ALL "
1512 "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
1513 "FROM pg_proc AS p "
1514 "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
1515 "JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn "
1516 "WHERE p.oid >= 16384 "
1517 "AND a.aggfinalfn = ANY(ARRAY[%s]::regprocedure[]) "
1518 "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
1519
1520 /* Operators */
1521 "UNION ALL "
1522 "SELECT 'operator' AS objkind, op.oid::regoperator::text AS objname "
1523 "FROM pg_operator AS op "
1524 "WHERE op.oid >= 16384 "
1525 "AND oprcode = ANY(ARRAY[%s]::regprocedure[]) "
1526 "AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[])",
1527 old_polymorphics.data,
1528 old_polymorphics.data,
1529 old_polymorphics.data);
1530
1532 true, &report);
1534 upgrade_task_free(task);
1535
1536 if (report.file)
1537 {
1538 fclose(report.file);
1539 pg_log(PG_REPORT, "fatal");
1540 pg_fatal("Your installation contains user-defined objects that refer to internal\n"
1541 "polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
1542 "These user-defined objects must be dropped before upgrading and restored\n"
1543 "afterwards, changing them to refer to the new corresponding functions with\n"
1544 "arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
1545 "A list of the problematic objects is in the file:\n"
1546 " %s", report.path);
1547 }
1548 else
1549 check_ok();
1550
1551 termPQExpBuffer(&old_polymorphics);
1552 pg_free(query);
1553}
1554
1555/*
1556 * Callback function for processing results of query for
1557 * check_for_tables_with_oids()'s UpgradeTask. If the query returned any rows
1558 * (i.e., the check failed), write the details to the report file.
1559 */
1560static void
1562{
1564 int ntups = PQntuples(res);
1565 int i_nspname = PQfnumber(res, "nspname");
1566 int i_relname = PQfnumber(res, "relname");
1567
1569
1570 if (ntups == 0)
1571 return;
1572
1573 if (report->file == NULL &&
1574 (report->file = fopen_priv(report->path, "w")) == NULL)
1575 pg_fatal("could not open file \"%s\": %m", report->path);
1576
1577 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1578
1579 for (int rowno = 0; rowno < ntups; rowno++)
1580 fprintf(report->file, " %s.%s\n",
1581 PQgetvalue(res, rowno, i_nspname),
1582 PQgetvalue(res, rowno, i_relname));
1583}
1584
1585/*
1586 * Verify that no tables are declared WITH OIDS.
1587 */
1588static void
1590{
1591 UpgradeTaskReport report;
1593 const char *query = "SELECT n.nspname, c.relname "
1594 "FROM pg_catalog.pg_class c, "
1595 " pg_catalog.pg_namespace n "
1596 "WHERE c.relnamespace = n.oid AND "
1597 " c.relhasoids AND"
1598 " n.nspname NOT IN ('pg_catalog')";
1599
1600 prep_status("Checking for tables WITH OIDS");
1601
1602 report.file = NULL;
1603 snprintf(report.path, sizeof(report.path), "%s/%s",
1605 "tables_with_oids.txt");
1606
1608 true, &report);
1610 upgrade_task_free(task);
1611
1612 if (report.file)
1613 {
1614 fclose(report.file);
1615 pg_log(PG_REPORT, "fatal");
1616 pg_fatal("Your installation contains tables declared WITH OIDS, which is not\n"
1617 "supported anymore. Consider removing the oid column using\n"
1618 " ALTER TABLE ... SET WITHOUT OIDS;\n"
1619 "A list of tables with the problem is in the file:\n"
1620 " %s", report.path);
1621 }
1622 else
1623 check_ok();
1624}
1625
1626
1627/*
1628 * check_for_pg_role_prefix()
1629 *
1630 * Versions older than 9.6 should not have any pg_* roles
1631 */
1632static void
1634{
1635 PGresult *res;
1636 PGconn *conn = connectToServer(cluster, "template1");
1637 int ntups;
1638 int i_roloid;
1639 int i_rolname;
1640 FILE *script = NULL;
1641 char output_path[MAXPGPATH];
1642
1643 prep_status("Checking for roles starting with \"pg_\"");
1644
1645 snprintf(output_path, sizeof(output_path), "%s/%s",
1647 "pg_role_prefix.txt");
1648
1649 res = executeQueryOrDie(conn,
1650 "SELECT oid AS roloid, rolname "
1651 "FROM pg_catalog.pg_roles "
1652 "WHERE rolname ~ '^pg_'");
1653
1654 ntups = PQntuples(res);
1655 i_roloid = PQfnumber(res, "roloid");
1656 i_rolname = PQfnumber(res, "rolname");
1657 for (int rowno = 0; rowno < ntups; rowno++)
1658 {
1659 if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
1660 pg_fatal("could not open file \"%s\": %m", output_path);
1661 fprintf(script, "%s (oid=%s)\n",
1662 PQgetvalue(res, rowno, i_rolname),
1663 PQgetvalue(res, rowno, i_roloid));
1664 }
1665
1666 PQclear(res);
1667
1668 PQfinish(conn);
1669
1670 if (script)
1671 {
1672 fclose(script);
1673 pg_log(PG_REPORT, "fatal");
1674 pg_fatal("Your installation contains roles starting with \"pg_\".\n"
1675 "\"pg_\" is a reserved prefix for system roles. The cluster\n"
1676 "cannot be upgraded until these roles are renamed.\n"
1677 "A list of roles starting with \"pg_\" is in the file:\n"
1678 " %s", output_path);
1679 }
1680 else
1681 check_ok();
1682}
1683
1684/*
1685 * Callback function for processing results of query for
1686 * check_for_user_defined_encoding_conversions()'s UpgradeTask. If the query
1687 * returned any rows (i.e., the check failed), write the details to the report
1688 * file.
1689 */
1690static void
1692{
1694 int ntups = PQntuples(res);
1695 int i_conoid = PQfnumber(res, "conoid");
1696 int i_conname = PQfnumber(res, "conname");
1697 int i_nspname = PQfnumber(res, "nspname");
1698
1701
1702 if (ntups == 0)
1703 return;
1704
1705 if (report->file == NULL &&
1706 (report->file = fopen_priv(report->path, "w")) == NULL)
1707 pg_fatal("could not open file \"%s\": %m", report->path);
1708
1709 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1710
1711 for (int rowno = 0; rowno < ntups; rowno++)
1712 fprintf(report->file, " (oid=%s) %s.%s\n",
1713 PQgetvalue(res, rowno, i_conoid),
1714 PQgetvalue(res, rowno, i_nspname),
1715 PQgetvalue(res, rowno, i_conname));
1716}
1717
1718/*
1719 * Verify that no user-defined encoding conversions exist.
1720 */
1721static void
1723{
1724 UpgradeTaskReport report;
1726 const char *query;
1727
1728 prep_status("Checking for user-defined encoding conversions");
1729
1730 report.file = NULL;
1731 snprintf(report.path, sizeof(report.path), "%s/%s",
1733 "encoding_conversions.txt");
1734
1735 /*
1736 * The query below hardcodes FirstNormalObjectId as 16384 rather than
1737 * interpolating that C #define into the query because, if that #define is
1738 * ever changed, the cutoff we want to use is the value used by
1739 * pre-version 14 servers, not that of some future version.
1740 */
1741 query = "SELECT c.oid as conoid, c.conname, n.nspname "
1742 "FROM pg_catalog.pg_conversion c, "
1743 " pg_catalog.pg_namespace n "
1744 "WHERE c.connamespace = n.oid AND "
1745 " c.oid >= 16384";
1746
1747 upgrade_task_add_step(task, query,
1749 true, &report);
1751 upgrade_task_free(task);
1752
1753 if (report.file)
1754 {
1755 fclose(report.file);
1756 pg_log(PG_REPORT, "fatal");
1757 pg_fatal("Your installation contains user-defined encoding conversions.\n"
1758 "The conversion function parameters changed in PostgreSQL version 14\n"
1759 "so this cluster cannot currently be upgraded. You can remove the\n"
1760 "encoding conversions in the old cluster and restart the upgrade.\n"
1761 "A list of user-defined encoding conversions is in the file:\n"
1762 " %s", report.path);
1763 }
1764 else
1765 check_ok();
1766}
1767
1768/*
1769 * Callback function for processing results of query for
1770 * check_for_unicode_update()'s UpgradeTask. If the query returned any rows
1771 * (i.e., the check failed), write the details to the report file.
1772 */
1773static void
1775{
1777 int ntups = PQntuples(res);
1778 int i_reloid = PQfnumber(res, "reloid");
1779 int i_nspname = PQfnumber(res, "nspname");
1780 int i_relname = PQfnumber(res, "relname");
1781
1782 if (ntups == 0)
1783 return;
1784
1785 if (report->file == NULL &&
1786 (report->file = fopen_priv(report->path, "w")) == NULL)
1787 pg_fatal("could not open file \"%s\": %m", report->path);
1788
1789 fprintf(report->file, "In database: %s\n", dbinfo->db_name);
1790
1791 for (int rowno = 0; rowno < ntups; rowno++)
1792 fprintf(report->file, " (oid=%s) %s.%s\n",
1793 PQgetvalue(res, rowno, i_reloid),
1794 PQgetvalue(res, rowno, i_nspname),
1795 PQgetvalue(res, rowno, i_relname));
1796}
1797
1798/*
1799 * Check if the Unicode version built into Postgres changed between the old
1800 * cluster and the new cluster.
1801 */
1802static bool
1804{
1805 PGconn *conn_template1 = connectToServer(cluster, "template1");
1806 PGresult *res;
1807 char *old_unicode_version;
1808 bool unicode_updated;
1809
1810 res = executeQueryOrDie(conn_template1, "SELECT unicode_version()");
1811 old_unicode_version = PQgetvalue(res, 0, 0);
1812 unicode_updated = (strcmp(old_unicode_version, PG_UNICODE_VERSION) != 0);
1813
1814 PQclear(res);
1815 PQfinish(conn_template1);
1816
1817 return unicode_updated;
1818}
1819
1820/*
1821 * check_for_unicode_update()
1822 *
1823 * Check if the version of Unicode in the old server and the new server
1824 * differ. If so, check for indexes, partitioned tables, or constraints that
1825 * use expressions with functions dependent on Unicode behavior.
1826 */
1827static void
1829{
1830 UpgradeTaskReport report;
1831 UpgradeTask *task;
1832 const char *query;
1833
1834 /*
1835 * The builtin provider did not exist prior to version 17. While there are
1836 * still problems that could potentially be caught from earlier versions,
1837 * such as an index on NORMALIZE(), we don't check for that here.
1838 */
1839 if (GET_MAJOR_VERSION(cluster->major_version) < 1700)
1840 return;
1841
1842 prep_status("Checking for objects affected by Unicode update");
1843
1845 {
1846 check_ok();
1847 return;
1848 }
1849
1850 report.file = NULL;
1851 snprintf(report.path, sizeof(report.path), "%s/%s",
1853 "unicode_dependent_rels.txt");
1854
1855 query =
1856 /* collations that use built-in Unicode for character semantics */
1857 "WITH collations(collid) AS ( "
1858 " SELECT oid FROM pg_collation "
1859 " WHERE collprovider='b' AND colllocale IN ('C.UTF-8','PG_UNICODE_FAST') "
1860 /* include default collation, if appropriate */
1861 " UNION "
1862 " SELECT 'pg_catalog.default'::regcollation FROM pg_database "
1863 " WHERE datname = current_database() AND "
1864 " datlocprovider='b' AND datlocale IN ('C.UTF-8','PG_UNICODE_FAST') "
1865 "), "
1866 /* functions that use built-in Unicode */
1867 "functions(procid) AS ( "
1868 " SELECT proc.oid FROM pg_proc proc "
1869 " WHERE proname IN ('normalize','unicode_assigned','unicode_version','is_normalized') AND "
1870 " pronamespace='pg_catalog'::regnamespace "
1871 "), "
1872 /* operators that use the input collation for character semantics */
1873 "coll_operators(operid, procid, collid) AS ( "
1874 " SELECT oper.oid, oper.oprcode, collid FROM pg_operator oper, collations "
1875 " WHERE oprname IN ('~', '~*', '!~', '!~*', '~~*', '!~~*') AND "
1876 " oprnamespace='pg_catalog'::regnamespace AND "
1877 " oprright='text'::regtype "
1878 "), "
1879 /* functions that use the input collation for character semantics */
1880 "coll_functions(procid, collid) AS ( "
1881 " SELECT proc.oid, collid FROM pg_proc proc, collations "
1882 " WHERE proname IN ('lower','initcap','upper') AND "
1883 " pronamespace='pg_catalog'::regnamespace AND "
1884 " proargtypes[0] = 'text'::regtype "
1885 /* include functions behind the operators listed above */
1886 " UNION "
1887 " SELECT procid, collid FROM coll_operators "
1888 "), "
1889
1890 /*
1891 * Generate patterns to search a pg_node_tree for the above functions and
1892 * operators.
1893 */
1894 "patterns(p) AS ( "
1895 " SELECT '{FUNCEXPR :funcid ' || procid::text || '[ }]' FROM functions "
1896 " UNION "
1897 " SELECT '{OPEXPR :opno ' || operid::text || ' (:\\w+ \\w+ )*' || "
1898 " ':inputcollid ' || collid::text || '[ }]' FROM coll_operators "
1899 " UNION "
1900 " SELECT '{FUNCEXPR :funcid ' || procid::text || ' (:\\w+ \\w+ )*' || "
1901 " ':inputcollid ' || collid::text || '[ }]' FROM coll_functions "
1902 ") "
1903
1904 /*
1905 * Match the patterns against expressions used for relation contents.
1906 */
1907 "SELECT reloid, relkind, nspname, relname "
1908 " FROM ( "
1909 " SELECT conrelid "
1910 " FROM pg_constraint, patterns WHERE conbin::text ~ p "
1911 " UNION "
1912 " SELECT indexrelid "
1913 " FROM pg_index, patterns WHERE indexprs::text ~ p OR indpred::text ~ p "
1914 " UNION "
1915 " SELECT partrelid "
1916 " FROM pg_partitioned_table, patterns WHERE partexprs::text ~ p "
1917 " UNION "
1918 " SELECT ev_class "
1919 " FROM pg_rewrite, pg_class, patterns "
1920 " WHERE ev_class = pg_class.oid AND relkind = 'm' AND ev_action::text ~ p"
1921 " ) s(reloid), pg_class c, pg_namespace n, pg_database d "
1922 " WHERE s.reloid = c.oid AND c.relnamespace = n.oid AND "
1923 " d.datname = current_database() AND "
1924 " d.encoding = pg_char_to_encoding('UTF8');";
1925
1926 task = upgrade_task_create();
1927 upgrade_task_add_step(task, query,
1929 true, &report);
1931 upgrade_task_free(task);
1932
1933 if (report.file)
1934 {
1935 fclose(report.file);
1936 report_status(PG_WARNING, "warning");
1937 pg_log(PG_WARNING, "Your installation contains relations that may be affected by a new version of Unicode.\n"
1938 "A list of potentially-affected relations is in the file:\n"
1939 " %s", report.path);
1940 }
1941 else
1942 check_ok();
1943}
1944
1945/*
1946 * check_new_cluster_logical_replication_slots()
1947 *
1948 * Verify that there are no logical replication slots on the new cluster and
1949 * that the parameter settings necessary for creating slots are sufficient.
1950 */
1951static void
1953{
1954 PGresult *res;
1955 PGconn *conn;
1956 int nslots_on_old;
1957 int nslots_on_new;
1959 char *wal_level;
1960
1961 /* Logical slots can be migrated since PG17. */
1963 return;
1964
1965 nslots_on_old = count_old_cluster_logical_slots();
1966
1967 /* Quick return if there are no logical slots to be migrated. */
1968 if (nslots_on_old == 0)
1969 return;
1970
1971 conn = connectToServer(&new_cluster, "template1");
1972
1973 prep_status("Checking for new cluster logical replication slots");
1974
1975 res = executeQueryOrDie(conn, "SELECT count(*) "
1976 "FROM pg_catalog.pg_replication_slots "
1977 "WHERE slot_type = 'logical' AND "
1978 "temporary IS FALSE;");
1979
1980 if (PQntuples(res) != 1)
1981 pg_fatal("could not count the number of logical replication slots");
1982
1983 nslots_on_new = atoi(PQgetvalue(res, 0, 0));
1984
1985 if (nslots_on_new)
1986 pg_fatal("expected 0 logical replication slots but found %d",
1987 nslots_on_new);
1988
1989 PQclear(res);
1990
1991 res = executeQueryOrDie(conn, "SELECT setting FROM pg_settings "
1992 "WHERE name IN ('wal_level', 'max_replication_slots') "
1993 "ORDER BY name DESC;");
1994
1995 if (PQntuples(res) != 2)
1996 pg_fatal("could not determine parameter settings on new cluster");
1997
1998 wal_level = PQgetvalue(res, 0, 0);
1999
2000 if (strcmp(wal_level, "logical") != 0)
2001 pg_fatal("\"wal_level\" must be \"logical\" but is set to \"%s\"",
2002 wal_level);
2003
2004 max_replication_slots = atoi(PQgetvalue(res, 1, 0));
2005
2006 if (nslots_on_old > max_replication_slots)
2007 pg_fatal("\"max_replication_slots\" (%d) must be greater than or equal to the number of "
2008 "logical replication slots (%d) on the old cluster",
2009 max_replication_slots, nslots_on_old);
2010
2011 PQclear(res);
2012 PQfinish(conn);
2013
2014 check_ok();
2015}
2016
2017/*
2018 * check_new_cluster_subscription_configuration()
2019 *
2020 * Verify that the max_active_replication_origins configuration specified is
2021 * enough for creating the subscriptions. This is required to create the
2022 * replication origin for each subscription.
2023 */
2024static void
2026{
2027 PGresult *res;
2028 PGconn *conn;
2030
2031 /* Subscriptions and their dependencies can be migrated since PG17. */
2033 return;
2034
2035 /* Quick return if there are no subscriptions to be migrated. */
2036 if (old_cluster.nsubs == 0)
2037 return;
2038
2039 prep_status("Checking for new cluster configuration for subscriptions");
2040
2041 conn = connectToServer(&new_cluster, "template1");
2042
2043 res = executeQueryOrDie(conn, "SELECT setting FROM pg_settings "
2044 "WHERE name = 'max_active_replication_origins';");
2045
2046 if (PQntuples(res) != 1)
2047 pg_fatal("could not determine parameter settings on new cluster");
2048
2049 max_active_replication_origins = atoi(PQgetvalue(res, 0, 0));
2051 pg_fatal("\"max_active_replication_origins\" (%d) must be greater than or equal to the number of "
2052 "subscriptions (%d) on the old cluster",
2054
2055 PQclear(res);
2056 PQfinish(conn);
2057
2058 check_ok();
2059}
2060
2061/*
2062 * check_old_cluster_for_valid_slots()
2063 *
2064 * Verify that all the logical slots are valid and have consumed all the WAL
2065 * before shutdown.
2066 */
2067static void
2069{
2070 char output_path[MAXPGPATH];
2071 FILE *script = NULL;
2072
2073 prep_status("Checking for valid logical replication slots");
2074
2075 snprintf(output_path, sizeof(output_path), "%s/%s",
2077 "invalid_logical_slots.txt");
2078
2079 for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
2080 {
2081 LogicalSlotInfoArr *slot_arr = &old_cluster.dbarr.dbs[dbnum].slot_arr;
2082
2083 for (int slotnum = 0; slotnum < slot_arr->nslots; slotnum++)
2084 {
2085 LogicalSlotInfo *slot = &slot_arr->slots[slotnum];
2086
2087 /* Is the slot usable? */
2088 if (slot->invalid)
2089 {
2090 if (script == NULL &&
2091 (script = fopen_priv(output_path, "w")) == NULL)
2092 pg_fatal("could not open file \"%s\": %m", output_path);
2093
2094 fprintf(script, "The slot \"%s\" is invalid\n",
2095 slot->slotname);
2096
2097 continue;
2098 }
2099
2100 /*
2101 * Do additional check to ensure that all logical replication
2102 * slots have consumed all the WAL before shutdown.
2103 *
2104 * Note: This can be satisfied only when the old cluster has been
2105 * shut down, so we skip this for live checks.
2106 */
2107 if (!user_opts.live_check && !slot->caught_up)
2108 {
2109 if (script == NULL &&
2110 (script = fopen_priv(output_path, "w")) == NULL)
2111 pg_fatal("could not open file \"%s\": %m", output_path);
2112
2113 fprintf(script,
2114 "The slot \"%s\" has not consumed the WAL yet\n",
2115 slot->slotname);
2116 }
2117 }
2118 }
2119
2120 if (script)
2121 {
2122 fclose(script);
2123
2124 pg_log(PG_REPORT, "fatal");
2125 pg_fatal("Your installation contains logical replication slots that cannot be upgraded.\n"
2126 "You can remove invalid slots and/or consume the pending WAL for other slots,\n"
2127 "and then restart the upgrade.\n"
2128 "A list of the problematic slots is in the file:\n"
2129 " %s", output_path);
2130 }
2131
2132 check_ok();
2133}
2134
2135/*
2136 * Callback function for processing results of query for
2137 * check_old_cluster_subscription_state()'s UpgradeTask. If the query returned
2138 * any rows (i.e., the check failed), write the details to the report file.
2139 */
2140static void
2142{
2144 int ntups = PQntuples(res);
2145 int i_srsubstate = PQfnumber(res, "srsubstate");
2146 int i_subname = PQfnumber(res, "subname");
2147 int i_nspname = PQfnumber(res, "nspname");
2148 int i_relname = PQfnumber(res, "relname");
2149
2151
2152 if (ntups == 0)
2153 return;
2154
2155 if (report->file == NULL &&
2156 (report->file = fopen_priv(report->path, "w")) == NULL)
2157 pg_fatal("could not open file \"%s\": %m", report->path);
2158
2159 for (int i = 0; i < ntups; i++)
2160 fprintf(report->file, "The table sync state \"%s\" is not allowed for database:\"%s\" subscription:\"%s\" schema:\"%s\" relation:\"%s\"\n",
2161 PQgetvalue(res, i, i_srsubstate),
2162 dbinfo->db_name,
2163 PQgetvalue(res, i, i_subname),
2164 PQgetvalue(res, i, i_nspname),
2165 PQgetvalue(res, i, i_relname));
2166}
2167
2168/*
2169 * check_old_cluster_subscription_state()
2170 *
2171 * Verify that the replication origin corresponding to each of the
2172 * subscriptions are present and each of the subscribed tables is in
2173 * 'i' (initialize) or 'r' (ready) state.
2174 */
2175static void
2177{
2179 UpgradeTaskReport report;
2180 const char *query;
2181 PGresult *res;
2182 PGconn *conn;
2183 int ntup;
2184
2185 prep_status("Checking for subscription state");
2186
2187 report.file = NULL;
2188 snprintf(report.path, sizeof(report.path), "%s/%s",
2190 "subs_invalid.txt");
2191
2192 /*
2193 * Check that all the subscriptions have their respective replication
2194 * origin. This check only needs to run once.
2195 */
2197 res = executeQueryOrDie(conn,
2198 "SELECT d.datname, s.subname "
2199 "FROM pg_catalog.pg_subscription s "
2200 "LEFT OUTER JOIN pg_catalog.pg_replication_origin o "
2201 " ON o.roname = 'pg_' || s.oid "
2202 "INNER JOIN pg_catalog.pg_database d "
2203 " ON d.oid = s.subdbid "
2204 "WHERE o.roname IS NULL;");
2205 ntup = PQntuples(res);
2206 for (int i = 0; i < ntup; i++)
2207 {
2208 if (report.file == NULL &&
2209 (report.file = fopen_priv(report.path, "w")) == NULL)
2210 pg_fatal("could not open file \"%s\": %m", report.path);
2211 fprintf(report.file, "The replication origin is missing for database:\"%s\" subscription:\"%s\"\n",
2212 PQgetvalue(res, i, 0),
2213 PQgetvalue(res, i, 1));
2214 }
2215 PQclear(res);
2216 PQfinish(conn);
2217
2218 /*
2219 * We don't allow upgrade if there is a risk of dangling slot or origin
2220 * corresponding to initial sync after upgrade.
2221 *
2222 * A slot/origin not created yet refers to the 'i' (initialize) state,
2223 * while 'r' (ready) state refers to a slot/origin created previously but
2224 * already dropped. These states are supported for pg_upgrade. The other
2225 * states listed below are not supported:
2226 *
2227 * a) SUBREL_STATE_DATASYNC: A relation upgraded while in this state would
2228 * retain a replication slot, which could not be dropped by the sync
2229 * worker spawned after the upgrade because the subscription ID used for
2230 * the slot name won't match anymore.
2231 *
2232 * b) SUBREL_STATE_SYNCDONE: A relation upgraded while in this state would
2233 * retain the replication origin when there is a failure in tablesync
2234 * worker immediately after dropping the replication slot in the
2235 * publisher.
2236 *
2237 * c) SUBREL_STATE_FINISHEDCOPY: A tablesync worker spawned to work on a
2238 * relation upgraded while in this state would expect an origin ID with
2239 * the OID of the subscription used before the upgrade, causing it to
2240 * fail.
2241 *
2242 * d) SUBREL_STATE_SYNCWAIT, SUBREL_STATE_CATCHUP and
2243 * SUBREL_STATE_UNKNOWN: These states are not stored in the catalog, so we
2244 * need not allow these states.
2245 */
2246 query = "SELECT r.srsubstate, s.subname, n.nspname, c.relname "
2247 "FROM pg_catalog.pg_subscription_rel r "
2248 "LEFT JOIN pg_catalog.pg_subscription s"
2249 " ON r.srsubid = s.oid "
2250 "LEFT JOIN pg_catalog.pg_class c"
2251 " ON r.srrelid = c.oid "
2252 "LEFT JOIN pg_catalog.pg_namespace n"
2253 " ON c.relnamespace = n.oid "
2254 "WHERE r.srsubstate NOT IN ('i', 'r') "
2255 "ORDER BY s.subname";
2256
2258 true, &report);
2259
2261 upgrade_task_free(task);
2262
2263 if (report.file)
2264 {
2265 fclose(report.file);
2266 pg_log(PG_REPORT, "fatal");
2267 pg_fatal("Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n"
2268 "You can allow the initial sync to finish for all relations and then restart the upgrade.\n"
2269 "A list of the problematic subscriptions is in the file:\n"
2270 " %s", report.path);
2271 }
2272 else
2273 check_ok();
2274}
#define gettext_noop(x)
Definition: c.h:1167
#define AssertVariableIsOfType(varname, typename)
Definition: c.h:952
#define CppAsString2(x)
Definition: c.h:363
void check_cluster_versions(void)
Definition: check.c:841
static void check_for_tables_with_oids(ClusterInfo *cluster)
Definition: check.c:1589
static void check_for_pg_role_prefix(ClusterInfo *cluster)
Definition: check.c:1633
static void process_old_sub_state_check(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:2141
static void check_for_data_types_usage(ClusterInfo *cluster)
Definition: check.c:463
static bool unicode_version_changed(ClusterInfo *cluster)
Definition: check.c:1803
static char * data_type_check_query(int checknum)
Definition: check.c:332
static void process_incompat_polymorphics(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1428
static DataTypesUsageChecks data_types_usage_checks[]
Definition: check.c:97
static void process_with_oids_check(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1561
static void check_new_cluster_logical_replication_slots(void)
Definition: check.c:1952
static void check_old_cluster_subscription_state(void)
Definition: check.c:2176
#define ALL_VERSIONS
Definition: check.c:62
void issue_warnings_and_set_wal_level(void)
Definition: check.c:783
static void process_unicode_update(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1774
static void check_for_unicode_update(ClusterInfo *cluster)
Definition: check.c:1828
void check_cluster_compatibility(void)
Definition: check.c:896
#define MANUAL_CHECK
Definition: check.c:61
void check_new_cluster(void)
Definition: check.c:701
void report_clusters_compatible(void)
Definition: check.c:764
static void check_is_install_user(ClusterInfo *cluster)
Definition: check.c:1069
static void check_new_cluster_subscription_configuration(void)
Definition: check.c:2025
void create_script_for_old_cluster_deletion(char **deletion_script_file_name)
Definition: check.c:971
static void check_for_connection_status(ClusterInfo *cluster)
Definition: check.c:1127
static void process_user_defined_encoding_conversions(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1691
static void process_data_type_check(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:389
void check_and_dump_old_cluster(void)
Definition: check.c:588
static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
Definition: check.c:1281
static char * fix_path_separator(char *path)
Definition: check.c:549
static void check_new_cluster_is_empty(void)
Definition: check.c:910
static void check_old_cluster_for_valid_slots(void)
Definition: check.c:2068
static void process_isn_and_int8_passing_mismatch(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1248
static void check_for_user_defined_postfix_ops(ClusterInfo *cluster)
Definition: check.c:1369
void output_completion_banner(char *deletion_script_file_name)
Definition: check.c:804
static void check_for_prepared_transactions(ClusterInfo *cluster)
Definition: check.c:1215
static void check_for_new_tablespace_dir(void)
Definition: check.c:942
static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
Definition: check.c:1722
static void check_for_incompatible_polymorphics(ClusterInfo *cluster)
Definition: check.c:1460
void output_check_banner(void)
Definition: check.c:570
static void process_user_defined_postfix_ops(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: check.c:1334
void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel)
Definition: cluster.c:107
void get_control_data(ClusterInfo *cluster)
Definition: controldata.c:38
void check_control_data(ControlData *oldctrl, ControlData *newctrl)
Definition: controldata.c:698
#define fprintf(file, fmt, msg)
Definition: cubescan.l:21
void generate_old_dump(void)
Definition: dump.c:16
#define _(x)
Definition: elog.c:91
void PQfinish(PGconn *conn)
Definition: fe-connect.c:5296
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3876
void PQclear(PGresult *res)
Definition: fe-exec.c:721
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3481
int PQfnumber(const PGresult *res, const char *field_name)
Definition: fe-exec.c:3589
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
void pg_free(void *ptr)
Definition: fe_memutils.c:105
void check_file_clone(void)
Definition: file.c:360
void check_hard_link(transferMode transfer_mode)
Definition: file.c:437
void check_copy_file_range(void)
Definition: file.c:400
void check_loadable_libraries(void)
Definition: function.c:165
void get_loadable_libraries(void)
Definition: function.c:79
Assert(PointerIsAligned(start, uint64))
void get_subscription_count(ClusterInfo *cluster)
Definition: info.c:760
int count_old_cluster_logical_slots(void)
Definition: info.c:744
void get_db_rel_and_slot_infos(ClusterInfo *cluster)
Definition: info.c:280
static void check_ok(void)
Definition: initdb.c:2109
int i
Definition: isn.c:77
void pfree(void *pointer)
Definition: mcxt.c:2152
int max_active_replication_origins
Definition: origin.c:104
void * arg
#define pg_fatal(...)
#define MAXPGPATH
static pid_t start_postmaster(void)
Definition: pg_ctl.c:440
NameData datname
Definition: pg_database.h:35
bool datallowconn
Definition: pg_database.h:50
int32 datconnlimit
Definition: pg_database.h:59
OSInfo os_info
Definition: pg_upgrade.c:73
ClusterInfo new_cluster
Definition: pg_upgrade.c:72
ClusterInfo old_cluster
Definition: pg_upgrade.c:71
UpgradeTask * upgrade_task_create(void)
Definition: task.c:117
void init_tablespaces(void)
Definition: tablespace.c:19
bool(* DataTypesUsageVersionCheck)(ClusterInfo *cluster)
Definition: pg_upgrade.h:366
PGconn * connectToServer(ClusterInfo *cluster, const char *db_name)
Definition: server.c:28
bool jsonb_9_4_check_applicable(ClusterInfo *cluster)
Definition: version.c:21
void upgrade_task_run(const UpgradeTask *task, const ClusterInfo *cluster)
Definition: task.c:420
#define RMDIR_CMD
Definition: pg_upgrade.h:85
void cleanup_output_dirs(void)
Definition: util.c:63
void report_extension_updates(ClusterInfo *cluster)
Definition: version.c:179
void void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2
@ TRANSFER_MODE_COPY
Definition: pg_upgrade.h:262
@ TRANSFER_MODE_LINK
Definition: pg_upgrade.h:264
@ TRANSFER_MODE_SWAP
Definition: pg_upgrade.h:265
@ TRANSFER_MODE_CLONE
Definition: pg_upgrade.h:261
@ TRANSFER_MODE_COPY_FILE_RANGE
Definition: pg_upgrade.h:263
#define SCRIPT_EXT
Definition: pg_upgrade.h:87
#define SCRIPT_PREFIX
Definition: pg_upgrade.h:86
PGresult * executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2
#define PATH_QUOTE
Definition: pg_upgrade.h:83
LogOpts log_opts
Definition: util.c:17
void upgrade_task_free(UpgradeTask *task)
Definition: task.c:133
#define fopen_priv(path, mode)
Definition: pg_upgrade.h:430
void(* UpgradeTaskProcessCB)(DbInfo *dbinfo, PGresult *res, void *arg)
Definition: pg_upgrade.h:511
@ PG_WARNING
Definition: pg_upgrade.h:277
@ PG_REPORT
Definition: pg_upgrade.h:276
#define GET_MAJOR_VERSION(v)
Definition: pg_upgrade.h:27
void stop_postmaster(bool in_atexit)
Definition: server.c:349
void prep_status(const char *fmt,...) pg_attribute_printf(1
void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2
void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
Definition: version.c:37
void upgrade_task_add_step(UpgradeTask *task, const char *query, UpgradeTaskProcessCB process_cb, bool free_result, void *arg)
Definition: task.c:151
bool path_is_prefix_of_path(const char *path1, const char *path2)
Definition: path.c:637
void canonicalize_path(char *path)
Definition: path.c:337
#define snprintf
Definition: port.h:239
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
#define atooid(x)
Definition: postgres_ext.h:41
PQExpBuffer createPQExpBuffer(void)
Definition: pqexpbuffer.c:72
void initPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:90
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
Definition: pqexpbuffer.c:265
void destroyPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:114
void appendPQExpBufferChar(PQExpBuffer str, char ch)
Definition: pqexpbuffer.c:378
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
Definition: pqexpbuffer.c:367
void termPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:129
char * c
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
int max_replication_slots
Definition: slot.c:150
UserOpts user_opts
Definition: option.c:30
PGconn * conn
Definition: streamutil.c:52
void appendShellString(PQExpBuffer buf, const char *str)
Definition: string_utils.c:582
char * pgdata
Definition: pg_upgrade.h:292
unsigned short port
Definition: pg_upgrade.h:299
ControlData controldata
Definition: pg_upgrade.h:289
char * bindir
Definition: pg_upgrade.h:295
uint32 bin_version
Definition: pg_upgrade.h:302
DbInfoArr dbarr
Definition: pg_upgrade.h:291
uint32 major_version
Definition: pg_upgrade.h:300
const char * tablespace_suffix
Definition: pg_upgrade.h:303
bool float8_pass_by_value
Definition: pg_upgrade.h:251
const char * report_text
Definition: check.c:49
int threshold_version
Definition: check.c:51
DataTypesUsageVersionCheck version_hook
Definition: check.c:53
const char * status
Definition: check.c:43
const char * report_filename
Definition: check.c:45
const char * base_query
Definition: check.c:47
DbInfo * dbs
Definition: pg_upgrade.h:220
LogicalSlotInfoArr slot_arr
Definition: pg_upgrade.h:203
char * db_name
Definition: pg_upgrade.h:199
RelInfoArr rel_arr
Definition: pg_upgrade.h:202
char * basedir
Definition: pg_upgrade.h:318
LogicalSlotInfo * slots
Definition: pg_upgrade.h:174
int num_old_tablespaces
Definition: pg_upgrade.h:358
char * user
Definition: pg_upgrade.h:355
char ** old_tablespaces
Definition: pg_upgrade.h:357
bool user_specified
Definition: pg_upgrade.h:356
RelInfo * rels
Definition: pg_upgrade.h:153
char * nspname
Definition: pg_upgrade.h:140
char * relname
Definition: pg_upgrade.h:141
char path[MAXPGPATH]
Definition: pg_upgrade.h:527
bool live_check
Definition: pg_upgrade.h:331
int char_signedness
Definition: pg_upgrade.h:338
transferMode transfer_mode
Definition: pg_upgrade.h:333
bool check
Definition: pg_upgrade.h:330
PQExpBuffer * report
Definition: check.c:324
DataTypesUsageChecks * check
Definition: check.c:322
Definition: regguts.h:323
#define PG_UNICODE_VERSION
#define stat
Definition: win32_port.h:274
#define S_IRWXU
Definition: win32_port.h:288
int wal_level
Definition: xlog.c:131