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-2020, 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 PATH_SEPARATOR '/'
69 #define PATH_QUOTE '\''
70 #define RM_CMD "rm -f"
71 #define RMDIR_CMD "rm -rf"
72 #define SCRIPT_PREFIX "./"
73 #define SCRIPT_EXT "sh"
74 #define ECHO_QUOTE "'"
75 #define ECHO_BLANK ""
76 #else
77 #define pg_mv_file pgrename
78 #define PATH_SEPARATOR '\\'
79 #define PATH_QUOTE '"'
80 #define RM_CMD "DEL /q"
81 #define RMDIR_CMD "RMDIR /s/q"
82 #define SCRIPT_PREFIX ""
83 #define SCRIPT_EXT "bat"
84 #define EXE_EXT ".exe"
85 #define ECHO_QUOTE ""
86 #define ECHO_BLANK "."
87 #endif
88 
89 
90 /*
91  * postmaster/postgres -b (binary_upgrade) flag added during PG 9.1
92  * development
93  */
94 #define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
95 
96 /*
97  * Visibility map changed with this 9.2 commit,
98  * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
99  */
100 #define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
101 
102 /*
103  * The format of visibility map is changed with this 9.6 commit,
104  */
105 #define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
106 
107 /*
108  * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
109  * ("Improve concurrency of foreign key locking") which also updated catalog
110  * version to this value. pg_upgrade behavior depends on whether old and new
111  * server versions are both newer than this, or only the new one is.
112  */
113 #define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
114 
115 /*
116  * large object chunk size added to pg_controldata,
117  * commit 5f93c37805e7485488480916b4585e098d3cc883
118  */
119 #define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
120 
121 /*
122  * change in JSONB format during 9.4 beta
123  */
124 #define JSONB_FORMAT_CHANGE_CAT_VER 201409291
125 
126 
127 /*
128  * Each relation is represented by a relinfo structure.
129  */
130 typedef struct
131 {
132  /* Can't use NAMEDATALEN; not guaranteed to be same on client */
133  char *nspname; /* namespace name */
134  char *relname; /* relation name */
135  Oid reloid; /* relation OID */
136  Oid relfilenode; /* relation file node */
137  Oid indtable; /* if index, OID of its table, else 0 */
138  Oid toastheap; /* if toast table, OID of base table, else 0 */
139  char *tablespace; /* tablespace path; "" for cluster default */
140  bool nsp_alloc; /* should nspname be freed? */
141  bool tblsp_alloc; /* should tablespace be freed? */
142 } RelInfo;
143 
144 typedef struct
145 {
147  int nrels;
148 } RelInfoArr;
149 
150 /*
151  * The following structure represents a relation mapping.
152  */
153 typedef struct
154 {
155  const char *old_tablespace;
156  const char *new_tablespace;
161 
162  /*
163  * old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
164  * due to VACUUM FULL or REINDEX. Other relfilenodes are preserved.
165  */
168  /* the rest are used only for logging and error reporting */
169  char *nspname; /* namespaces */
170  char *relname;
171 } FileNameMap;
172 
173 /*
174  * Structure to store database information
175  */
176 typedef struct
177 {
178  Oid db_oid; /* oid of the database */
179  char *db_name; /* database name */
180  char db_tablespace[MAXPGPATH]; /* database default tablespace
181  * path */
182  char *db_collate;
183  char *db_ctype;
185  RelInfoArr rel_arr; /* array of all user relinfos */
186 } DbInfo;
187 
188 typedef struct
189 {
190  DbInfo *dbs; /* array of db infos */
191  int ndbs; /* number of db infos */
192 } DbInfoArr;
193 
194 /*
195  * The following structure is used to hold pg_control information.
196  * Rather than using the backend's control structure we use our own
197  * structure to avoid pg_control version issues between releases.
198  */
199 typedef struct
200 {
203  char nextxlogfile[25];
222 } ControlData;
223 
224 /*
225  * Enumeration to denote transfer modes
226  */
227 typedef enum
228 {
232 } transferMode;
233 
234 /*
235  * Enumeration to denote pg_log modes
236  */
237 typedef enum
238 {
244 } eLogType;
245 
246 
247 typedef long pgpid_t;
248 
249 
250 /*
251  * cluster
252  *
253  * information about each cluster
254  */
255 typedef struct
256 {
257  ControlData controldata; /* pg_control information */
258  DbInfoArr dbarr; /* dbinfos array */
259  char *pgdata; /* pathname for cluster's $PGDATA directory */
260  char *pgconfig; /* pathname for cluster's config file
261  * directory */
262  char *bindir; /* pathname for cluster's executable directory */
263  char *pgopts; /* options to pass to the server, like pg_ctl
264  * -o */
265  char *sockdir; /* directory for Unix Domain socket, if any */
266  unsigned short port; /* port number where postmaster is waiting */
267  uint32 major_version; /* PG_VERSION of cluster */
268  char major_version_str[64]; /* string PG_VERSION of cluster */
269  uint32 bin_version; /* version returned from pg_ctl */
270  const char *tablespace_suffix; /* directory specification */
271 } ClusterInfo;
272 
273 
274 /*
275  * LogOpts
276 */
277 typedef struct
278 {
279  FILE *internal; /* internal log FILE */
280  bool verbose; /* true -> be verbose in messages */
281  bool retain; /* retain log files on success */
282 } LogOpts;
283 
284 
285 /*
286  * UserOpts
287 */
288 typedef struct
289 {
290  bool check; /* true -> ask user for permission to make
291  * changes */
292  transferMode transfer_mode; /* copy files or link them? */
293  int jobs; /* number of processes/threads to use */
294  char *socketdir; /* directory to use for Unix sockets */
295 } UserOpts;
296 
297 typedef struct
298 {
299  char *name;
300  int dbnum;
301 } LibraryInfo;
302 
303 /*
304  * OSInfo
305  */
306 typedef struct
307 {
308  const char *progname; /* complete pathname for this program */
309  char *user; /* username for clusters */
310  bool user_specified; /* user specified on command-line */
311  char **old_tablespaces; /* tablespaces */
313  LibraryInfo *libraries; /* loadable libraries */
316 } OSInfo;
317 
318 
319 /*
320  * Global variables
321  */
322 extern LogOpts log_opts;
323 extern UserOpts user_opts;
324 extern ClusterInfo old_cluster,
325  new_cluster;
326 extern OSInfo os_info;
327 
328 
329 /* check.c */
330 
331 void output_check_banner(bool live_check);
332 void check_and_dump_old_cluster(bool live_check);
333 void check_new_cluster(void);
334 void report_clusters_compatible(void);
336 void output_completion_banner(char *analyze_script_file_name,
337  char *deletion_script_file_name);
338 void check_cluster_versions(void);
339 void check_cluster_compatibility(bool live_check);
340 void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
341 void create_script_for_cluster_analyze(char **analyze_script_file_name);
342 
343 
344 /* controldata.c */
345 
346 void get_control_data(ClusterInfo *cluster, bool live_check);
347 void check_control_data(ControlData *oldctrl, ControlData *newctrl);
348 void disable_old_cluster(void);
349 
350 
351 /* dump.c */
352 
353 void generate_old_dump(void);
354 
355 
356 /* exec.c */
357 
358 #define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
359 
360 bool exec_prog(const char *log_file, const char *opt_log_file,
361  bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
362 void verify_directories(void);
363 bool pid_lock_file_exists(const char *datadir);
364 
365 
366 /* file.c */
367 
368 void cloneFile(const char *src, const char *dst,
369  const char *schemaName, const char *relName);
370 void copyFile(const char *src, const char *dst,
371  const char *schemaName, const char *relName);
372 void linkFile(const char *src, const char *dst,
373  const char *schemaName, const char *relName);
374 void rewriteVisibilityMap(const char *fromfile, const char *tofile,
375  const char *schemaName, const char *relName);
376 void check_file_clone(void);
377 void check_hard_link(void);
378 
379 /* fopen_priv() is no longer different from fopen() */
380 #define fopen_priv(path, mode) fopen(path, mode)
381 
382 /* function.c */
383 
384 void get_loadable_libraries(void);
385 void check_loadable_libraries(void);
386 
387 /* info.c */
388 
390  DbInfo *new_db, int *nmaps, const char *old_pgdata,
391  const char *new_pgdata);
393 void print_maps(FileNameMap *maps, int n,
394  const char *db_name);
395 
396 /* option.c */
397 
398 void parseCommandLine(int argc, char *argv[]);
400 void get_sock_dir(ClusterInfo *cluster, bool live_check);
401 
402 /* relfilenode.c */
403 
404 void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
405  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
406 void transfer_all_new_dbs(DbInfoArr *old_db_arr,
407  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
408  char *old_tablespace);
409 
410 /* tablespace.c */
411 
412 void init_tablespaces(void);
413 
414 
415 /* server.c */
416 
417 PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
418 PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
419 
421 
422 bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
423 void stop_postmaster(bool in_atexit);
425 void check_pghost_envvar(void);
426 
427 
428 /* util.c */
429 
430 char *quote_identifier(const char *s);
431 int get_user_info(char **user_name_p);
432 void check_ok(void);
433 void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
434 void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
435 void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
436 void end_progress_output(void);
437 void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
438 void check_ok(void);
439 unsigned int str2uint(const char *str);
440 void pg_putenv(const char *var, const char *val);
441 
442 
443 /* version.c */
444 
446  bool check_mode);
450  bool check_mode);
451 
453 
454 /* parallel.c */
455 void parallel_exec_prog(const char *log_file, const char *opt_log_file,
456  const char *fmt,...) pg_attribute_printf(3, 4);
457 void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
458  char *old_pgdata, char *new_pgdata,
459  char *old_tablespace);
460 bool reap_child(bool wait_for_child);
void copyFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:78
uint32 get_major_server_version(ClusterInfo *cluster)
Definition: server.c:157
bool date_is_int
Definition: pg_upgrade.h:219
char * name
Definition: pg_upgrade.h:299
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:166
void check_file_clone(void)
Definition: file.c:317
void report_clusters_compatible(void)
Definition: check.c:186
uint32 major_version
Definition: pg_upgrade.h:267
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:86
ClusterInfo old_cluster
Definition: pg_upgrade.c:59
void check_new_cluster(void)
Definition: check.c:158
ControlData controldata
Definition: pg_upgrade.h:257
long pgpid_t
Definition: pg_upgrade.h:247
bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
Definition: server.c:196
uint32 chkpnt_nxtoid
Definition: pg_upgrade.h:206
static char * log_file
Definition: pg_ctl.c:91
int num_libraries
Definition: pg_upgrade.h:314
int get_user_info(char **user_name_p)
Definition: util.c:211
uint32 walsz
Definition: pg_upgrade.h:213
void rewriteVisibilityMap(const char *fromfile, const char *tofile, const char *schemaName, const char *relName)
Definition: file.c:173
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:134
void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
Definition: version.c:299
unsigned short port
Definition: pg_upgrade.h:266
void void void pg_fatal(const char *fmt,...) pg_attribute_printf(1
bool tblsp_alloc
Definition: pg_upgrade.h:141
PGresult char * cluster_conn_opts(ClusterInfo *cluster)
Definition: server.c:90
uint32 index
Definition: pg_upgrade.h:216
LogOpts log_opts
Definition: util.c:17
Oid new_db_oid
Definition: pg_upgrade.h:160
Oid reloid
Definition: pg_upgrade.h:135
unsigned int Oid
Definition: postgres_ext.h:31
void generate_old_dump(void)
Definition: dump.c:16
int jobs
Definition: pg_upgrade.h:293
char * nspname
Definition: pg_upgrade.h:133
Oid db_oid
Definition: pg_upgrade.h:178
bool user_specified
Definition: pg_upgrade.h:310
#define pg_attribute_printf(f, a)
Definition: c.h:130
char * pgopts
Definition: pg_upgrade.h:263
uint32 chkpnt_nxtmxoff
Definition: pg_upgrade.h:208
void check_pghost_envvar(void)
Definition: server.c:357
void check_loadable_libraries(void)
Definition: function.c:180
char * db_ctype
Definition: pg_upgrade.h:183
uint32 blocksz
Definition: pg_upgrade.h:211
uint32 chkpnt_nxtxid
Definition: pg_upgrade.h:204
void get_control_data(ClusterInfo *cluster, bool live_check)
Definition: controldata.c:34
char * pgconfig
Definition: pg_upgrade.h:260
const char * old_tablespace
Definition: pg_upgrade.h:155
void print_maps(FileNameMap *maps, int n, const char *db_name)
Definition: info.c:283
Oid new_relfilenode
Definition: pg_upgrade.h:167
PGconn * conn
Definition: streamutil.c:54
uint32 chkpnt_nxtepoch
Definition: pg_upgrade.h:205
#define MAXPGPATH
RelInfo * rels
Definition: pg_upgrade.h:146
Oid relfilenode
Definition: pg_upgrade.h:136
bool reap_child(bool wait_for_child)
Definition: parallel.c:284
void disable_old_cluster(void)
Definition: controldata.c:676
bool data_checksum_version
Definition: pg_upgrade.h:221
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:215
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:367
void cluster(ClusterStmt *stmt, bool isTopLevel)
Definition: cluster.c:102
LibraryInfo * libraries
Definition: pg_upgrade.h:313
uint32 align
Definition: pg_upgrade.h:210
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:157
transferMode transfer_mode
Definition: pg_upgrade.h:292
uint32 chkpnt_oldstMulti
Definition: pg_upgrade.h:209
uint32 walseg
Definition: pg_upgrade.h:214
Oid indtable
Definition: pg_upgrade.h:137
bool verbose
Definition: pg_upgrade.h:280
char * bindir
Definition: pg_upgrade.h:262
void linkFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:147
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:175
void check_cluster_versions(void)
Definition: check.c:257
uint32 cat_ver
Definition: pg_upgrade.h:202
char ** old_tablespaces
Definition: pg_upgrade.h:311
uint32 chkpnt_nxtmulti
Definition: pg_upgrade.h:207
transferMode
Definition: pg_upgrade.h:227
void stop_postmaster(bool in_atexit)
Definition: server.c:330
uint32 largesz
Definition: pg_upgrade.h:212
void get_sock_dir(ClusterInfo *cluster, bool live_check)
Definition: option.c:469
const char * tablespace_suffix
Definition: pg_upgrade.h:270
void check_hard_link(void)
Definition: file.c:359
uint32 bin_version
Definition: pg_upgrade.h:269
DbInfoArr dbarr
Definition: pg_upgrade.h:258
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:159
const char * progname
Definition: pg_upgrade.h:308
uint32 toast
Definition: pg_upgrade.h:217
RelInfoArr rel_arr
Definition: pg_upgrade.h:185
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:218
bool check
Definition: pg_upgrade.h:290
char * quote_identifier(const char *s)
Definition: ruleutils.c:10727
char * nspname
Definition: pg_upgrade.h:169
int db_encoding
Definition: pg_upgrade.h:184
uint32 ctrl_ver
Definition: pg_upgrade.h:201
ClusterInfo * running_cluster
Definition: pg_upgrade.h:315
void get_db_and_rel_infos(ClusterInfo *cluster)
Definition: info.c:309
void adjust_data_dir(ClusterInfo *cluster)
Definition: option.c:404
void init_tablespaces(void)
Definition: tablespace.c:19
char * pgdata
Definition: pg_upgrade.h:259
char * sockdir
Definition: pg_upgrade.h:265
UserOpts user_opts
Definition: option.c:30
int num_old_tablespaces
Definition: pg_upgrade.h:312
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:139
char * db_name
Definition: pg_upgrade.h:179
bool nsp_alloc
Definition: pg_upgrade.h:140
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:182
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:190
eLogType
Definition: pg_upgrade.h:237
void cloneFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:38
bool retain
Definition: pg_upgrade.h:281
char * user
Definition: pg_upgrade.h:309
void create_script_for_cluster_analyze(char **analyze_script_file_name)
Definition: check.c:453
const char * new_tablespace
Definition: pg_upgrade.h:156
char * socketdir
Definition: pg_upgrade.h:294
long val
Definition: informix.c:664
bool float8_pass_by_value
Definition: pg_upgrade.h:220
const char * new_tablespace_suffix
Definition: pg_upgrade.h:158
char * relname
Definition: pg_upgrade.h:170
Oid toastheap
Definition: pg_upgrade.h:138
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