Re: initdb's -c option behaves wrong way?

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: initdb's -c option behaves wrong way?
Дата
Msg-id 3469812.1709514096@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: initdb's -c option behaves wrong way?  (Daniel Gustafsson <daniel@yesql.se>)
Ответы Re: initdb's -c option behaves wrong way?  (Daniel Gustafsson <daniel@yesql.se>)
Список pgsql-hackers
Daniel Gustafsson <daniel@yesql.se> writes:
> I took the liberty to add this to the upcoming CF to make sure we don't lose
> track of it.

Thanks for doing that, because the cfbot pointed out a problem:
I should have written pg_strncasecmp not strncasecmp.  If this
version tests cleanly, I'll push it.

            regards, tom lane

diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index ac409b0006..200b2e8e31 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -484,6 +484,7 @@ replace_guc_value(char **lines, const char *guc_name, const char *guc_value,
     for (i = 0; lines[i]; i++)
     {
         const char *where;
+        const char *namestart;

         /*
          * Look for a line assigning to guc_name.  Typically it will be
@@ -494,15 +495,19 @@ replace_guc_value(char **lines, const char *guc_name, const char *guc_value,
         where = lines[i];
         while (*where == '#' || isspace((unsigned char) *where))
             where++;
-        if (strncmp(where, guc_name, namelen) != 0)
+        if (pg_strncasecmp(where, guc_name, namelen) != 0)
             continue;
+        namestart = where;
         where += namelen;
         while (isspace((unsigned char) *where))
             where++;
         if (*where != '=')
             continue;

-        /* found it -- append the original comment if any */
+        /* found it -- let's use the canonical casing shown in the file */
+        memcpy(&newline->data[mark_as_comment ? 1 : 0], namestart, namelen);
+
+        /* now append the original comment if any */
         where = strrchr(where, '#');
         if (where)
         {
diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl
index 03376cc0f7..413a5eca67 100644
--- a/src/bin/initdb/t/001_initdb.pl
+++ b/src/bin/initdb/t/001_initdb.pl
@@ -199,4 +199,17 @@ command_fails(
 command_fails([ 'initdb', '--no-sync', '--set', 'foo=bar', "$tempdir/dataX" ],
     'fails for invalid --set option');

+# Make sure multiple invocations of -c parameters are added case insensitive
+command_ok(
+    [
+        'initdb', '-cwork_mem=128', '-cWork_Mem=256', '-cWORK_MEM=512',
+        "$tempdir/dataY"
+    ],
+    'multiple -c options with different case');
+
+my $conf = slurp_file("$tempdir/dataY/postgresql.conf");
+ok($conf !~ qr/^WORK_MEM = /m, "WORK_MEM should not be configured");
+ok($conf !~ qr/^Work_Mem = /m, "Work_Mem should not be configured");
+ok($conf =~ qr/^work_mem = 512/m, "work_mem should be in config");
+
 done_testing();

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: Injection points: some tools to wait and wake
Следующее
От: Andy Fan
Дата:
Сообщение: Re: Shared detoast Datum proposal