PostgreSQL Source Code  git master
pg_upgrade.h
Go to the documentation of this file.
1 /*
2  * pg_upgrade.h
3  *
4  * Copyright (c) 2010-2019, PostgreSQL Global Development Group
5  * src/bin/pg_upgrade/pg_upgrade.h
6  */
7 
8 #include <unistd.h>
9 #include <assert.h>
10 #include <sys/stat.h>
11 #include <sys/time.h>
12 
13 #include "libpq-fe.h"
14 
15 /* Use port in the private/dynamic port number range */
16 #define DEF_PGUPORT 50432
17 
18 #define MAX_STRING 1024
19 #define QUERY_ALLOC 8192
20 
21 #define MESSAGE_WIDTH 60
22 
23 #define GET_MAJOR_VERSION(v) ((v) / 100)
24 
25 /* contains both global db information and CREATE DATABASE commands */
26 #define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
27 #define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
28 
29 #define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
30 #define SERVER_LOG_FILE "pg_upgrade_server.log"
31 #define UTILITY_LOG_FILE "pg_upgrade_utility.log"
32 #define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
33 
34 extern char *output_files[];
35 
36 /*
37  * WIN32 files do not accept writes from multiple processes
38  *
39  * On Win32, we can't send both pg_upgrade output and command output to the
40  * same file because we get the error: "The process cannot access the file
41  * because it is being used by another process." so send the pg_ctl
42  * command-line output to a new file, rather than into the server log file.
43  * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
44  * keep the pg_ctl output file open by the running postmaster, even after
45  * pg_ctl exits.
46  *
47  * We could use the Windows pgwin32_open() flags to allow shared file
48  * writes but is unclear how all other tools would use those flags, so
49  * we just avoid it and log a little differently on Windows; we adjust
50  * the error message appropriately.
51  */
52 #ifndef WIN32
53 #define SERVER_START_LOG_FILE SERVER_LOG_FILE
54 #define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
55 #else
56 #define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
57 /*
58  * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
59  * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
60  * stop".
61  */
62 #define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
63 #endif
64 
65 
66 #ifndef WIN32
67 #define pg_mv_file rename
68 #define pg_link_file link
69 #define PATH_SEPARATOR '/'
70 #define PATH_QUOTE '\''
71 #define RM_CMD "rm -f"
72 #define RMDIR_CMD "rm -rf"
73 #define SCRIPT_PREFIX "./"
74 #define SCRIPT_EXT "sh"
75 #define ECHO_QUOTE "'"
76 #define ECHO_BLANK ""
77 #else
78 #define pg_mv_file pgrename
79 #define pg_link_file win32_pghardlink
80 #define PATH_SEPARATOR '\\'
81 #define PATH_QUOTE '"'
82 #define RM_CMD "DEL /q"
83 #define RMDIR_CMD "RMDIR /s/q"
84 #define SCRIPT_PREFIX ""
85 #define SCRIPT_EXT "bat"
86 #define EXE_EXT ".exe"
87 #define ECHO_QUOTE ""
88 #define ECHO_BLANK "."
89 #endif
90 
91 
92 /*
93  * postmaster/postgres -b (binary_upgrade) flag added during PG 9.1
94  * development
95  */
96 #define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
97 
98 /*
99  * Visibility map changed with this 9.2 commit,
100  * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
101  */
102 #define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
103 
104 /*
105  * The format of visibility map is changed with this 9.6 commit,
106  */
107 #define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
108 
109 /*
110  * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
111  * ("Improve concurrency of foreign key locking") which also updated catalog
112  * version to this value. pg_upgrade behavior depends on whether old and new
113  * server versions are both newer than this, or only the new one is.
114  */
115 #define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
116 
117 /*
118  * large object chunk size added to pg_controldata,
119  * commit 5f93c37805e7485488480916b4585e098d3cc883
120  */
121 #define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
122 
123 /*
124  * change in JSONB format during 9.4 beta
125  */
126 #define JSONB_FORMAT_CHANGE_CAT_VER 201409291
127 
128 
129 /*
130  * Each relation is represented by a relinfo structure.
131  */
132 typedef struct
133 {
134  /* Can't use NAMEDATALEN; not guaranteed to be same on client */
135  char *nspname; /* namespace name */
136  char *relname; /* relation name */
137  Oid reloid; /* relation OID */
138  Oid relfilenode; /* relation file node */
139  Oid indtable; /* if index, OID of its table, else 0 */
140  Oid toastheap; /* if toast table, OID of base table, else 0 */
141  char *tablespace; /* tablespace path; "" for cluster default */
142  bool nsp_alloc; /* should nspname be freed? */
143  bool tblsp_alloc; /* should tablespace be freed? */
144 } RelInfo;
145 
146 typedef struct
147 {
149  int nrels;
150 } RelInfoArr;
151 
152 /*
153  * The following structure represents a relation mapping.
154  */
155 typedef struct
156 {
157  const char *old_tablespace;
158  const char *new_tablespace;
163 
164  /*
165  * old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
166  * due to VACUUM FULL or REINDEX. Other relfilenodes are preserved.
167  */
170  /* the rest are used only for logging and error reporting */
171  char *nspname; /* namespaces */
172  char *relname;
173 } FileNameMap;
174 
175 /*
176  * Structure to store database information
177  */
178 typedef struct
179 {
180  Oid db_oid; /* oid of the database */
181  char *db_name; /* database name */
182  char db_tablespace[MAXPGPATH]; /* database default tablespace
183  * path */
184  char *db_collate;
185  char *db_ctype;
187  RelInfoArr rel_arr; /* array of all user relinfos */
188 } DbInfo;
189 
190 typedef struct
191 {
192  DbInfo *dbs; /* array of db infos */
193  int ndbs; /* number of db infos */
194 } DbInfoArr;
195 
196 /*
197  * The following structure is used to hold pg_control information.
198  * Rather than using the backend's control structure we use our own
199  * structure to avoid pg_control version issues between releases.
200  */
201 typedef struct
202 {
205  char nextxlogfile[25];
224 } ControlData;
225 
226 /*
227  * Enumeration to denote transfer modes
228  */
229 typedef enum
230 {
234 } transferMode;
235 
236 /*
237  * Enumeration to denote pg_log modes
238  */
239 typedef enum
240 {
246 } eLogType;
247 
248 
249 typedef long pgpid_t;
250 
251 
252 /*
253  * cluster
254  *
255  * information about each cluster
256  */
257 typedef struct
258 {
259  ControlData controldata; /* pg_control information */
260  DbInfoArr dbarr; /* dbinfos array */
261  char *pgdata; /* pathname for cluster's $PGDATA directory */
262  char *pgconfig; /* pathname for cluster's config file
263  * directory */
264  char *bindir; /* pathname for cluster's executable directory */
265  char *pgopts; /* options to pass to the server, like pg_ctl
266  * -o */
267  char *sockdir; /* directory for Unix Domain socket, if any */
268  unsigned short port; /* port number where postmaster is waiting */
269  uint32 major_version; /* PG_VERSION of cluster */
270  char major_version_str[64]; /* string PG_VERSION of cluster */
271  uint32 bin_version; /* version returned from pg_ctl */
272  const char *tablespace_suffix; /* directory specification */
273 } ClusterInfo;
274 
275 
276 /*
277  * LogOpts
278 */
279 typedef struct
280 {
281  FILE *internal; /* internal log FILE */
282  bool verbose; /* true -> be verbose in messages */
283  bool retain; /* retain log files on success */
284 } LogOpts;
285 
286 
287 /*
288  * UserOpts
289 */
290 typedef struct
291 {
292  bool check; /* true -> ask user for permission to make
293  * changes */
294  transferMode transfer_mode; /* copy files or link them? */
295  int jobs; /* number of processes/threads to use */
296  char *socketdir; /* directory to use for Unix sockets */
297 } UserOpts;
298 
299 typedef struct
300 {
301  char *name;
302  int dbnum;
303 } LibraryInfo;
304 
305 /*
306  * OSInfo
307  */
308 typedef struct
309 {
310  const char *progname; /* complete pathname for this program */
311  char *user; /* username for clusters */
312  bool user_specified; /* user specified on command-line */
313  char **old_tablespaces; /* tablespaces */
315  LibraryInfo *libraries; /* loadable libraries */
318 } OSInfo;
319 
320 
321 /*
322  * Global variables
323  */
324 extern LogOpts log_opts;
325 extern UserOpts user_opts;
326 extern ClusterInfo old_cluster,
327  new_cluster;
328 extern OSInfo os_info;
329 
330 
331 /* check.c */
332 
333 void output_check_banner(bool live_check);
334 void check_and_dump_old_cluster(bool live_check);
335 void check_new_cluster(void);
336 void report_clusters_compatible(void);
338 void output_completion_banner(char *analyze_script_file_name,
339  char *deletion_script_file_name);
340 void check_cluster_versions(void);
341 void check_cluster_compatibility(bool live_check);
342 void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
343 void create_script_for_cluster_analyze(char **analyze_script_file_name);
344 
345 
346 /* controldata.c */
347 
348 void get_control_data(ClusterInfo *cluster, bool live_check);
349 void check_control_data(ControlData *oldctrl, ControlData *newctrl);
350 void disable_old_cluster(void);
351 
352 
353 /* dump.c */
354 
355 void generate_old_dump(void);
356 
357 
358 /* exec.c */
359 
360 #define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
361 
362 bool exec_prog(const char *log_file, const char *opt_log_file,
363  bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
364 void verify_directories(void);
365 bool pid_lock_file_exists(const char *datadir);
366 
367 
368 /* file.c */
369 
370 void cloneFile(const char *src, const char *dst,
371  const char *schemaName, const char *relName);
372 void copyFile(const char *src, const char *dst,
373  const char *schemaName, const char *relName);
374 void linkFile(const char *src, const char *dst,
375  const char *schemaName, const char *relName);
376 void rewriteVisibilityMap(const char *fromfile, const char *tofile,
377  const char *schemaName, const char *relName);
378 void check_file_clone(void);
379 void check_hard_link(void);
380 
381 /* fopen_priv() is no longer different from fopen() */
382 #define fopen_priv(path, mode) fopen(path, mode)
383 
384 /* function.c */
385 
386 void get_loadable_libraries(void);
387 void check_loadable_libraries(void);
388 
389 /* info.c */
390 
392  DbInfo *new_db, int *nmaps, const char *old_pgdata,
393  const char *new_pgdata);
395 void print_maps(FileNameMap *maps, int n,
396  const char *db_name);
397 
398 /* option.c */
399 
400 void parseCommandLine(int argc, char *argv[]);
402 void get_sock_dir(ClusterInfo *cluster, bool live_check);
403 
404 /* relfilenode.c */
405 
406 void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
407  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
408 void transfer_all_new_dbs(DbInfoArr *old_db_arr,
409  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
410  char *old_tablespace);
411 
412 /* tablespace.c */
413 
414 void init_tablespaces(void);
415 
416 
417 /* server.c */
418 
419 PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
420 PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
421 
423 
424 bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
425 void stop_postmaster(bool in_atexit);
427 void check_pghost_envvar(void);
428 
429 
430 /* util.c */
431 
432 char *quote_identifier(const char *s);
433 int get_user_info(char **user_name_p);
434 void check_ok(void);
435 void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
436 void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
437 void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
438 void end_progress_output(void);
439 void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
440 void check_ok(void);
441 unsigned int str2uint(const char *str);
442 void pg_putenv(const char *var, const char *val);
443 
444 
445 /* version.c */
446 
448  bool check_mode);
452  bool check_mode);
453 
455 
456 /* parallel.c */
457 void parallel_exec_prog(const char *log_file, const char *opt_log_file,
458  const char *fmt,...) pg_attribute_printf(3, 4);
459 void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
460  char *old_pgdata, char *new_pgdata,
461  char *old_tablespace);
462 bool reap_child(bool wait_for_child);
void copyFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:82
uint32 get_major_server_version(ClusterInfo *cluster)
Definition: server.c:157
bool date_is_int
Definition: pg_upgrade.h:221
char * name
Definition: pg_upgrade.h:301
void transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata)
Definition: relfilenode.c:29
Oid old_relfilenode
Definition: pg_upgrade.h:168
void check_file_clone(void)
Definition: file.c:321
void report_clusters_compatible(void)
Definition: check.c:186
uint32 major_version
Definition: pg_upgrade.h:269
bool void verify_directories(void)
Definition: exec.c:250
unsigned int str2uint(const char *str)
Definition: util.c:240
void transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata, char *old_tablespace)
Definition: relfilenode.c:88
ClusterInfo old_cluster
Definition: pg_upgrade.c:59
void check_new_cluster(void)
Definition: check.c:158
ControlData controldata
Definition: pg_upgrade.h:259
long pgpid_t
Definition: pg_upgrade.h:249
bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
Definition: server.c:196
uint32 chkpnt_nxtoid
Definition: pg_upgrade.h:208
static char * log_file
Definition: pg_ctl.c:91
int num_libraries
Definition: pg_upgrade.h:316
int get_user_info(char **user_name_p)
Definition: util.c:211
uint32 walsz
Definition: pg_upgrade.h:215
void rewriteVisibilityMap(const char *fromfile, const char *tofile, const char *schemaName, const char *relName)
Definition: file.c:177
void check_cluster_compatibility(bool live_check)
Definition: check.c:299
PGresult * executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2
void end_progress_output(void)
Definition: util.c:43
char * relname
Definition: pg_upgrade.h:136
void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
Definition: version.c:299
unsigned short port
Definition: pg_upgrade.h:268
void void void pg_fatal(const char *fmt,...) pg_attribute_printf(1
bool tblsp_alloc
Definition: pg_upgrade.h:143
PGresult char * cluster_conn_opts(ClusterInfo *cluster)
Definition: server.c:90
uint32 index
Definition: pg_upgrade.h:218
LogOpts log_opts
Definition: util.c:17
Oid new_db_oid
Definition: pg_upgrade.h:162
Oid reloid
Definition: pg_upgrade.h:137
unsigned int Oid
Definition: postgres_ext.h:31
void generate_old_dump(void)
Definition: dump.c:16
int jobs
Definition: pg_upgrade.h:295
char * nspname
Definition: pg_upgrade.h:135
Oid db_oid
Definition: pg_upgrade.h:180
bool user_specified
Definition: pg_upgrade.h:312
#define pg_attribute_printf(f, a)
Definition: c.h:132
char * pgopts
Definition: pg_upgrade.h:265
uint32 chkpnt_nxtmxoff
Definition: pg_upgrade.h:210
void check_pghost_envvar(void)
Definition: server.c:354
void check_loadable_libraries(void)
Definition: function.c:180
char * db_ctype
Definition: pg_upgrade.h:185
uint32 blocksz
Definition: pg_upgrade.h:213
uint32 chkpnt_nxtxid
Definition: pg_upgrade.h:206
void get_control_data(ClusterInfo *cluster, bool live_check)
Definition: controldata.c:34
char * pgconfig
Definition: pg_upgrade.h:262
const char * old_tablespace
Definition: pg_upgrade.h:157
void print_maps(FileNameMap *maps, int n, const char *db_name)
Definition: info.c:283
Oid new_relfilenode
Definition: pg_upgrade.h:169
PGconn * conn
Definition: streamutil.c:54
uint32 chkpnt_nxtepoch
Definition: pg_upgrade.h:207
#define MAXPGPATH
RelInfo * rels
Definition: pg_upgrade.h:148
Oid relfilenode
Definition: pg_upgrade.h:138
bool reap_child(bool wait_for_child)
Definition: parallel.c:288
void disable_old_cluster(void)
Definition: controldata.c:676
bool data_checksum_version
Definition: pg_upgrade.h:223
ClusterInfo new_cluster
Definition: pg_upgrade.c:59
void create_script_for_old_cluster_deletion(char **deletion_script_file_name)
Definition: check.c:543
void void void pg_attribute_noreturn()
void prep_status(const char *fmt,...) pg_attribute_printf(1
void new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster, bool check_mode)
Definition: version.c:22
uint32 ident
Definition: pg_upgrade.h:217
void check_control_data(ControlData *oldctrl, ControlData *newctrl)
Definition: controldata.c:619
char * datadir
char * output_files[]
Definition: pg_upgrade.c:63
unsigned int uint32
Definition: c.h:359
void cluster(ClusterStmt *stmt, bool isTopLevel)
Definition: cluster.c:102
LibraryInfo * libraries
Definition: pg_upgrade.h:315
uint32 align
Definition: pg_upgrade.h:212
void check_ok(void)
Definition: util.c:171
void output_completion_banner(char *analyze_script_file_name, char *deletion_script_file_name)
Definition: check.c:226
PGconn * connectToServer(ClusterInfo *cluster, const char *db_name)
Definition: server.c:27
const char * old_tablespace_suffix
Definition: pg_upgrade.h:159
transferMode transfer_mode
Definition: pg_upgrade.h:294
uint32 chkpnt_oldstMulti
Definition: pg_upgrade.h:211
uint32 walseg
Definition: pg_upgrade.h:216
Oid indtable
Definition: pg_upgrade.h:139
bool verbose
Definition: pg_upgrade.h:282
char * bindir
Definition: pg_upgrade.h:264
void linkFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:151
void void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata, char *old_tablespace)
Definition: parallel.c:177
void check_cluster_versions(void)
Definition: check.c:257
uint32 cat_ver
Definition: pg_upgrade.h:204
char ** old_tablespaces
Definition: pg_upgrade.h:313
uint32 chkpnt_nxtmulti
Definition: pg_upgrade.h:209
transferMode
Definition: pg_upgrade.h:229
void stop_postmaster(bool in_atexit)
Definition: server.c:327
uint32 largesz
Definition: pg_upgrade.h:214
void get_sock_dir(ClusterInfo *cluster, bool live_check)
Definition: option.c:468
const char * tablespace_suffix
Definition: pg_upgrade.h:272
void check_hard_link(void)
Definition: file.c:363
uint32 bin_version
Definition: pg_upgrade.h:271
DbInfoArr dbarr
Definition: pg_upgrade.h:260
void void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2
void output_check_banner(bool live_check)
Definition: check.c:61
FileNameMap * gen_db_file_maps(DbInfo *old_db, DbInfo *new_db, int *nmaps, const char *old_pgdata, const char *new_pgdata)
Definition: info.c:39
Oid old_db_oid
Definition: pg_upgrade.h:161
const char * progname
Definition: pg_upgrade.h:310
uint32 toast
Definition: pg_upgrade.h:219
RelInfoArr rel_arr
Definition: pg_upgrade.h:187
bool pid_lock_file_exists(const char *datadir)
Definition: exec.c:219
OSInfo os_info
Definition: pg_upgrade.c:61
static const pg_conv_map maps[]
void get_loadable_libraries(void)
Definition: function.c:53
void parallel_exec_prog(const char *log_file, const char *opt_log_file, const char *fmt,...) pg_attribute_printf(3
uint32 large_object
Definition: pg_upgrade.h:220
bool check
Definition: pg_upgrade.h:292
char * quote_identifier(const char *s)
Definition: ruleutils.c:10626
char * nspname
Definition: pg_upgrade.h:171
int db_encoding
Definition: pg_upgrade.h:186
uint32 ctrl_ver
Definition: pg_upgrade.h:203
ClusterInfo * running_cluster
Definition: pg_upgrade.h:317
void get_db_and_rel_infos(ClusterInfo *cluster)
Definition: info.c:309
void adjust_data_dir(ClusterInfo *cluster)
Definition: option.c:403
void init_tablespaces(void)
Definition: tablespace.c:19
char * pgdata
Definition: pg_upgrade.h:261
char * sockdir
Definition: pg_upgrade.h:267
UserOpts user_opts
Definition: option.c:30
int num_old_tablespaces
Definition: pg_upgrade.h:314
bool exec_prog(const char *log_file, const char *opt_log_file, bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5
void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2
char * tablespace
Definition: pg_upgrade.h:141
char * db_name
Definition: pg_upgrade.h:181
bool nsp_alloc
Definition: pg_upgrade.h:142
void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
Definition: version.c:235
void parseCommandLine(int argc, char *argv[])
Definition: option.c:39
char * db_collate
Definition: pg_upgrade.h:184
void issue_warnings_and_set_wal_level(void)
Definition: check.c:203
void pg_putenv(const char *var, const char *val)
Definition: util.c:253
DbInfo * dbs
Definition: pg_upgrade.h:192
eLogType
Definition: pg_upgrade.h:239
void cloneFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:42
bool retain
Definition: pg_upgrade.h:283
char * user
Definition: pg_upgrade.h:311
void create_script_for_cluster_analyze(char **analyze_script_file_name)
Definition: check.c:453
const char * new_tablespace
Definition: pg_upgrade.h:158
char * socketdir
Definition: pg_upgrade.h:296
long val
Definition: informix.c:684
bool float8_pass_by_value
Definition: pg_upgrade.h:222
const char * new_tablespace_suffix
Definition: pg_upgrade.h:160
char * relname
Definition: pg_upgrade.h:172
Oid toastheap
Definition: pg_upgrade.h:140
void check_and_dump_old_cluster(bool live_check)
Definition: check.c:79
void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster)
Definition: version.c:414
void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
Definition: version.c:272