Hi
2017-02-10 6:00 GMT+01:00 Michael Paquier <[email protected]>:
> On Thu, Feb 9, 2017 at 5:13 AM, Pavel Stehule <[email protected]>
> wrote:
> > here is a patch
>
> Thanks.
>
> - for (sl = dblist; sl; sl = sl->next)
> - create_database(sl->str);
> + if (templatelist != NULL)
> + {
> + _stringlist *tl;
> +
> + for (sl = dblist, tl = templatelist; sl; sl = sl->next, tl
> = tl->next)
> + {
> + if (tl != NULL)
> + create_database(sl->str, tl->str);
> + else
> + {
> + fprintf(stderr, _("%s: the template list is
> shorter than database list\n"),
> + progname);
> + exit(2);
> + }
> + }
> + }
> + else
> + for (sl = dblist; sl; sl = sl->next)
> + create_database(sl->str, "template0");
> There is one problem here: if the length of the template list is
> shorter than the database list, databases get halfly created, then
> pg_regress complains, letting the instance in a half-way state. I
> think that you had better do any sanity checks before creating or even
> dropping existing databases.
>
here is new update - check is done before any creating
Regards
Pavel
> --
> Michael
>
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index d4d00d9..b5f5c2f 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -68,6 +68,7 @@ const char *pretty_diff_opts = "-w -C3";
/* options settable from command line */
_stringlist *dblist = NULL;
+_stringlist *templatelist = NULL;
bool debug = false;
char *inputdir = ".";
char *outputdir = ".";
@@ -1907,7 +1908,7 @@ drop_database_if_exists(const char *dbname)
}
static void
-create_database(const char *dbname)
+create_database(const char *dbname, const char *template)
{
_stringlist *sl;
@@ -1917,10 +1918,12 @@ create_database(const char *dbname)
*/
header(_("creating database \"%s\""), dbname);
if (encoding)
- psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'%s", dbname, encoding,
+ psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=\"%s\" ENCODING='%s'%s",
+ dbname, template, encoding,
(nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : "");
else
- psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0%s", dbname,
+ psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=\"%s\"%s",
+ dbname, template,
(nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : "");
psql_command(dbname,
"ALTER DATABASE \"%s\" SET lc_messages TO 'C';"
@@ -1995,6 +1998,7 @@ help(void)
printf(_(" --outputdir=DIR place output files in DIR (default \".\")\n"));
printf(_(" --schedule=FILE use test ordering schedule from FILE\n"));
printf(_(" (can be used multiple times to concatenate)\n"));
+ printf(_(" --template=DB use template DB (default \"template0\")\n"));
printf(_(" --temp-instance=DIR create a temporary instance in DIR\n"));
printf(_(" --use-existing use an existing installation\n"));
printf(_("\n"));
@@ -2041,6 +2045,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
{"launcher", required_argument, NULL, 21},
{"load-extension", required_argument, NULL, 22},
{"config-auth", required_argument, NULL, 24},
+ {"template", required_argument, NULL, 25},
{NULL, 0, NULL, 0}
};
@@ -2154,6 +2159,16 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
case 24:
config_auth_datadir = pg_strdup(optarg);
break;
+ case 25:
+
+ /*
+ * If a default template was specified, we need to remove it
+ * before we add the specified one.
+ */
+ free_stringlist(&templatelist);
+ split_to_stringlist(optarg, ",", &templatelist);
+ break;
+
default:
/* getopt_long already emitted a complaint */
fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2454,8 +2469,35 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
*/
if (!use_existing)
{
- for (sl = dblist; sl; sl = sl->next)
- create_database(sl->str);
+ if (templatelist != NULL)
+ {
+ _stringlist *tl;
+
+ /*
+ * The template list should to have same length as database list.
+ * Check it before any database creation.
+ */
+ for (sl = dblist, tl = templatelist; sl; sl = sl->next, tl = tl->next)
+ if (tl == NULL)
+ {
+ fprintf(stderr, _("%s: the template list is shorter than database list\n"),
+ progname);
+ exit(2);
+ }
+ if (tl != NULL)
+ {
+ fprintf(stderr, _("%s: the template list is longer than database list\n"),
+ progname);
+ exit(2);
+ }
+
+ for (sl = dblist, tl = templatelist; sl; sl = sl->next, tl = tl->next)
+ create_database(sl->str, tl->str);
+ }
+ else
+ for (sl = dblist; sl; sl = sl->next)
+ create_database(sl->str, "template0");
+
for (sl = extraroles; sl; sl = sl->next)
create_role(sl->str, dblist);
}
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers