From 32ba4920455f2bfa092a034bcf6268bce35a03e3 Mon Sep 17 00:00:00 2001 From: Dilip Kumar Date: Fri, 11 Mar 2022 11:48:55 +0530 Subject: [PATCH v15 6/6] Support create database strategy in createdb tool --- doc/src/sgml/ref/createdb.sgml | 16 ++++++++++++++++ src/bin/scripts/createdb.c | 10 +++++++++- src/bin/scripts/t/020_createdb.pl | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml index 8647345..2a7beca 100644 --- a/doc/src/sgml/ref/createdb.sgml +++ b/doc/src/sgml/ref/createdb.sgml @@ -159,6 +159,22 @@ PostgreSQL documentation + + + + + Specifies the database creation strategy. Currently, we have two + strategies the WAL_LOG and the FILE_COPY + . If WAL_LOG strategy is used then the + database will be copied block by block and it will also WAL log each + copied block. Otherwise, if FILE_COPY strategy is + used then it will do the file system level copy so individual the block + is not WAL logged. The default strategy is WAL_LOG. + + + + + diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index b0c6805..9d3c4ef 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -37,6 +37,7 @@ main(int argc, char *argv[]) {"lc-collate", required_argument, NULL, 1}, {"lc-ctype", required_argument, NULL, 2}, {"locale", required_argument, NULL, 'l'}, + {"strategy", required_argument, NULL, 'S'}, {"maintenance-db", required_argument, NULL, 3}, {NULL, 0, NULL, 0} }; @@ -61,6 +62,7 @@ main(int argc, char *argv[]) char *lc_collate = NULL; char *lc_ctype = NULL; char *locale = NULL; + char *strategy = NULL; PQExpBufferData sql; @@ -73,7 +75,7 @@ main(int argc, char *argv[]) handle_help_version_opts(argc, argv, "createdb", help); - while ((c = getopt_long(argc, argv, "h:p:U:wWeO:D:T:E:l:", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "h:p:U:wWeO:D:T:E:l:S:", long_options, &optindex)) != -1) { switch (c) { @@ -119,6 +121,9 @@ main(int argc, char *argv[]) case 3: maintenance_db = pg_strdup(optarg); break; + case 'S': + strategy = pg_strdup(optarg); + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -217,6 +222,8 @@ main(int argc, char *argv[]) appendPQExpBufferStr(&sql, " LC_CTYPE "); appendStringLiteralConn(&sql, lc_ctype, conn); } + if (strategy) + appendPQExpBuffer(&sql, " STRATEGY %s ", fmtId(strategy)); appendPQExpBufferChar(&sql, ';'); @@ -274,6 +281,7 @@ help(const char *progname) printf(_(" --lc-collate=LOCALE LC_COLLATE setting for the database\n")); printf(_(" --lc-ctype=LOCALE LC_CTYPE setting for the database\n")); printf(_(" -O, --owner=OWNER database user to own the new database\n")); + printf(_(" -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n")); printf(_(" -T, --template=TEMPLATE template database to copy\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 6392454..ccfbe17 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -76,4 +76,24 @@ $node->command_checks_all( ], 'createdb with incorrect --lc-ctype'); +$node->command_checks_all( + [ 'createdb', '--strategy', "foo", 'foobar2' ], + 1, + [qr/^$/], + [ + qr/^createdb: error: database creation failed: ERROR: invalid create database strategy|^createdb: error: database creation failed: ERROR: invalid create database strategy foo/s + ], + 'createdb with incorrect --strategy'); + +# Check database creation strategy +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', 'foobar4', '-S', 'wal_log'], + qr/statement: CREATE DATABASE foobar4 TEMPLATE foobar2 STRATEGY wal_log/, + 'create database with WAL_LOG strategy'); + +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', 'foobar5', '-S', 'file_copy'], + qr/statement: CREATE DATABASE foobar5 TEMPLATE foobar2 STRATEGY file_copy/, + 'create database with FILE_COPY strategy'); + done_testing(); -- 1.8.3.1