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}))