pg_dump: Dump colliculocale
authorPeter Eisentraut <[email protected]>
Wed, 24 Aug 2022 18:13:52 +0000 (20:13 +0200)
committerPeter Eisentraut <[email protected]>
Wed, 24 Aug 2022 18:13:52 +0000 (20:13 +0200)
This was forgotten when the new column was introduced.

Author: Marina Polyakova <[email protected]>
Reviewed-by: Julien Rouhaud <[email protected]>
Discussion: https://www.postgresql.org/message-id/7ad26354e75259f59c4a6c6997b8ee32%40postgrespro.ru

src/bin/pg_dump/Makefile
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/t/002_pg_dump.pl

index 2f524b09bf53a55037013d78148f8cbca4fa7eee..9dc5a784dd2d1ce58a6284f19c54730364779c4d 100644 (file)
@@ -17,6 +17,7 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 export GZIP_PROGRAM=$(GZIP)
+export with_icu
 
 override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
 LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
index ca4ad070042deceb1c87566dd9a405fca854d2dc..d25709ad5f3712ce8a77b6538a2348ad240935d1 100644 (file)
@@ -13083,9 +13083,11 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
    int         i_collisdeterministic;
    int         i_collcollate;
    int         i_collctype;
+   int         i_colliculocale;
    const char *collprovider;
    const char *collcollate;
    const char *collctype;
+   const char *colliculocale;
 
    /* Do nothing in data-only dump */
    if (dopt->dataOnly)
@@ -13116,6 +13118,13 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
        appendPQExpBufferStr(query,
                             "true AS collisdeterministic, ");
 
+   if (fout->remoteVersion >= 150000)
+       appendPQExpBufferStr(query,
+                            "colliculocale, ");
+   else
+       appendPQExpBufferStr(query,
+                            "NULL AS colliculocale, ");
+
    appendPQExpBuffer(query,
                      "collcollate, "
                      "collctype "
@@ -13129,10 +13138,24 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
    i_collisdeterministic = PQfnumber(res, "collisdeterministic");
    i_collcollate = PQfnumber(res, "collcollate");
    i_collctype = PQfnumber(res, "collctype");
+   i_colliculocale = PQfnumber(res, "colliculocale");
 
    collprovider = PQgetvalue(res, 0, i_collprovider);
-   collcollate = PQgetvalue(res, 0, i_collcollate);
-   collctype = PQgetvalue(res, 0, i_collctype);
+
+   if (!PQgetisnull(res, 0, i_collcollate))
+       collcollate = PQgetvalue(res, 0, i_collcollate);
+   else
+       collcollate = NULL;
+
+   if (!PQgetisnull(res, 0, i_collctype))
+       collctype = PQgetvalue(res, 0, i_collctype);
+   else
+       collctype = NULL;
+
+   if (!PQgetisnull(res, 0, i_colliculocale))
+       colliculocale = PQgetvalue(res, 0, i_colliculocale);
+   else
+       colliculocale = NULL;
 
    appendPQExpBuffer(delq, "DROP COLLATION %s;\n",
                      fmtQualifiedDumpable(collinfo));
@@ -13155,17 +13178,28 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
    if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
        appendPQExpBufferStr(q, ", deterministic = false");
 
-   if (strcmp(collcollate, collctype) == 0)
+   if (colliculocale != NULL)
    {
        appendPQExpBufferStr(q, ", locale = ");
-       appendStringLiteralAH(q, collcollate, fout);
+       appendStringLiteralAH(q, colliculocale, fout);
    }
    else
    {
-       appendPQExpBufferStr(q, ", lc_collate = ");
-       appendStringLiteralAH(q, collcollate, fout);
-       appendPQExpBufferStr(q, ", lc_ctype = ");
-       appendStringLiteralAH(q, collctype, fout);
+       Assert(collcollate != NULL);
+       Assert(collctype != NULL);
+
+       if (strcmp(collcollate, collctype) == 0)
+       {
+           appendPQExpBufferStr(q, ", locale = ");
+           appendStringLiteralAH(q, collcollate, fout);
+       }
+       else
+       {
+           appendPQExpBufferStr(q, ", lc_collate = ");
+           appendStringLiteralAH(q, collcollate, fout);
+           appendPQExpBufferStr(q, ", lc_ctype = ");
+           appendStringLiteralAH(q, collctype, fout);
+       }
    }
 
    /*
index b10e1c4c0d4d27bf1a427c8cfe36f8dea4dad78a..383bb46b25e5f32d4d8a7cf7d531e2f8f35c8c8a 100644 (file)
@@ -1593,6 +1593,15 @@ my %tests = (
        like      => { %full_runs, section_pre_data => 1, },
    },
 
+   'CREATE COLLATION icu_collation' => {
+       create_order => 76,
+       create_sql   => "CREATE COLLATION icu_collation (PROVIDER = icu, LOCALE = 'C');",
+       regexp =>
+         qr/CREATE COLLATION public.icu_collation \(provider = icu, locale = 'C'(, version = '[^']*')?\);/m,
+       icu => 1,
+       like      => { %full_runs, section_pre_data => 1, },
+   },
+
    'CREATE CAST FOR timestamptz' => {
        create_order => 51,
        create_sql =>
@@ -3890,7 +3899,7 @@ if ($collation_check_stderr !~ /ERROR: /)
    $collation_support = 1;
 }
 
-# Determine whether build supports LZ4 and gzip.
+my $supports_icu  = ($ENV{with_icu} eq 'yes');
 my $supports_lz4  = check_pg_config("#define USE_LZ4 1");
 my $supports_gzip = check_pg_config("#define HAVE_LIBZ 1");
 
@@ -3931,6 +3940,11 @@ foreach my $test (
        $test_db = $tests{$test}->{database};
    }
 
+   if (defined($tests{$test}->{icu}))
+   {
+       $tests{$test}->{collation} = 1;
+   }
+
    if ($tests{$test}->{create_sql})
    {
 
@@ -3940,6 +3954,12 @@ foreach my $test (
            next;
        }
 
+       # Skip any icu-related collation commands if build was without icu
+       if (!$supports_icu && defined($tests{$test}->{icu}))
+       {
+           next;
+       }
+
        # Skip tests specific to LZ4 if this build does not support
        # this option.
        if (!$supports_lz4 && defined($tests{$test}->{lz4}))
@@ -4141,6 +4161,12 @@ foreach my $run (sort keys %pgdump_runs)
            next;
        }
 
+       # Skip any icu-related collation commands if build was without icu
+       if (!$supports_icu && defined($tests{$test}->{icu}))
+       {
+           next;
+       }
+
        # Skip tests specific to LZ4 if this build does not support
        # this option.
        if (!$supports_lz4 && defined($tests{$test}->{lz4}))