From 27fbf7cb63911ee2bffdb3cca40cf14515203b07 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 9 May 2025 11:50:33 -0400 Subject: [PATCH 001/115] Centralize ssl tests' check for whether we're using LibreSSL. Right now there's only one caller, so that this is merely an exercise in shoving code from one module to another, but there will shortly be another one. It seems better to avoid having two copies of this highly-subject-to-change test. Back-patch to v15, where we first introduced some tests that don't work with LibreSSL. Reported-by: Thomas Munro Author: Tom Lane Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/CA+hUKG+fLqyweHqFSBcErueUVT0vDuSNWui-ySz3+d_APmq7dw@mail.gmail.com Backpatch-through: 15 --- src/test/ssl/t/001_ssltests.pl | 6 ++---- src/test/ssl/t/SSL/Backend/OpenSSL.pm | 20 ++++++++++++++++++++ src/test/ssl/t/SSL/Server.pm | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 9bb28fbc832..38dc62813c6 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -35,10 +35,8 @@ sub switch_server_cert $ssl_server->switch_server_cert(@_); } -# Determine whether this build uses OpenSSL or LibreSSL. As a heuristic, the -# HAVE_SSL_CTX_SET_CERT_CB macro isn't defined for LibreSSL. (Nor for OpenSSL -# 1.0.1, but that's old enough that accommodating it isn't worth the cost.) -my $libressl = not check_pg_config("#define HAVE_SSL_CTX_SET_CERT_CB 1"); +# Determine whether this build uses OpenSSL or LibreSSL. +my $libressl = $ssl_server->is_libressl; #### Some configuration diff --git a/src/test/ssl/t/SSL/Backend/OpenSSL.pm b/src/test/ssl/t/SSL/Backend/OpenSSL.pm index a762f43634f..f75347b08af 100644 --- a/src/test/ssl/t/SSL/Backend/OpenSSL.pm +++ b/src/test/ssl/t/SSL/Backend/OpenSSL.pm @@ -26,6 +26,7 @@ package SSL::Backend::OpenSSL; use strict; use warnings; +use PostgreSQL::Test::Utils; use File::Basename; use File::Copy; @@ -205,6 +206,25 @@ sub get_library return $self->{_library}; } +=pod + +=item $backend->library_is_libressl() + +Detect whether the SSL library is LibreSSL. + +=cut + +sub library_is_libressl +{ + my ($self) = @_; + + # The HAVE_SSL_CTX_SET_CERT_CB macro isn't defined for LibreSSL. + # (Nor for OpenSSL 1.0.1, but that's old enough that accommodating it + # isn't worth the cost.) + # We may eventually need a less-bogus heuristic. + return not check_pg_config("#define HAVE_SSL_CTX_SET_CERT_CB 1"); +} + # Internal method for copying a set of files, taking into account wildcards sub _copy_files { diff --git a/src/test/ssl/t/SSL/Server.pm b/src/test/ssl/t/SSL/Server.pm index ee113569369..58df0455e89 100644 --- a/src/test/ssl/t/SSL/Server.pm +++ b/src/test/ssl/t/SSL/Server.pm @@ -243,6 +243,23 @@ sub ssl_library =pod +=item $server->is_libressl() + +Detect whether the currently used SSL backend is LibreSSL. +(Ideally we'd not need this hack, but presently we do.) + +=cut + +sub is_libressl +{ + my $self = shift; + my $backend = $self->{backend}; + + return $backend->library_is_libressl(); +} + +=pod + =item switch_server_cert(params) Change the configuration to use the given set of certificate, key, ca and From cad781b3e5de615e8a570950e455bd04cdadeafd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 9 May 2025 12:29:01 -0400 Subject: [PATCH 002/115] Skip RSA-PSS ssl test when using LibreSSL. Presently, LibreSSL does not have working support for RSA-PSS, so disable that test. Per discussion at https://marc.info/?l=libressl&m=174664225002441&w=2 they do intend to fix this, but it's a ways off yet. Reported-by: Thomas Munro Author: Tom Lane Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/CA+hUKG+fLqyweHqFSBcErueUVT0vDuSNWui-ySz3+d_APmq7dw@mail.gmail.com Backpatch-through: 15 --- src/test/ssl/t/002_scram.pl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl index 28c54bdb09f..b84e12691ed 100644 --- a/src/test/ssl/t/002_scram.pl +++ b/src/test/ssl/t/002_scram.pl @@ -44,14 +44,21 @@ sub switch_server_cert # This is the pattern to use in pg_hba.conf to match incoming connections. my $SERVERHOSTCIDR = '127.0.0.1/32'; +# Determine whether this build uses OpenSSL or LibreSSL. +my $libressl = $ssl_server->is_libressl; + # Determine whether build supports tls-server-end-point. my $supports_tls_server_end_point = check_pg_config("#define HAVE_X509_GET_SIGNATURE_NID 1"); + # Determine whether build supports detection of hash algorithms for # RSA-PSS certificates. my $supports_rsapss_certs = check_pg_config("#define HAVE_X509_GET_SIGNATURE_INFO 1"); +# As of 5/2025, LibreSSL doesn't actually work for RSA-PSS certificates. +$supports_rsapss_certs = 0 if $libressl; + # Allocation of base connection string shared among multiple tests. my $common_connstr; From 2dac114e2c3fc584a94c4820e27396567faed050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Sun, 11 May 2025 09:47:10 -0400 Subject: [PATCH 003/115] Fix comment of tsquerysend() The comment describes the order in which fields are sent, and it had one of the fields in the wrong place. This has been wrong since e6dbcb72fafa (2008), so backpatch all the way back. Author: Emre Hasegeli Discussion: https://postgr.es/m/CAE2gYzzf38bR_R=izhpMxAmqHXKeM5ajkmukh4mNs_oXfxcMCA@mail.gmail.com --- src/backend/utils/adt/tsquery.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 001f2cc0299..77947f952ce 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -1176,10 +1176,11 @@ tsqueryout(PG_FUNCTION_ARGS) * * uint8 type, QI_VAL * uint8 weight - * operand text in client encoding, null-terminated * uint8 prefix + * operand text in client encoding, null-terminated * * For each operator: + * * uint8 type, QI_OPR * uint8 operator, one of OP_AND, OP_PHRASE OP_OR, OP_NOT. * uint16 distance (only for OP_PHRASE) From 9c94d983d67f51cd49be08699f2e35f0e4cb6a63 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 13 May 2025 07:29:14 -0400 Subject: [PATCH 004/115] Fix order of parameters in POD documentation The documentation for log_check() had the parameters in the wrong order. Also while there, rename %parameters to %params to better documentation for similar functions which use %params. Backpatch down to v14 where this was introduced. Author: Daniel Gustafsson Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/9F503B5-32F2-45D7-A0AE-952879AD65F1@yesql.se Backpatch-through: 14 --- src/test/perl/PostgreSQL/Test/Cluster.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 6cd32adbf74..b908f17adf6 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2527,7 +2527,7 @@ sub log_content =pod -=item $node->log_check($offset, $test_name, %parameters) +=item $node->log_check($test_name, $offset, %params) Check contents of server logs. From d3716d4b135756e38775a29a5ca26e17bd0efafc Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Thu, 15 May 2025 17:09:04 +0900 Subject: [PATCH 005/115] Fix Assert failure in XMLTABLE parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In an XMLTABLE expression, columns can be marked NOT NULL, and the parser internally fabricates an option named "is_not_null" to represent this. However, the parser also allows users to specify arbitrary option names. This creates a conflict: a user can explicitly use "is_not_null" as an option name and assign it a non-Boolean value, which violates internal assumptions and triggers an assertion failure. To fix, this patch checks whether a user-supplied name collides with the internally reserved option name and raises an error if so. Additionally, the internal name is renamed to "__pg__is_not_null" to further reduce the risk of collision with user-defined names. Reported-by: Евгений Горбанев Author: Richard Guo Reviewed-by: Alvaro Herrera Discussion: https://postgr.es/m/6bac9886-65bf-4cec-96bd-e304159f28db@basealt.ru Backpatch-through: 15 --- src/backend/parser/gram.y | 15 +++++++++++---- src/test/regress/expected/xml.out | 4 ++++ src/test/regress/expected/xml_1.out | 4 ++++ src/test/regress/expected/xml_2.out | 4 ++++ src/test/regress/sql/xml.sql | 2 ++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 365b4481ff4..702522f3d30 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -13838,7 +13838,7 @@ xmltable_column_el: parser_errposition(defel->location))); fc->colexpr = defel->arg; } - else if (strcmp(defel->defname, "is_not_null") == 0) + else if (strcmp(defel->defname, "__pg__is_not_null") == 0) { if (nullability_seen) ereport(ERROR, @@ -13881,13 +13881,20 @@ xmltable_column_option_list: xmltable_column_option_el: IDENT b_expr - { $$ = makeDefElem($1, $2, @1); } + { + if (strcmp($1, "__pg__is_not_null") == 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("option name \"%s\" cannot be used in XMLTABLE", $1), + parser_errposition(@1))); + $$ = makeDefElem($1, $2, @1); + } | DEFAULT b_expr { $$ = makeDefElem("default", $2, @1); } | NOT NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); } + { $$ = makeDefElem("__pg__is_not_null", (Node *) makeBoolean(true), @1); } | NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); } + { $$ = makeDefElem("__pg__is_not_null", (Node *) makeBoolean(false), @1); } ; xml_namespace_list: diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index c4b8a2101d7..caec8f830ed 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -1373,6 +1373,10 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); ERROR: XMLTABLE function has 1 columns available but 2 columns specified +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); +ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE +LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... + ^ -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 5efe284c932..e89828cb489 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -1047,6 +1047,10 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); ERROR: XMLTABLE function has 1 columns available but 2 columns specified +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); +ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE +LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... + ^ -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out index 7915a6c2c3b..36bc9c2447b 100644 --- a/src/test/regress/expected/xml_2.out +++ b/src/test/regress/expected/xml_2.out @@ -1359,6 +1359,10 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); ERROR: XMLTABLE function has 1 columns available but 2 columns specified +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); +ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE +LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... + ^ -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index fd0bc71e7bb..efd17edfcc7 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -435,6 +435,8 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); + -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' From cc112eb8e9fed3eaf6b2d81aece21c3e964a21ae Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 16 May 2025 11:20:07 -0400 Subject: [PATCH 006/115] Align organization wording in copyright statement This aligns the copyright and legal notice wordig with commit a233a603bab8 and pgweb commit 2d764dbc083ab8. Backpatch down to all supported versions. Author: Daniel Gustafsson Reviewed-by: Dave Page Reviewed-by: Tom Lane Discussion: https://postgr.es/m/744E414E-3F52-404C-97FB-ED9B3AA37DC8@yesql.se Backpatch-through: 13 --- COPYRIGHT | 2 +- doc/src/sgml/legal.sgml | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index be2d694b038..3b79b1b4ca0 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,5 +1,5 @@ PostgreSQL Database Management System -(formerly known as Postgres, then as Postgres95) +(also known as Postgres, formerly known as Postgres95) Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group diff --git a/doc/src/sgml/legal.sgml b/doc/src/sgml/legal.sgml index af13bf2e055..75c1309cf73 100644 --- a/doc/src/sgml/legal.sgml +++ b/doc/src/sgml/legal.sgml @@ -11,13 +11,15 @@ Legal Notice - PostgreSQL is Copyright © 1996–2025 - by the PostgreSQL Global Development Group. + PostgreSQL Database Management System + (also known as Postgres, formerly known as Postgres95) - Postgres95 is Copyright © 1994–5 - by the Regents of the University of California. + Portions Copyright © 1996-2025, PostgreSQL Global Development Group + + + Portions Copyright © 1994, The Regents of the University of California From 253cf661c2260886f261dff0e6b8df41781da8fe Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 18 May 2025 12:45:55 -0400 Subject: [PATCH 007/115] Make our usage of memset_s() conform strictly to the C11 standard. Per the letter of the C11 standard, one must #define __STDC_WANT_LIB_EXT1__ as 1 before including in order to have access to memset_s(). It appears that many platforms are lenient about this, because we weren't doing it and yet the code appeared to work anyway. But we now find that with -std=c11, macOS is strict and doesn't declare memset_s, leading to compile failures since we try to use it anyway. (Given the lack of prior reports, perhaps this is new behavior in the latest SDK? No matter, we're clearly in the wrong.) In addition to the immediate problem, which could be fixed merely by adding the needed #define to explicit_bzero.c, it seems possible that our configure-time probe for memset_s() could fail in case a platform implements the function in some odd way due to this spec requirement. This concern can be fixed in largely the same way that we dealt with strchrnul() in 6da2ba1d8: switch to using a declaration-based configure probe instead of a does-it-link probe. Back-patch to v13 where we started using memset_s(). Reported-by: Lakshmi Narayana Velayudam Author: Tom Lane Discussion: https://postgr.es/m/CAA4pTnLcKGG78xeOjiBr5yS7ZeE-Rh=FaFQQGOO=nPzA1L8yEA@mail.gmail.com Backpatch-through: 13 --- configure | 15 ++++++++++++++- configure.ac | 3 ++- meson.build | 14 ++++++++------ src/include/pg_config.h.in | 7 ++++--- src/port/explicit_bzero.c | 4 +++- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/configure b/configure index c4f1674441f..eb05eaa227d 100755 --- a/configure +++ b/configure @@ -15715,7 +15715,7 @@ fi LIBS_including_readline="$LIBS" LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'` -for ac_func in backtrace_symbols copyfile getifaddrs getpeerucred inet_pton kqueue mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l +for ac_func in backtrace_symbols copyfile getifaddrs getpeerucred inet_pton kqueue mbstowcs_l posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -16291,6 +16291,19 @@ cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRCHRNUL $ac_have_decl _ACEOF +ac_fn_c_check_decl "$LINENO" "memset_s" "ac_cv_have_decl_memset_s" "#define __STDC_WANT_LIB_EXT1__ 1 +#include +" +if test "x$ac_cv_have_decl_memset_s" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MEMSET_S $ac_have_decl +_ACEOF + # This is probably only present on macOS, but may as well check always ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include diff --git a/configure.ac b/configure.ac index 2b87df7c121..ca75eb00f5e 100644 --- a/configure.ac +++ b/configure.ac @@ -1803,7 +1803,6 @@ AC_CHECK_FUNCS(m4_normalize([ inet_pton kqueue mbstowcs_l - memset_s posix_fallocate ppoll pthread_is_threaded_np @@ -1849,6 +1848,8 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen]) AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include ]) AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include ]) AC_CHECK_DECLS([strchrnul], [], [], [#include ]) +AC_CHECK_DECLS([memset_s], [], [], [#define __STDC_WANT_LIB_EXT1__ 1 +#include ]) # This is probably only present on macOS, but may as well check always AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include ]) diff --git a/meson.build b/meson.build index 5422ab64a3d..a8b0f1ecc9f 100644 --- a/meson.build +++ b/meson.build @@ -2324,26 +2324,29 @@ decl_checks += [ ['preadv', 'sys/uio.h'], ['pwritev', 'sys/uio.h'], ['strchrnul', 'string.h'], + ['memset_s', 'string.h', '#define __STDC_WANT_LIB_EXT1__ 1'], ] foreach c : decl_checks func = c.get(0) header = c.get(1) - args = c.get(2, {}) + prologue = c.get(2, '') + args = c.get(3, {}) varname = 'HAVE_DECL_' + func.underscorify().to_upper() found = cc.compiles(''' -#include <@0@> +@0@ +#include <@1@> int main() { -#ifndef @1@ - (void) @1@; +#ifndef @2@ + (void) @2@; #endif return 0; } -'''.format(header, func), +'''.format(prologue, header, func), name: 'test whether @0@ is declared'.format(func), # need to add cflags_warn to get at least # -Werror=unguarded-availability-new if applicable @@ -2581,7 +2584,6 @@ func_checks = [ ['inet_pton'], ['kqueue'], ['mbstowcs_l'], - ['memset_s'], ['mkdtemp'], ['posix_fadvise'], ['posix_fallocate'], diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index a27cb325aa3..be27b8abe10 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -116,6 +116,10 @@ to 0 if you don't. */ #undef HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN +/* Define to 1 if you have the declaration of `memset_s', and to 0 if you + don't. */ +#undef HAVE_DECL_MEMSET_S + /* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you don't. */ #undef HAVE_DECL_POSIX_FADVISE @@ -317,9 +321,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H -/* Define to 1 if you have the `memset_s' function. */ -#undef HAVE_MEMSET_S - /* Define to 1 if you have the `mkdtemp' function. */ #undef HAVE_MKDTEMP diff --git a/src/port/explicit_bzero.c b/src/port/explicit_bzero.c index f3a5038aa76..4ac632c2b45 100644 --- a/src/port/explicit_bzero.c +++ b/src/port/explicit_bzero.c @@ -12,9 +12,11 @@ *------------------------------------------------------------------------- */ +#define __STDC_WANT_LIB_EXT1__ 1 /* needed to access memset_s() */ + #include "c.h" -#if defined(HAVE_MEMSET_S) +#if HAVE_DECL_MEMSET_S void explicit_bzero(void *buf, size_t len) From c0f51fde534db988235904849b439e2c6fe53bee Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 19 May 2025 11:41:22 +0530 Subject: [PATCH 008/115] Don't retreat slot's confirmed_flush LSN. Prevent moving the confirmed_flush backwards, as this could lead to data duplication issues caused by replicating already replicated changes. This can happen when a client acknowledges an LSN it doesn't have to do anything for, and thus didn't store persistently. After a restart, the client can send the prior LSN that it stored persistently as an acknowledgement, but we need to ignore such an LSN to avoid retreating confirm_flush LSN. Diagnosed-by: Zhijie Hou Author: shveta malik Reviewed-by: Amit Kapila Reviewed-by: Dilip Kumar Tested-by: Nisha Moond Backpatch-through: 13 Discussion: https://postgr.es/m/CAJpy0uDZ29P=BYB1JDWMCh-6wXaNqMwG1u1mB4=10Ly0x7HhwQ@mail.gmail.com Discussion: https://postgr.es/m/OS0PR01MB57164AB5716AF2E477D53F6F9489A@OS0PR01MB5716.jpnprd01.prod.outlook.com --- src/backend/replication/logical/logical.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 8f1aa3fde9c..1dbb747465f 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1830,7 +1830,19 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) SpinLockAcquire(&MyReplicationSlot->mutex); - MyReplicationSlot->data.confirmed_flush = lsn; + /* + * Prevent moving the confirmed_flush backwards, as this could lead to + * data duplication issues caused by replicating already replicated + * changes. + * + * This can happen when a client acknowledges an LSN it doesn't have + * to do anything for, and thus didn't store persistently. After a + * restart, the client can send the prior LSN that it stored + * persistently as an acknowledgement, but we need to ignore such an + * LSN. See similar case handling in CreateDecodingContext. + */ + if (lsn > MyReplicationSlot->data.confirmed_flush) + MyReplicationSlot->data.confirmed_flush = lsn; /* if we're past the location required for bumping xmin, do so */ if (MyReplicationSlot->candidate_xmin_lsn != InvalidXLogRecPtr && @@ -1895,7 +1907,14 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) else { SpinLockAcquire(&MyReplicationSlot->mutex); - MyReplicationSlot->data.confirmed_flush = lsn; + + /* + * Prevent moving the confirmed_flush backwards. See comments above + * for the details. + */ + if (lsn > MyReplicationSlot->data.confirmed_flush) + MyReplicationSlot->data.confirmed_flush = lsn; + SpinLockRelease(&MyReplicationSlot->mutex); } } From 92a9ba3b96c2bb483d53096fbf223501d0b327a2 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 19 May 2025 18:50:26 +0300 Subject: [PATCH 009/115] Fix deparsing FETCH FIRST ROWS WITH TIES In the grammar, is a c_expr, which accepts only a limited set of integer literals and simple expressions without parens. The deparsing logic didn't quite match the grammar rule, and failed to use parens e.g. for "5::bigint". To fix, always surround the expression with parens. Would be nice to omit the parens in simple cases, but unfortunately it's non-trivial to detect such simple cases. Even if the expression is a simple literal 123 in the original query, after parse analysis it becomes a FuncExpr with COERCE_IMPLICIT_CAST rather than a simple Const. Reported-by: yonghao lee Backpatch-through: 13 Discussion: https://www.postgresql.org/message-id/18929-077d6b7093b176e2@postgresql.org --- src/backend/utils/adt/ruleutils.c | 10 ++++++++++ src/test/regress/expected/limit.out | 20 +++++++++++++++++--- src/test/regress/sql/limit.sql | 5 ++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 826b43e0a88..445a59a10b6 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -5733,9 +5733,19 @@ get_select_query_def(Query *query, deparse_context *context) { if (query->limitOption == LIMIT_OPTION_WITH_TIES) { + /* + * The limitCount arg is a c_expr, so it needs parens. Simple + * literals and function expressions would not need parens, but + * unfortunately it's hard to tell if the expression will be + * printed as a simple literal like 123 or as a typecast + * expression, like '-123'::int4. The grammar accepts the former + * without quoting, but not the latter. + */ appendContextKeyword(context, " FETCH FIRST ", -PRETTYINDENT_STD, PRETTYINDENT_STD, 0); + appendStringInfoChar(buf, '('); get_rule_expr(query->limitCount, context, false); + appendStringInfoChar(buf, ')'); appendStringInfoString(buf, " ROWS WITH TIES"); } else diff --git a/src/test/regress/expected/limit.out b/src/test/regress/expected/limit.out index a2cd0f9f5b8..d45427ac039 100644 --- a/src/test/regress/expected/limit.out +++ b/src/test/regress/expected/limit.out @@ -643,7 +643,7 @@ View definition: WHERE thousand < 995 ORDER BY thousand OFFSET 10 - FETCH FIRST 5 ROWS WITH TIES; + FETCH FIRST (5) ROWS WITH TIES; CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995 ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY; @@ -675,15 +675,29 @@ View definition: FROM onek WHERE thousand < 995 ORDER BY thousand - FETCH FIRST (NULL::integer + 1) ROWS WITH TIES; + FETCH FIRST ((NULL::integer + 1)) ROWS WITH TIES; CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 - ORDER BY thousand FETCH FIRST NULL ROWS ONLY; + ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES; \d+ limit_thousand_v_4 View "public.limit_thousand_v_4" Column | Type | Collation | Nullable | Default | Storage | Description ----------+---------+-----------+----------+---------+---------+------------- thousand | integer | | | | plain | +View definition: + SELECT thousand + FROM onek + WHERE thousand < 995 + ORDER BY thousand + FETCH FIRST (5::bigint) ROWS WITH TIES; + +CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_5 + View "public.limit_thousand_v_5" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | View definition: SELECT thousand FROM onek diff --git a/src/test/regress/sql/limit.sql b/src/test/regress/sql/limit.sql index 6f0cda98701..603910fe6d1 100644 --- a/src/test/regress/sql/limit.sql +++ b/src/test/regress/sql/limit.sql @@ -196,6 +196,9 @@ CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES; \d+ limit_thousand_v_3 CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 - ORDER BY thousand FETCH FIRST NULL ROWS ONLY; + ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES; \d+ limit_thousand_v_4 +CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_5 -- leave these views From dbe9804db1517b59e94d663de2661d4e4472be16 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 20 May 2025 14:39:12 +0900 Subject: [PATCH 010/115] doc: Clarify use of _ccnew and _ccold in REINDEX CONCURRENTLY Invalid indexes are suffixed with "_ccnew" or "_ccold". The documentation missed to mention the initial underscore. ChooseRelationName() may also append an extra number if indexes with a similar name already exist; let's add a note about that too. Author: Alec Cozens Discussion: https://postgr.es/m/174733277404.1455388.11471370288789479593@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/ref/reindex.sgml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index 21e2e91d896..d5d63ff7e72 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -453,14 +453,17 @@ Indexes: If the index marked INVALID is suffixed - ccnew, then it corresponds to the transient + _ccnew, then it corresponds to the transient index created during the concurrent operation, and the recommended recovery method is to drop it using DROP INDEX, then attempt REINDEX CONCURRENTLY again. - If the invalid index is instead suffixed ccold, + If the invalid index is instead suffixed _ccold, it corresponds to the original index which could not be dropped; the recommended recovery method is to just drop said index, since the rebuild proper has been successful. + A nonzero number may be appended to the suffix of the invalid index + names to keep them unique, like _ccnew1, + _ccold2, etc. From 558ea446aeb0a95494fb781772dbbe1f2cc636d9 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 20 May 2025 10:39:14 +0300 Subject: [PATCH 011/115] Fix cross-version upgrade test failure Commit 29f7ce6fe7 added another view that needs adjustment in the cross-version upgrade test. This should fix the XversionUpgrade failures in the buildfarm. Backpatch-through: 16 Discussion: https://www.postgresql.org/message-id/18929-077d6b7093b176e2@postgresql.org --- src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm index ac8916c16e4..52bd1f02424 100644 --- a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm +++ b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm @@ -487,6 +487,7 @@ my @_unused_view_qualifiers = ( { obj => 'VIEW public.limit_thousand_v_2', qual => 'onek' }, { obj => 'VIEW public.limit_thousand_v_3', qual => 'onek' }, { obj => 'VIEW public.limit_thousand_v_4', qual => 'onek' }, + { obj => 'VIEW public.limit_thousand_v_5', qual => 'onek' }, # Since 14 { obj => 'MATERIALIZED VIEW public.compressmv', qual => 'cmdata1' }); From 4b53cb493fa3cb7a6c2e32d3d014b754ae548c2e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 20 May 2025 10:55:05 -0400 Subject: [PATCH 012/115] Fix back-patching of memset_s() fixes. I missed updating msvc/Solution.pm in one branch in 12eee85e5 et al. Per buildfarm. --- src/tools/msvc/Solution.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 8f92b3c5c90..f928be02197 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -238,6 +238,7 @@ sub GenerateFiles HAVE_DECL_LLVMGETHOSTCPUNAME => 0, HAVE_DECL_LLVMGETHOSTCPUFEATURES => 0, HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN => 0, + HAVE_DECL_MEMSET_S => 0, HAVE_DECL_POSIX_FADVISE => 0, HAVE_DECL_PREADV => 0, HAVE_DECL_PWRITEV => 0, @@ -302,7 +303,6 @@ sub GenerateFiles HAVE_MBARRIER_H => undef, HAVE_MBSTOWCS_L => 1, HAVE_MEMORY_H => 1, - HAVE_MEMSET_S => undef, HAVE_MKDTEMP => undef, HAVE_OPENSSL_INIT_SSL => undef, HAVE_OSSP_UUID_H => undef, From 0d2063585876e1333956ae8e3b5efae4b0cff083 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Wed, 21 May 2025 11:55:14 +0900 Subject: [PATCH 013/115] Fix incorrect WAL description for PREPARE TRANSACTION record. Since commit 8b1dccd37c7, the PREPARE TRANSACTION WAL record includes information about dropped statistics entries. However, the WAL resource manager description function for PREPARE TRANSACTION record failed to parse this information correctly and always assumed there were no such entries. As a result, for example, pg_waldump could not display the dropped statistics entries stored in PREPARE TRANSACTION records. The root cause was that ParsePrepareRecord() did not set the number of statistics entries to drop on commit or abort. These values remained zero-initialized and were never updated from the parsed record. This commit fixes the issue by properly setting those values during parsing. With this fix, pg_waldump can now correctly report dropped statistics entries in PREPARE TRANSACTION records. Back-patch to v15, where commit 8b1dccd37c7 was introduced. Author: Daniil Davydov <3danissimo@gmail.com> Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CAJDiXgh-6Epb2XiJe4uL0zF-cf0_s_7Lw1TfEHDMLzYjEmfGOw@mail.gmail.com Backpatch-through: 15 --- src/backend/access/rmgrdesc/xactdesc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index 01610c5ddca..aa3d70119f0 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -252,6 +252,8 @@ ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *p parsed->nsubxacts = xlrec->nsubxacts; parsed->nrels = xlrec->ncommitrels; parsed->nabortrels = xlrec->nabortrels; + parsed->nstats = xlrec->ncommitstats; + parsed->nabortstats = xlrec->nabortstats; parsed->nmsgs = xlrec->ninvalmsgs; strncpy(parsed->twophase_gid, bufptr, xlrec->gidlen); From ee58de10084b42a24aaa3ab4af7713bb2fe02ab4 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 22 May 2025 13:52:46 -0400 Subject: [PATCH 014/115] Fix memory leak in XMLSERIALIZE(... INDENT). xmltotext_with_options sometimes tries to replace the existing root node of a libxml2 document. In that case xmlDocSetRootElement will unlink and return the old root node; if we fail to free it, it's leaked for the remainder of the session. The amount of memory at stake is not large, a couple hundred bytes per occurrence, but that could still become annoying in heavy usage. Our only other xmlDocSetRootElement call is not at risk because it's working on a just-created document, but let's modify that code too to make it clear that it's dependent on that. Author: Tom Lane Reviewed-by: Jim Jones Discussion: https://postgr.es/m/1358967.1747858817@sss.pgh.pa.us Backpatch-through: 16 --- src/backend/utils/adt/xml.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index cbab8308d1c..55154e0261e 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -733,6 +733,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) * content nodes, and then iterate over the nodes. */ xmlNodePtr root; + xmlNodePtr oldroot; xmlNodePtr newline; root = xmlNewNode(NULL, (const xmlChar *) "content-root"); @@ -740,8 +741,14 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate xml node"); - /* This attaches root to doc, so we need not free it separately. */ - xmlDocSetRootElement(doc, root); + /* + * This attaches root to doc, so we need not free it separately... + * but instead, we have to free the old root if there was one. + */ + oldroot = xmlDocSetRootElement(doc, root); + if (oldroot != NULL) + xmlFreeNode(oldroot); + xmlAddChildList(root, content_nodes); /* @@ -1829,6 +1836,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, else { xmlNodePtr root; + xmlNodePtr oldroot PG_USED_FOR_ASSERTS_ONLY; /* set up document with empty root node to be the context node */ doc = xmlNewDoc(version); @@ -1847,8 +1855,13 @@ xml_parse(text *data, XmlOptionType xmloption_arg, if (root == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate xml node"); - /* This attaches root to doc, so we need not free it separately. */ - xmlDocSetRootElement(doc, root); + + /* + * This attaches root to doc, so we need not free it separately; + * and there can't yet be any old root to free. + */ + oldroot = xmlDocSetRootElement(doc, root); + Assert(oldroot == NULL); /* allow empty content */ if (*(utf8string + count)) From e087b5b79452d4df9bca8e64d321d35b763b41c1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 23 May 2025 14:43:44 -0400 Subject: [PATCH 015/115] Fix per-relation memory leakage in autovacuum. PgStat_StatTabEntry and AutoVacOpts structs were leaked until the end of the autovacuum worker's run, which is bad news if there are a lot of relations in the database. Note: pfree'ing the PgStat_StatTabEntry structs here seems a bit risky, because pgstat_fetch_stat_tabentry_ext does not guarantee anything about whether its result is long-lived. It appears okay so long as autovacuum forces PGSTAT_FETCH_CONSISTENCY_NONE, but I think that API could use a re-think. Also ensure that the VacuumRelation structure passed to vacuum() is in recoverable storage. Back-patch to v15 where we started to manage table statistics this way. (The AutoVacOpts leakage is probably older, but I'm not excited enough to worry about just that part.) Author: Tom Lane Reviewed-by: Andres Freund Discussion: https://postgr.es/m/285483.1746756246@sss.pgh.pa.us Backpatch-through: 15 --- src/backend/postmaster/autovacuum.c | 50 +++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 7b1de98d404..4a5df488860 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2211,6 +2211,12 @@ do_autovacuum(void) } } } + + /* Release stuff to avoid per-relation leakage */ + if (relopts) + pfree(relopts); + if (tabentry) + pfree(tabentry); } table_endscan(relScan); @@ -2227,7 +2233,8 @@ do_autovacuum(void) Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple); PgStat_StatTabEntry *tabentry; Oid relid; - AutoVacOpts *relopts = NULL; + AutoVacOpts *relopts; + bool free_relopts = false; bool dovacuum; bool doanalyze; bool wraparound; @@ -2245,7 +2252,9 @@ do_autovacuum(void) * main rel */ relopts = extract_autovac_opts(tuple, pg_class_desc); - if (relopts == NULL) + if (relopts) + free_relopts = true; + else { av_relation *hentry; bool found; @@ -2266,6 +2275,12 @@ do_autovacuum(void) /* ignore analyze for toast tables */ if (dovacuum) table_oids = lappend_oid(table_oids, relid); + + /* Release stuff to avoid leakage */ + if (free_relopts) + pfree(relopts); + if (tabentry) + pfree(tabentry); } table_endscan(relScan); @@ -2637,6 +2652,8 @@ do_autovacuum(void) pg_atomic_test_set_flag(&MyWorkerInfo->wi_dobalance); } + list_free(table_oids); + /* * Perform additional work items, as requested by backends. */ @@ -2818,8 +2835,8 @@ perform_work_item(AutoVacuumWorkItem *workitem) /* * extract_autovac_opts * - * Given a relation's pg_class tuple, return the AutoVacOpts portion of - * reloptions, if set; otherwise, return NULL. + * Given a relation's pg_class tuple, return a palloc'd copy of the + * AutoVacOpts portion of reloptions, if set; otherwise, return NULL. * * Note: callers do not have a relation lock on the table at this point, * so the table could have been dropped, and its catalog rows gone, after @@ -2868,6 +2885,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, autovac_table *tab = NULL; bool wraparound; AutoVacOpts *avopts; + bool free_avopts = false; /* fetch the relation's relcache entry */ classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); @@ -2880,8 +2898,10 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, * main table reloptions if the toast table itself doesn't have. */ avopts = extract_autovac_opts(classTup, pg_class_desc); - if (classForm->relkind == RELKIND_TOASTVALUE && - avopts == NULL && table_toast_map != NULL) + if (avopts) + free_avopts = true; + else if (classForm->relkind == RELKIND_TOASTVALUE && + table_toast_map != NULL) { av_relation *hentry; bool found; @@ -2983,6 +3003,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, avopts->vacuum_cost_delay >= 0)); } + if (free_avopts) + pfree(avopts); heap_freetuple(classTup); return tab; } @@ -3014,6 +3036,10 @@ recheck_relation_needs_vacanalyze(Oid relid, effective_multixact_freeze_max_age, dovacuum, doanalyze, wraparound); + /* Release tabentry to avoid leakage */ + if (tabentry) + pfree(tabentry); + /* ignore ANALYZE for toast tables */ if (classForm->relkind == RELKIND_TOASTVALUE) *doanalyze = false; @@ -3236,18 +3262,22 @@ autovacuum_do_vac_analyze(autovac_table *tab, BufferAccessStrategy bstrategy) VacuumRelation *rel; List *rel_list; MemoryContext vac_context; + MemoryContext old_context; /* Let pgstat know what we're doing */ autovac_report_activity(tab); + /* Create a context that vacuum() can use as cross-transaction storage */ + vac_context = AllocSetContextCreate(CurrentMemoryContext, + "Vacuum", + ALLOCSET_DEFAULT_SIZES); + /* Set up one VacuumRelation target, identified by OID, for vacuum() */ + old_context = MemoryContextSwitchTo(vac_context); rangevar = makeRangeVar(tab->at_nspname, tab->at_relname, -1); rel = makeVacuumRelation(rangevar, tab->at_relid, NIL); rel_list = list_make1(rel); - - vac_context = AllocSetContextCreate(CurrentMemoryContext, - "Vacuum", - ALLOCSET_DEFAULT_SIZES); + MemoryContextSwitchTo(old_context); vacuum(rel_list, &tab->at_params, bstrategy, vac_context, true); From dac37e3f3ba1758121068af85eb0298afb9b106c Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Mon, 26 May 2025 12:47:33 +0900 Subject: [PATCH 016/115] doc: Fix documenation for snapshot export in logical decoding. The documentation for exported snapshots in logical decoding previously stated that snapshot creation may fail on a hot standby. This is no longer accurate, as snapshot exporting on standbys has been supported since PostgreSQL 10. This commit removes the outdated description. Additionally, the docs referred to the NOEXPORT_SNAPSHOT option to suppress snapshot exporting in CREATE_REPLICATION_SLOT. However, since PostgreSQL 15, NOEXPORT_SNAPSHOT is considered legacy syntax and retained only for backward compatibility. This commit updates the documentation for v15 and later to use the modern equivalent: SNAPSHOT 'nothing'. The older syntax is preserved in documentation for v14 and earlier. Back-patched to all supported branches. Reported-by: Kevin K Biju Author: Fujii Masao Reviewed-by: Kevin K Biju Discussion: https://postgr.es/m/174791480466.798.17122832105389395178@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/logicaldecoding.sgml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index cbd3aa804f7..e52bda9fd7e 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -383,9 +383,8 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU using the slot's contents without losing any changes. - Creation of a snapshot is not always possible. In particular, it will - fail when connected to a hot standby. Applications that do not require - snapshot export may suppress it with the NOEXPORT_SNAPSHOT + Applications that do not require + snapshot export may suppress it with the SNAPSHOT 'nothing' option. From a7d3e32c8c0390d4ac1bb086d58340715ee32a46 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 26 May 2025 17:28:41 +0900 Subject: [PATCH 017/115] Fix race condition in subscription TAP test 021_twophase The test did not wait for all the subscriptions to have caught up when dropping the subscription "tab_copy". In a slow environment, it could be possible for the replay of the COMMIT PREPARED transaction "mygid" to not be confirmed yet, causing one prepared transaction to be left around before moving to the next steps of the test. One failure noticed is a transaction found in pg_prepared_xacts for the cases where copy_data = false and two_phase = true, but there should be none after dropping the subscription. As an extra safety measure, a check is added before dropping the subscription, scanning pg_prepared_xacts to make sure that no prepared transactions are left once both subscriptions have caught up. Issue introduced by a8fd13cab0ba, fixing a problem similar to eaf5321c3524. Per buildfarm member kestrel. Author: Vignesh C Reviewed-by: Amit Kapila Discussion: https://postgr.es/m/CALDaNm329QaZ+bwU--bW6GjbNSZ8-38cDE8QWofafub7NV67oA@mail.gmail.com Backpatch-through: 15 --- src/test/subscription/t/021_twophase.pl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/subscription/t/021_twophase.pl b/src/test/subscription/t/021_twophase.pl index 822932c1dbc..087ec7c94ce 100644 --- a/src/test/subscription/t/021_twophase.pl +++ b/src/test/subscription/t/021_twophase.pl @@ -373,7 +373,14 @@ $node_publisher->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); is($result, qq(6), 'publisher inserted data'); +# Wait for both subscribers to catchup $node_publisher->wait_for_catchup($appname_copy); +$node_publisher->wait_for_catchup($appname); + +# Make sure there are no prepared transactions on the subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'should be no prepared transactions on subscriber'); $result = $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); From e9e535d611204266a3c2b587afd9ffbe346fc067 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 28 May 2025 08:59:24 +0900 Subject: [PATCH 018/115] Fix conversion of SIMILAR TO regexes for character classes The code that translates SIMILAR TO pattern matching expressions to POSIX-style regular expressions did not consider that square brackets can be nested. For example, in an expression like [[:alpha:]%_], the logic replaced the placeholders '_' and '%' but it should not. This commit fixes the conversion logic by tracking the nesting level of square brackets marking character class areas, while considering that in expressions like []] or [^]] the first closing square bracket is a regular character. Multiple tests are added to show how the conversions should or should not apply applied while in a character class area, with specific cases added for all the characters converted outside character classes like an opening parenthesis '(', dollar sign '$', etc. Author: Laurenz Albe Reviewed-by: Tom Lane Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/16ab039d1af455652bdf4173402ddda145f2c73b.camel@cybertec.at Backpatch-through: 13 --- src/backend/utils/adt/regexp.c | 38 +++++++++++++--- src/test/regress/expected/strings.out | 62 +++++++++++++++++++++++++++ src/test/regress/sql/strings.sql | 20 +++++++++ 3 files changed, 114 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 702cd52b6d4..a3c918e7a8e 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -774,8 +774,11 @@ similar_escape_internal(text *pat_text, text *esc_text) int plen, elen; bool afterescape = false; - bool incharclass = false; int nquotes = 0; + int charclass_depth = 0; /* Nesting level of character classes, + * encompassed by square brackets */ + int charclass_start = 0; /* State of the character class start, + * for carets */ p = VARDATA_ANY(pat_text); plen = VARSIZE_ANY_EXHDR(pat_text); @@ -905,7 +908,7 @@ similar_escape_internal(text *pat_text, text *esc_text) /* fast path */ if (afterescape) { - if (pchar == '"' && !incharclass) /* escape-double-quote? */ + if (pchar == '"' && charclass_depth < 1) /* escape-double-quote? */ { /* emit appropriate part separator, per notes above */ if (nquotes == 0) @@ -954,18 +957,41 @@ similar_escape_internal(text *pat_text, text *esc_text) /* SQL escape character; do not send to output */ afterescape = true; } - else if (incharclass) + else if (charclass_depth > 0) { if (pchar == '\\') *r++ = '\\'; *r++ = pchar; - if (pchar == ']') - incharclass = false; + + /* + * Ignore a closing bracket at the start of a character class. + * Such a bracket is taken literally rather than closing the + * class. "charclass_start" is 1 right at the beginning of a + * class and 2 after an initial caret. + */ + if (pchar == ']' && charclass_start > 2) + charclass_depth--; + else if (pchar == '[') + charclass_depth++; + + /* + * If there is a caret right after the opening bracket, it negates + * the character class, but a following closing bracket should + * still be treated as a normal character. That holds only for + * the first caret, so only the values 1 and 2 mean that closing + * brackets should be taken literally. + */ + if (pchar == '^') + charclass_start++; + else + charclass_start = 3; /* definitely past the start */ } else if (pchar == '[') { + /* start of a character class */ *r++ = pchar; - incharclass = true; + charclass_depth++; + charclass_start = 1; } else if (pchar == '%') { diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index 62698569e1a..ff6b00e5672 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -596,6 +596,68 @@ SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; ERROR: invalid escape string HINT: Escape string must be empty or one character. +-- Characters that should be left alone in character classes when a +-- SIMILAR TO regexp pattern is converted to POSIX style. +-- Underscore "_" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.[_[:alpha:]_].)$'::text) +(2 rows) + +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.*[%[:alnum:]%].*)$'::text) +(2 rows) + +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\.[.[:alnum:].]\.)$'::text) +(2 rows) + +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\$[$[:alnum:]$]\$)$'::text) +(2 rows) + +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '([([:alnum:](]('; +ERROR: invalid regular expression: parentheses () not balanced +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; + QUERY PLAN +------------------------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]\^)$'::text) +(2 rows) + +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[]%][^]%][^%].*)$'::text) +(2 rows) + +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; + QUERY PLAN +--------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[^^]\^)$'::text) +(2 rows) + -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); regexp_replace diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index ca32f6bba53..e1c520580fb 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -193,6 +193,26 @@ SELECT 'abcd\efg' SIMILAR TO '_bcd\%' ESCAPE '' AS true; SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; +-- Characters that should be left alone in character classes when a +-- SIMILAR TO regexp pattern is converted to POSIX style. +-- Underscore "_" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '([([:alnum:](]('; +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; + -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\&Y', 'g'); From 52d08620e48c0c24d1d69179c88e49f9223f309d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 28 May 2025 09:43:46 +0900 Subject: [PATCH 019/115] Adjust regex for test with opening parenthesis in character classes As written, the test was throwing an error because of an unbalanced parenthesis. The regex used in the test is adjusted to not fail and to test the case of an opening parenthesis in a character class after some nested square brackets. Oversight in d46911e584d4. Discussion: https://postgr.es/m/16ab039d1af455652bdf4173402ddda145f2c73b.camel@cybertec.at --- src/test/regress/expected/strings.out | 9 +++++++-- src/test/regress/sql/strings.sql | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index ff6b00e5672..cb7aa5a1f2c 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -631,8 +631,13 @@ EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$' (2 rows) -- Opening parenthesis "(" -EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '([([:alnum:](]('; -ERROR: invalid regular expression: parentheses () not balanced +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; + QUERY PLAN +------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:(?:)[([:alnum:](](?:))$'::text) +(2 rows) + -- Caret "^" EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; QUERY PLAN diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index e1c520580fb..1f01919496a 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -204,7 +204,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].' -- Dollar "$" EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; -- Opening parenthesis "(" -EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '([([:alnum:](]('; +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; -- Caret "^" EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; -- Closing square bracket "]" at the beginning of character class From 7e8b44f4e0e630971d912628f07a38a7d3a6fae8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 29 May 2025 11:26:27 +0900 Subject: [PATCH 020/115] pg_stat_statements: Fix parameter number gaps in normalized queries pg_stat_statements anticipates that certain constant locations may be recorded multiple times and attempts to avoid calculating a length for these locations in fill_in_constant_lengths(). However, during generate_normalized_query() where normalized query strings are generated, these locations are not excluded from consideration. This could increment the parameter number counter for every recorded occurrence at such a location, leading to an incorrect normalization in certain cases with gaps in the numbers reported. For example, take this query: SELECT WHERE '1' IN ('2'::int, '3'::int::text) Before this commit, it would be normalized like that, with gaps in the parameter numbers: SELECT WHERE $1 IN ($3::int, $4::int::text) However the correct, less confusing one should be like that: SELECT WHERE $1 IN ($2::int, $3::int::text) This commit fixes the computation of the parameter numbers to track the number of constants replaced with an $n by a separate counter instead of the iterator used to loop through the list of locations. The underlying query IDs are not changed, neither are the normalized strings for existing PGSS hash entries. New entries with fresh normalized queries would automatically get reshaped based on the new parameter numbering. Issue discovered while discussing a separate problem for HEAD, but this affects all the stable branches. Author: Sami Imseih Discussion: https://postgr.es/m/CAA5RZ0tzxvWXsacGyxrixdhy3tTTDfJQqxyFBRFh31nNHBQ5qA@mail.gmail.com Backpatch-through: 13 --- .../pg_stat_statements/expected/extended.out | 58 +++++++++++++++++++ .../pg_stat_statements/expected/select.out | 29 ++++++++++ .../pg_stat_statements/pg_stat_statements.c | 4 +- contrib/pg_stat_statements/sql/extended.sql | 16 +++++ contrib/pg_stat_statements/sql/select.sql | 8 +++ 5 files changed, 114 insertions(+), 1 deletion(-) diff --git a/contrib/pg_stat_statements/expected/extended.out b/contrib/pg_stat_statements/expected/extended.out index dbc78680226..f60cbc7bb2e 100644 --- a/contrib/pg_stat_statements/expected/extended.out +++ b/contrib/pg_stat_statements/expected/extended.out @@ -8,3 +8,61 @@ SELECT query_id IS NOT NULL AS query_id_set t (1 row) +-- Various parameter numbering patterns +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Unique query IDs with parameter numbers switched. +SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g +-- +(0 rows) + +-- Two groups of two queries with the same query ID. +SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g +-- +(1 row) + +SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g +-- +(0 rows) + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + query | calls +--------------------------------------------------------------+------- + SELECT WHERE $1::int IN ($2::int, $3::int) | 1 + SELECT WHERE $2::int IN ($1::int, $3::int) | 2 + SELECT WHERE $2::int IN ($1::int, $3::int) | 2 + SELECT WHERE $2::int IN ($3::int, $1::int) | 1 + SELECT WHERE $3::int IN ($1::int, $2::int) | 1 + SELECT WHERE ($1::int, $4) IN (($5, $2::int), ($3::int, $6)) | 1 + SELECT WHERE ($2::int, $4) IN (($5, $3::int), ($1::int, $6)) | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 +(8 rows) + diff --git a/contrib/pg_stat_statements/expected/select.out b/contrib/pg_stat_statements/expected/select.out index 972539b2c51..418413fe7a2 100644 --- a/contrib/pg_stat_statements/expected/select.out +++ b/contrib/pg_stat_statements/expected/select.out @@ -152,6 +152,35 @@ SELECT pg_stat_statements_reset(); (1 row) +-- normalization of constants and parameters, with constant locations +-- recorded one or more times. +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +SELECT WHERE '1' IN ('1'::int, '3'::int::text); +-- +(1 row) + +SELECT WHERE (1, 2) IN ((1, 2), (2, 3)); +-- +(1 row) + +SELECT WHERE (3, 4) IN ((5, 6), (8, 7)); +-- +(0 rows) + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + query | calls +------------------------------------------------------------------------+------- + SELECT WHERE $1 IN ($2::int, $3::int::text) | 1 + SELECT WHERE ($1, $2) IN (($3, $4), ($5, $6)) | 2 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 + SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C" | 0 +(4 rows) + -- -- queries with locking clauses -- diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 55b957d2515..2ec50d54ba5 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -2668,6 +2668,7 @@ generate_normalized_query(JumbleState *jstate, const char *query, n_quer_loc = 0, /* Normalized query byte location */ last_off = 0, /* Offset from start for previous tok */ last_tok_len = 0; /* Length (in bytes) of that tok */ + int num_constants_replaced = 0; /* * Get constants' lengths (core system only gives us locations). Note @@ -2711,7 +2712,8 @@ generate_normalized_query(JumbleState *jstate, const char *query, /* And insert a param symbol in place of the constant token */ n_quer_loc += sprintf(norm_query + n_quer_loc, "$%d", - i + 1 + jstate->highest_extern_param_id); + num_constants_replaced + 1 + jstate->highest_extern_param_id); + num_constants_replaced++; quer_loc = off + tok_len; last_off = off; diff --git a/contrib/pg_stat_statements/sql/extended.sql b/contrib/pg_stat_statements/sql/extended.sql index 07b6c5a93d6..1dd49cf2025 100644 --- a/contrib/pg_stat_statements/sql/extended.sql +++ b/contrib/pg_stat_statements/sql/extended.sql @@ -5,3 +5,19 @@ SET pg_stat_statements.track_utility = FALSE; -- This test checks that an execute message sets a query ID. SELECT query_id IS NOT NULL AS query_id_set FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g + +-- Various parameter numbering patterns +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +-- Unique query IDs with parameter numbers switched. +SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g +SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g +SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g +SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g +SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g +-- Two groups of two queries with the same query ID. +SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g +SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g +SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g +SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; diff --git a/contrib/pg_stat_statements/sql/select.sql b/contrib/pg_stat_statements/sql/select.sql index eef7b0bbf58..7d8f63dac44 100644 --- a/contrib/pg_stat_statements/sql/select.sql +++ b/contrib/pg_stat_statements/sql/select.sql @@ -58,6 +58,14 @@ DEALLOCATE pgss_test; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; SELECT pg_stat_statements_reset(); +-- normalization of constants and parameters, with constant locations +-- recorded one or more times. +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +SELECT WHERE '1' IN ('1'::int, '3'::int::text); +SELECT WHERE (1, 2) IN ((1, 2), (2, 3)); +SELECT WHERE (3, 4) IN ((5, 6), (8, 7)); +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + -- -- queries with locking clauses -- From 8eef55db13fe5b14202729e893eac86ec66ef00d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 29 May 2025 10:39:55 -0400 Subject: [PATCH 021/115] Avoid resource leaks when a dblink connection fails. If we hit out-of-memory between creating the PGconn and inserting it into dblink's hashtable, we'd lose track of the PGconn, which is quite bad since it represents a live connection to a remote DB. Fix by rearranging things so that we create the hashtable entry first. Also reduce the number of states we have to deal with by getting rid of the separately-allocated remoteConn object, instead allocating it in-line in the hashtable entries. (That incidentally removes a session-lifespan memory leak observed in the regression tests.) There is an apparently-irreducible remaining OOM hazard, which is that if the connection fails at the libpq level (ie it's CONNECTION_BAD) then we have to pstrdup the PGconn's error message before we can release it, and theoretically that could fail. However, in such cases we're only leaking memory not a live remote connection, so I'm not convinced that it's worth sweating over. This is a pretty low-probability failure mode of course, but losing a live connection seems bad enough to justify back-patching. Author: Tom Lane Reviewed-by: Matheus Alcantara Discussion: https://postgr.es/m/1346940.1748381911@sss.pgh.pa.us Backpatch-through: 13 --- contrib/dblink/dblink.c | 79 ++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index bd409d7bf1b..f791338bbf9 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -100,7 +100,7 @@ static PGresult *storeQueryResult(volatile storeInfo *sinfo, PGconn *conn, const static void storeRow(volatile storeInfo *sinfo, PGresult *res, bool first); static remoteConn *getConnectionByName(const char *name); static HTAB *createConnHash(void); -static void createNewConnection(const char *name, remoteConn *rconn); +static remoteConn *createNewConnection(const char *name); static void deleteConnection(const char *name); static char **get_pkey_attnames(Relation rel, int16 *indnkeyatts); static char **get_text_array_contents(ArrayType *array, int *numitems); @@ -114,7 +114,8 @@ static Relation get_rel_from_relname(text *relname_text, LOCKMODE lockmode, AclM static char *generate_relation_name(Relation rel); static void dblink_connstr_check(const char *connstr); static bool dblink_connstr_has_pw(const char *connstr); -static void dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr); +static void dblink_security_check(PGconn *conn, const char *connname, + const char *connstr); static void dblink_res_error(PGconn *conn, const char *conname, PGresult *res, bool fail, const char *fmt,...) pg_attribute_printf(5, 6); static char *get_connect_string(const char *servername); @@ -132,16 +133,22 @@ static remoteConn *pconn = NULL; static HTAB *remoteConnHash = NULL; /* - * Following is list that holds multiple remote connections. + * Following is hash that holds multiple remote connections. * Calling convention of each dblink function changes to accept - * connection name as the first parameter. The connection list is + * connection name as the first parameter. The connection hash is * much like ecpg e.g. a mapping between a name and a PGconn object. + * + * To avoid potentially leaking a PGconn object in case of out-of-memory + * errors, we first create the hash entry, then open the PGconn. + * Hence, a hash entry whose rconn.conn pointer is NULL must be + * understood as a leftover from a failed create; it should be ignored + * by lookup operations, and silently replaced by create operations. */ typedef struct remoteConnHashEnt { char name[NAMEDATALEN]; - remoteConn *rconn; + remoteConn rconn; } remoteConnHashEnt; /* initial number of connection hashes */ @@ -216,7 +223,7 @@ dblink_get_conn(char *conname_or_str, errmsg("could not establish connection"), errdetail_internal("%s", msg))); } - dblink_security_check(conn, rconn, connstr); + dblink_security_check(conn, NULL, connstr); if (PQclientEncoding(conn) != GetDatabaseEncoding()) PQsetClientEncoding(conn, GetDatabaseEncodingName()); freeconn = true; @@ -276,15 +283,6 @@ dblink_connect(PG_FUNCTION_ARGS) else if (PG_NARGS() == 1) conname_or_str = text_to_cstring(PG_GETARG_TEXT_PP(0)); - if (connname) - { - rconn = (remoteConn *) MemoryContextAlloc(TopMemoryContext, - sizeof(remoteConn)); - rconn->conn = NULL; - rconn->openCursorCount = 0; - rconn->newXactForCursor = false; - } - /* first check for valid foreign data server */ connstr = get_connect_string(conname_or_str); if (connstr == NULL) @@ -293,6 +291,13 @@ dblink_connect(PG_FUNCTION_ARGS) /* check password in connection string if not superuser */ dblink_connstr_check(connstr); + /* if we need a hashtable entry, make that first, since it might fail */ + if (connname) + { + rconn = createNewConnection(connname); + Assert(rconn->conn == NULL); + } + /* OK to make connection */ conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION); @@ -300,8 +305,8 @@ dblink_connect(PG_FUNCTION_ARGS) { msg = pchomp(PQerrorMessage(conn)); libpqsrv_disconnect(conn); - if (rconn) - pfree(rconn); + if (connname) + deleteConnection(connname); ereport(ERROR, (errcode(ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION), @@ -310,16 +315,16 @@ dblink_connect(PG_FUNCTION_ARGS) } /* check password actually used if not superuser */ - dblink_security_check(conn, rconn, connstr); + dblink_security_check(conn, connname, connstr); /* attempt to set client encoding to match server encoding, if needed */ if (PQclientEncoding(conn) != GetDatabaseEncoding()) PQsetClientEncoding(conn, GetDatabaseEncodingName()); + /* all OK, save away the conn */ if (connname) { rconn->conn = conn; - createNewConnection(connname, rconn); } else { @@ -359,10 +364,7 @@ dblink_disconnect(PG_FUNCTION_ARGS) libpqsrv_disconnect(conn); if (rconn) - { deleteConnection(conname); - pfree(rconn); - } else pconn->conn = NULL; @@ -1280,6 +1282,9 @@ dblink_get_connections(PG_FUNCTION_ARGS) hash_seq_init(&status, remoteConnHash); while ((hentry = (remoteConnHashEnt *) hash_seq_search(&status)) != NULL) { + /* ignore it if it's not an open connection */ + if (hentry->rconn.conn == NULL) + continue; /* stash away current value */ astate = accumArrayResult(astate, CStringGetTextDatum(hentry->name), @@ -2520,8 +2525,8 @@ getConnectionByName(const char *name) hentry = (remoteConnHashEnt *) hash_search(remoteConnHash, key, HASH_FIND, NULL); - if (hentry) - return hentry->rconn; + if (hentry && hentry->rconn.conn != NULL) + return &hentry->rconn; return NULL; } @@ -2538,8 +2543,8 @@ createConnHash(void) HASH_ELEM | HASH_STRINGS); } -static void -createNewConnection(const char *name, remoteConn *rconn) +static remoteConn * +createNewConnection(const char *name) { remoteConnHashEnt *hentry; bool found; @@ -2553,18 +2558,15 @@ createNewConnection(const char *name, remoteConn *rconn) hentry = (remoteConnHashEnt *) hash_search(remoteConnHash, key, HASH_ENTER, &found); - if (found) - { - libpqsrv_disconnect(rconn->conn); - pfree(rconn); - + if (found && hentry->rconn.conn != NULL) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("duplicate connection name"))); - } - hentry->rconn = rconn; - strlcpy(hentry->name, name, sizeof(hentry->name)); + /* New, or reusable, so initialize the rconn struct to zeroes */ + memset(&hentry->rconn, 0, sizeof(remoteConn)); + + return &hentry->rconn; } static void @@ -2592,9 +2594,12 @@ deleteConnection(const char *name) * We need to make sure that the connection made used credentials * which were provided by the user, so check what credentials were * used to connect and then make sure that they came from the user. + * + * On failure, we close "conn" and also delete the hashtable entry + * identified by "connname" (if that's not NULL). */ static void -dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr) +dblink_security_check(PGconn *conn, const char *connname, const char *connstr) { /* Superuser bypasses security check */ if (superuser()) @@ -2612,8 +2617,8 @@ dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr) /* Otherwise, fail out */ libpqsrv_disconnect(conn); - if (rconn) - pfree(rconn); + if (connname) + deleteConnection(connname); ereport(ERROR, (errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED), From db54be898a68b8abccf1d5759dcbde9e23c56195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Fri, 30 May 2025 16:18:18 +0200 Subject: [PATCH 022/115] Fix broken-FK-detection query in release notes Commits 53af9491a043 and 2d5fe514052a fixed a number of problems with foreign keys that reference partitioned tables, and a query to detect already broken FKs was supplied with the release notes for 17.1, 16.5, 15.9, 14.14, 13.17. However, that query has a bug that causes it to wrongly report self-referential foreign keys even when they are correct, so if the user was to drop and rebuild the FKs as indicated, the query would continue to report them as needing to be repaired. Here we fix the query to not have that problem. Reported-by: Paul Foerster Discussion: https://postgr.es/m/5456A1D0-CD47-4315-9C65-71B27E7A2906@gmail.com Backpatch-through: 13-17 --- doc/src/sgml/release-16.sgml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml index f90ead3d56e..3a2b60a9279 100644 --- a/doc/src/sgml/release-16.sgml +++ b/doc/src/sgml/release-16.sgml @@ -3091,10 +3091,14 @@ FROM pg_catalog.pg_constraint c WHERE contype = 'f' AND conparentid = 0 AND (SELECT count(*) FROM pg_catalog.pg_constraint c2 WHERE c2.conparentid = c.oid) <> - (SELECT count(*) FROM pg_catalog.pg_inherits i + ((SELECT count(*) FROM pg_catalog.pg_inherits i WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table - WHERE partrelid = i.inhparent)); + WHERE partrelid = i.inhparent)) + + CASE WHEN pg_catalog.pg_partition_root(conrelid) = confrelid THEN + (SELECT count(*) FROM pg_catalog.pg_partition_tree(confrelid) + WHERE level = 1) + ELSE 0 END); Since it is possible that one or more of the ADD CONSTRAINT steps will fail, you should save the query's From 63fa7caa958874fd6539497c5c765d57c03e312c Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Sat, 31 May 2025 00:08:40 +0900 Subject: [PATCH 023/115] Make XactLockTableWait() and ConditionalXactLockTableWait() interruptable more. Previously, XactLockTableWait() and ConditionalXactLockTableWait() could enter a non-interruptible loop when they successfully acquired a lock on a transaction but the transaction still appeared to be running. Since this loop continued until the transaction completed, it could result in long, uninterruptible waits. Although this scenario is generally unlikely since XactLockTableWait() and ConditionalXactLockTableWait() can basically acquire a transaction lock only when the transaction is not running, it can occur in a hot standby. In such cases, the transaction may still appear active due to the KnownAssignedXids list, even while no lock on the transaction exists. For example, this situation can happen when creating a logical replication slot on a standby. The cause of the non-interruptible loop was the absence of CHECK_FOR_INTERRUPTS() within it. This commit adds CHECK_FOR_INTERRUPTS() to the loop in both functions, ensuring they can be interrupted safely. Back-patch to all supported branches. Author: Kevin K Biju Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CAM45KeELdjhS-rGuvN=ZLJ_asvZACucZ9LZWVzH7bGcD12DDwg@mail.gmail.com Backpatch-through: 13 --- src/backend/storage/lmgr/lmgr.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index 1f87b127541..682ebcdb5a6 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -716,7 +716,10 @@ XactLockTableWait(TransactionId xid, Relation rel, ItemPointer ctid, * through, to avoid slowing down the normal case.) */ if (!first) + { + CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); + } first = false; xid = SubTransGetTopmostTransaction(xid); } @@ -754,7 +757,10 @@ ConditionalXactLockTableWait(TransactionId xid) /* See XactLockTableWait about this case */ if (!first) + { + CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); + } first = false; xid = SubTransGetTopmostTransaction(xid); } From ca70ee6ede1bde959a84eb69a6d9b7ba6f3e49ca Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 30 May 2025 12:55:15 -0400 Subject: [PATCH 024/115] Allow larger packets during GSSAPI authentication exchange. Our GSSAPI code only allows packet sizes up to 16kB. However it emerges that during authentication, larger packets might be needed; various authorities suggest 48kB or 64kB as the maximum packet size. This limitation caused login failure for AD users who belong to many AD groups. To add insult to injury, we gave an unintelligible error message, typically "GSSAPI context establishment error: The routine must be called again to complete its function: Unknown error". As noted in code comments, the 16kB packet limit is effectively a protocol constant once we are doing normal data transmission: the GSSAPI code splits the data stream at those points, and if we change the limit then we will have cross-version compatibility problems due to the receiver's buffer being too small in some combinations. However, during the authentication exchange the packet sizes are not determined by us, but by the underlying GSSAPI library. So we might as well just try to send what the library tells us to. An unpatched recipient will fail on a packet larger than 16kB, but that's not worse than the sender failing without even trying. So this doesn't introduce any meaningful compatibility problem. We still need a buffer size limit, but we can easily make it be 64kB rather than 16kB until transport negotiation is complete. (Larger values were discussed, but don't seem likely to add anything.) Reported-by: Chris Gooch Fix-suggested-by: Jacob Champion Author: Tom Lane Reviewed-by: Jacob Champion Discussion: https://postgr.es/m/DS0PR22MB5971A9C8A3F44BCC6293C4DABE99A@DS0PR22MB5971.namprd22.prod.outlook.com Backpatch-through: 13 --- src/backend/libpq/be-secure-gssapi.c | 61 +++++++++++++++------- src/interfaces/libpq/fe-secure-gssapi.c | 68 ++++++++++++++++++------- 2 files changed, 94 insertions(+), 35 deletions(-) diff --git a/src/backend/libpq/be-secure-gssapi.c b/src/backend/libpq/be-secure-gssapi.c index 8ed2f65347a..657beaa5a70 100644 --- a/src/backend/libpq/be-secure-gssapi.c +++ b/src/backend/libpq/be-secure-gssapi.c @@ -45,11 +45,18 @@ * don't want the other side to send arbitrarily huge packets as we * would have to allocate memory for them to then pass them to GSSAPI. * - * Therefore, these two #define's are effectively part of the protocol + * Therefore, this #define is effectively part of the protocol * spec and can't ever be changed. */ -#define PQ_GSS_SEND_BUFFER_SIZE 16384 -#define PQ_GSS_RECV_BUFFER_SIZE 16384 +#define PQ_GSS_MAX_PACKET_SIZE 16384 /* includes uint32 header word */ + +/* + * However, during the authentication exchange we must cope with whatever + * message size the GSSAPI library wants to send (because our protocol + * doesn't support splitting those messages). Depending on configuration + * those messages might be as much as 64kB. + */ +#define PQ_GSS_AUTH_BUFFER_SIZE 65536 /* includes uint32 header word */ /* * Since we manage at most one GSS-encrypted connection per backend, @@ -209,12 +216,12 @@ be_gssapi_write(Port *port, void *ptr, size_t len) errno = ECONNRESET; return -1; } - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("server tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)))); errno = ECONNRESET; return -1; } @@ -345,12 +352,12 @@ be_gssapi_read(Port *port, void *ptr, size_t len) /* Decode the packet length and check for overlength packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("oversize GSSAPI packet sent by the client (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)))); errno = ECONNRESET; return -1; } @@ -514,10 +521,13 @@ secure_open_gssapi(Port *port) * that will never use them, and we ensure that the buffers are * sufficiently aligned for the length-word accesses that we do in some * places in this file. + * + * We'll use PQ_GSS_AUTH_BUFFER_SIZE-sized buffers until transport + * negotiation is complete, then switch to PQ_GSS_MAX_PACKET_SIZE. */ - PqGSSSendBuffer = malloc(PQ_GSS_SEND_BUFFER_SIZE); - PqGSSRecvBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); - PqGSSResultBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); + PqGSSSendBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) ereport(FATAL, (errcode(ERRCODE_OUT_OF_MEMORY), @@ -565,16 +575,16 @@ secure_open_gssapi(Port *port) /* * During initialization, packets are always fully consumed and - * shouldn't ever be over PQ_GSS_RECV_BUFFER_SIZE in length. + * shouldn't ever be over PQ_GSS_AUTH_BUFFER_SIZE in total length. * * Verify on our side that the client doesn't do something funny. */ - if (input.length > PQ_GSS_RECV_BUFFER_SIZE) + if (input.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { ereport(COMMERROR, - (errmsg("oversize GSSAPI packet sent by the client (%zu > %d)", + (errmsg("oversize GSSAPI packet sent by the client (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE))); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)))); return -1; } @@ -628,12 +638,12 @@ secure_open_gssapi(Port *port) { uint32 netlen = pg_hton32(output.length); - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("server tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)))); gss_release_buffer(&minor, &output); return -1; } @@ -688,12 +698,29 @@ secure_open_gssapi(Port *port) break; } + /* + * Release the large authentication buffers and allocate the ones we want + * for normal operation. + */ + free(PqGSSSendBuffer); + free(PqGSSRecvBuffer); + free(PqGSSResultBuffer); + PqGSSSendBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) + ereport(FATAL, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + PqGSSRecvLength = PqGSSResultLength = PqGSSResultNext = 0; + /* * Determine the max packet size which will fit in our buffer, after * accounting for the length. be_gssapi_write will need this. */ major = gss_wrap_size_limit(&minor, port->gss->ctx, 1, GSS_C_QOP_DEFAULT, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32), + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32), &PqGSSMaxPktSize); if (GSS_ERROR(major)) diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c index ea8b0020d27..8000d0b5783 100644 --- a/src/interfaces/libpq/fe-secure-gssapi.c +++ b/src/interfaces/libpq/fe-secure-gssapi.c @@ -47,11 +47,18 @@ * don't want the other side to send arbitrarily huge packets as we * would have to allocate memory for them to then pass them to GSSAPI. * - * Therefore, these two #define's are effectively part of the protocol + * Therefore, this #define is effectively part of the protocol * spec and can't ever be changed. */ -#define PQ_GSS_SEND_BUFFER_SIZE 16384 -#define PQ_GSS_RECV_BUFFER_SIZE 16384 +#define PQ_GSS_MAX_PACKET_SIZE 16384 /* includes uint32 header word */ + +/* + * However, during the authentication exchange we must cope with whatever + * message size the GSSAPI library wants to send (because our protocol + * doesn't support splitting those messages). Depending on configuration + * those messages might be as much as 64kB. + */ +#define PQ_GSS_AUTH_BUFFER_SIZE 65536 /* includes uint32 header word */ /* * We need these state variables per-connection. To allow the functions @@ -203,11 +210,11 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) goto cleanup; } - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "client tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)); errno = EIO; /* for lack of a better idea */ goto cleanup; } @@ -342,11 +349,11 @@ pg_GSS_read(PGconn *conn, void *ptr, size_t len) /* Decode the packet length and check for overlength packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "oversize GSSAPI packet sent by the server (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)); errno = EIO; /* for lack of a better idea */ return -1; } @@ -485,12 +492,15 @@ pqsecure_open_gss(PGconn *conn) * initialize state variables. By malloc'ing the buffers separately, we * ensure that they are sufficiently aligned for the length-word accesses * that we do in some places in this file. + * + * We'll use PQ_GSS_AUTH_BUFFER_SIZE-sized buffers until transport + * negotiation is complete, then switch to PQ_GSS_MAX_PACKET_SIZE. */ if (PqGSSSendBuffer == NULL) { - PqGSSSendBuffer = malloc(PQ_GSS_SEND_BUFFER_SIZE); - PqGSSRecvBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); - PqGSSResultBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); + PqGSSSendBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) { libpq_append_conn_error(conn, "out of memory"); @@ -564,13 +574,13 @@ pqsecure_open_gss(PGconn *conn) * so leave a spot at the end for a NULL byte too) and report that * back to the caller. */ - result = gss_read(conn, PqGSSRecvBuffer + PqGSSRecvLength, PQ_GSS_RECV_BUFFER_SIZE - PqGSSRecvLength - 1, &ret); + result = gss_read(conn, PqGSSRecvBuffer + PqGSSRecvLength, PQ_GSS_AUTH_BUFFER_SIZE - PqGSSRecvLength - 1, &ret); if (result != PGRES_POLLING_OK) return result; PqGSSRecvLength += ret; - Assert(PqGSSRecvLength < PQ_GSS_RECV_BUFFER_SIZE); + Assert(PqGSSRecvLength < PQ_GSS_AUTH_BUFFER_SIZE); PqGSSRecvBuffer[PqGSSRecvLength] = '\0'; appendPQExpBuffer(&conn->errorMessage, "%s\n", PqGSSRecvBuffer + 1); @@ -584,11 +594,11 @@ pqsecure_open_gss(PGconn *conn) /* Get the length and check for over-length packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "oversize GSSAPI packet sent by the server (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)); return PGRES_POLLING_FAILED; } @@ -668,12 +678,33 @@ pqsecure_open_gss(PGconn *conn) conn->gcred = GSS_C_NO_CREDENTIAL; gss_release_buffer(&minor, &output); + /* + * Release the large authentication buffers and allocate the ones we + * want for normal operation. (This maneuver is safe only because + * pqDropConnection will drop the buffers; otherwise, during a + * reconnection we'd be at risk of using undersized buffers during + * negotiation.) + */ + free(PqGSSSendBuffer); + free(PqGSSRecvBuffer); + free(PqGSSResultBuffer); + PqGSSSendBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) + { + libpq_append_conn_error(conn, "out of memory"); + return PGRES_POLLING_FAILED; + } + PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + PqGSSRecvLength = PqGSSResultLength = PqGSSResultNext = 0; + /* * Determine the max packet size which will fit in our buffer, after * accounting for the length. pg_GSS_write will need this. */ major = gss_wrap_size_limit(&minor, conn->gctx, 1, GSS_C_QOP_DEFAULT, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32), + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32), &PqGSSMaxPktSize); if (GSS_ERROR(major)) @@ -687,10 +718,11 @@ pqsecure_open_gss(PGconn *conn) } /* Must have output.length > 0 */ - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { - pg_GSS_error(libpq_gettext("GSSAPI context establishment error"), - conn, major, minor); + libpq_append_conn_error(conn, "client tried to send oversize GSSAPI packet (%zu > %zu)", + (size_t) output.length, + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)); gss_release_buffer(&minor, &output); return PGRES_POLLING_FAILED; } From 2b92dc4eeb51a1b66641718e072b96b63659448c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 30 May 2025 13:45:41 -0400 Subject: [PATCH 025/115] Fix memory leakage in postgres_fdw's DirectModify code path. postgres_fdw tries to use PG_TRY blocks to ensure that it will eventually free the PGresult created by the remote modify command. However, it's fundamentally impossible for this scheme to work reliably when there's RETURNING data, because the query could fail in between invocations of postgres_fdw's DirectModify methods. There is at least one instance of exactly this situation in the regression tests, and the ensuing session-lifespan leak is visible under Valgrind. We can improve matters by using a memory context reset callback attached to the ExecutorState context. That ensures that the PGresult will be freed when the ExecutorState context is torn down, even if control never reaches postgresEndDirectModify. I have little faith that there aren't other potential PGresult leakages in the backend modules that use libpq. So I think it'd be a good idea to apply this concept universally by creating infrastructure that attaches a reset callback to every PGresult generated in the backend. However, that seems too invasive for v18 at this point, let alone the back branches. So for the moment, apply this narrow fix that just makes DirectModify safe. I have a patch in the queue for the more general idea, but it will have to wait for v19. Author: Tom Lane Reviewed-by: Matheus Alcantara Discussion: https://postgr.es/m/2976982.1748049023@sss.pgh.pa.us Backpatch-through: 13 --- contrib/postgres_fdw/postgres_fdw.c | 62 ++++++++++++++++------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 8657a3b0e23..afb2682781f 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -239,6 +239,7 @@ typedef struct PgFdwDirectModifyState PGresult *result; /* result for query */ int num_tuples; /* # of result tuples */ int next_tuple; /* index of next one to return */ + MemoryContextCallback result_cb; /* ensures result will get freed */ Relation resultRel; /* relcache entry for the target relation */ AttrNumber *attnoMap; /* array of attnums of input user columns */ AttrNumber ctidAttno; /* attnum of input ctid column */ @@ -2659,6 +2660,17 @@ postgresBeginDirectModify(ForeignScanState *node, int eflags) dmstate = (PgFdwDirectModifyState *) palloc0(sizeof(PgFdwDirectModifyState)); node->fdw_state = (void *) dmstate; + /* + * We use a memory context callback to ensure that the dmstate's PGresult + * (if any) will be released, even if the query fails somewhere that's + * outside our control. The callback is always armed for the duration of + * the query; this relies on PQclear(NULL) being a no-op. + */ + dmstate->result_cb.func = (MemoryContextCallbackFunction) PQclear; + dmstate->result_cb.arg = NULL; + MemoryContextRegisterResetCallback(CurrentMemoryContext, + &dmstate->result_cb); + /* * Identify which user to do the remote access as. This should match what * ExecCheckPermissions() does. @@ -2806,7 +2818,13 @@ postgresEndDirectModify(ForeignScanState *node) return; /* Release PGresult */ - PQclear(dmstate->result); + if (dmstate->result) + { + PQclear(dmstate->result); + dmstate->result = NULL; + /* ... and don't forget to disable the callback */ + dmstate->result_cb.arg = NULL; + } /* Release remote connection */ ReleaseConnection(dmstate->conn); @@ -4575,13 +4593,17 @@ execute_dml_stmt(ForeignScanState *node) /* * Get the result, and check for success. * - * We don't use a PG_TRY block here, so be careful not to throw error - * without releasing the PGresult. + * We use a memory context callback to ensure that the PGresult will be + * released, even if the query fails somewhere that's outside our control. + * The callback is already registered, just need to fill in its arg. */ + Assert(dmstate->result == NULL); dmstate->result = pgfdw_get_result(dmstate->conn, dmstate->query); + dmstate->result_cb.arg = dmstate->result; + if (PQresultStatus(dmstate->result) != (dmstate->has_returning ? PGRES_TUPLES_OK : PGRES_COMMAND_OK)) - pgfdw_report_error(ERROR, dmstate->result, dmstate->conn, true, + pgfdw_report_error(ERROR, dmstate->result, dmstate->conn, false, dmstate->query); /* Get the number of rows affected. */ @@ -4625,30 +4647,16 @@ get_returning_data(ForeignScanState *node) } else { - /* - * On error, be sure to release the PGresult on the way out. Callers - * do not have PG_TRY blocks to ensure this happens. - */ - PG_TRY(); - { - HeapTuple newtup; - - newtup = make_tuple_from_result_row(dmstate->result, - dmstate->next_tuple, - dmstate->rel, - dmstate->attinmeta, - dmstate->retrieved_attrs, - node, - dmstate->temp_cxt); - ExecStoreHeapTuple(newtup, slot, false); - } - PG_CATCH(); - { - PQclear(dmstate->result); - PG_RE_THROW(); - } - PG_END_TRY(); + HeapTuple newtup; + newtup = make_tuple_from_result_row(dmstate->result, + dmstate->next_tuple, + dmstate->rel, + dmstate->attinmeta, + dmstate->retrieved_attrs, + node, + dmstate->temp_cxt); + ExecStoreHeapTuple(newtup, slot, false); /* Get the updated/deleted tuple. */ if (dmstate->rel) resultSlot = slot; From 24135398f1e18e7779fd5052af8399c9d6bb5ff7 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Fri, 30 May 2025 15:17:28 -0500 Subject: [PATCH 026/115] Ensure we have a snapshot when updating various system catalogs. A few places that access system catalogs don't set up an active snapshot before potentially accessing their TOAST tables. To fix, push an active snapshot just before each section of code that might require accessing one of these TOAST tables, and pop it shortly afterwards. While at it, this commit adds some rather strict assertions in an attempt to prevent such issues in the future. Commit 16bf24e0e4 recently removed pg_replication_origin's TOAST table in order to fix the same problem for that catalog. On the back-branches, those bugs are left in place. We cannot easily remove a catalog's TOAST table on released major versions, and only replication origins with extremely long names are affected. Given the low severity of the issue, fixing older versions doesn't seem worth the trouble of significantly modifying the patch. Also, on v13 and v14, the aforementioned strict assertions have been omitted because commit 2776922201, which added HaveRegisteredOrActiveSnapshot(), was not back-patched. While we could probably back-patch it now, I've opted against it because it seems unlikely that new TOAST snapshot issues will be introduced in the oldest supported versions. Reported-by: Alexander Lakhin Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/18127-fe54b6a667f29658%40postgresql.org Discussion: https://postgr.es/m/18309-c0bf914950c46692%40postgresql.org Discussion: https://postgr.es/m/ZvMSUPOqUU-VNADN%40nathan Backpatch-through: 13 --- src/backend/access/heap/heapam.c | 41 ++++++++++++++++++++++++ src/backend/commands/indexcmds.c | 8 +++++ src/backend/commands/tablecmds.c | 8 +++++ src/backend/postmaster/autovacuum.c | 7 ++++ src/backend/replication/logical/worker.c | 24 ++++++++++++++ 5 files changed, 88 insertions(+) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 429dc2cebe3..6e7e07929d2 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -54,6 +54,7 @@ #include "catalog/catalog.h" #include "catalog/pg_database.h" #include "catalog/pg_database_d.h" +#include "catalog/pg_replication_origin.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "pgstat.h" @@ -231,6 +232,38 @@ static const int MultiXactStatusLock[MaxMultiXactStatus + 1] = #define TUPLOCK_from_mxstatus(status) \ (MultiXactStatusLock[(status)]) +/* + * Check that we have a valid snapshot if we might need TOAST access. + */ +static inline void +AssertHasSnapshotForToast(Relation rel) +{ +#ifdef USE_ASSERT_CHECKING + + /* bootstrap mode in particular breaks this rule */ + if (!IsNormalProcessingMode()) + return; + + /* if the relation doesn't have a TOAST table, we are good */ + if (!OidIsValid(rel->rd_rel->reltoastrelid)) + return; + + /* + * Commit 16bf24e fixed accesses to pg_replication_origin without a + * an active snapshot by removing its TOAST table. On older branches, + * these bugs are left in place. Its only varlena column is roname (the + * replication origin name), so this is only a problem if the name + * requires out-of-line storage, which seems unlikely. In any case, + * fixing it doesn't seem worth extra code churn on the back-branches. + */ + if (RelationGetRelid(rel) == ReplicationOriginRelationId) + return; + + Assert(HaveRegisteredOrActiveSnapshot()); + +#endif /* USE_ASSERT_CHECKING */ +} + /* ---------------------------------------------------------------- * heap support routines * ---------------------------------------------------------------- @@ -1858,6 +1891,8 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid, Assert(HeapTupleHeaderGetNatts(tup->t_data) <= RelationGetNumberOfAttributes(relation)); + AssertHasSnapshotForToast(relation); + /* * Fill in tuple header fields and toast the tuple if necessary. * @@ -2135,6 +2170,8 @@ heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples, /* currently not needed (thus unsupported) for heap_multi_insert() */ Assert(!(options & HEAP_INSERT_NO_LOGICAL)); + AssertHasSnapshotForToast(relation); + needwal = RelationNeedsWAL(relation); saveFreeSpace = RelationGetTargetPageFreeSpace(relation, HEAP_DEFAULT_FILLFACTOR); @@ -2557,6 +2594,8 @@ heap_delete(Relation relation, ItemPointer tid, Assert(ItemPointerIsValid(tid)); + AssertHasSnapshotForToast(relation); + /* * Forbid this during a parallel operation, lest it allocate a combo CID. * Other workers might need that combo CID for visibility checks, and we @@ -3052,6 +3091,8 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, Assert(HeapTupleHeaderGetNatts(newtup->t_data) <= RelationGetNumberOfAttributes(relation)); + AssertHasSnapshotForToast(relation); + /* * Forbid this during a parallel operation, lest it allocate a combo CID. * Other workers might need that combo CID for visibility checks, and we diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index ea3967b7c28..cf6ef3a955d 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -4064,12 +4064,20 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) get_rel_namespace(oldidx->tableId), false); + /* + * Swapping the indexes might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* * Swap old index with the new one. This also marks the new one as * valid and the old one as not valid. */ index_concurrently_swap(newidx->indexId, oldidx->indexId, oldName); + PopActiveSnapshot(); + /* * Invalidate the relcache for the table, so that after this commit * all sessions will refresh any cached plans that might reference the diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 633a9c8317c..cfb64768303 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -18789,9 +18789,17 @@ ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, tab->rel = rel; } + /* + * Detaching the partition might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* Do the final part of detaching */ DetachPartitionFinalize(rel, partRel, concurrent, defaultPartOid); + PopActiveSnapshot(); + ObjectAddressSet(address, RelationRelationId, RelationGetRelid(partRel)); /* keep our lock until commit */ diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 4a5df488860..256c25af3b1 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2372,6 +2372,12 @@ do_autovacuum(void) get_namespace_name(classForm->relnamespace), NameStr(classForm->relname)))); + /* + * Deletion might involve TOAST table access, so ensure we have a + * valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + object.classId = RelationRelationId; object.objectId = relid; object.objectSubId = 0; @@ -2384,6 +2390,7 @@ do_autovacuum(void) * To commit the deletion, end current transaction and start a new * one. Note this also releases the locks we took. */ + PopActiveSnapshot(); CommitTransactionCommand(); StartTransactionCommand(); diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 363085b46a1..4df0a594dc9 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -4725,8 +4725,16 @@ ApplyWorkerMain(Datum main_arg) walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); StartTransactionCommand(); + + /* + * Updating pg_subscription might involve TOAST table access, so + * ensure we have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + UpdateTwoPhaseState(MySubscription->oid, LOGICALREP_TWOPHASE_STATE_ENABLED); MySubscription->twophasestate = LOGICALREP_TWOPHASE_STATE_ENABLED; + PopActiveSnapshot(); CommitTransactionCommand(); } else @@ -4779,7 +4787,15 @@ DisableSubscriptionAndExit(void) /* Disable the subscription */ StartTransactionCommand(); + + /* + * Updating pg_subscription might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + DisableSubscription(MySubscription->oid); + PopActiveSnapshot(); CommitTransactionCommand(); /* Ensure we remove no-longer-useful entry for worker's start time */ @@ -4883,6 +4899,12 @@ clear_subscription_skip_lsn(XLogRecPtr finish_lsn) started_tx = true; } + /* + * Updating pg_subscription might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* * Protect subskiplsn of pg_subscription from being concurrently updated * while clearing it. @@ -4941,6 +4963,8 @@ clear_subscription_skip_lsn(XLogRecPtr finish_lsn) heap_freetuple(tup); table_close(rel, NoLock); + PopActiveSnapshot(); + if (started_tx) CommitTransactionCommand(); } From 3611794affb6b52cece75aff58cf49e782a46442 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Sat, 31 May 2025 12:19:37 +0100 Subject: [PATCH 027/115] Fix MERGE into a plain inheritance parent table. When a MERGE's target table is the parent of an inheritance tree, any INSERT actions insert into the parent table using ModifyTableState's rootResultRelInfo. However, there are two bugs in the way this is initialized: 1. ExecInitMerge() incorrectly uses a different ResultRelInfo entry from ModifyTableState's resultRelInfo array to build the insert projection, which may not be compatible with rootResultRelInfo. 2. ExecInitModifyTable() does not fully initialize rootResultRelInfo. Specifically, ri_WithCheckOptions, ri_WithCheckOptionExprs, ri_returningList, and ri_projectReturning are not initialized. This can lead to crashes, or incorrect query results due to failing to check WCO's or process the RETURNING list for INSERT actions. Fix both these bugs in ExecInitMerge(), noting that it is only necessary to fully initialize rootResultRelInfo if the MERGE has INSERT actions and the target table is a plain inheritance parent. Backpatch to v15, where MERGE was introduced. Reported-by: Andres Freund Author: Dean Rasheed Reviewed-by: Jian He Reviewed-by: Tender Wang Discussion: https://postgr.es/m/4rlmjfniiyffp6b3kv4pfy4jw3pciy6mq72rdgnedsnbsx7qe5@j5hlpiwdguvc Backpatch-through: 15 --- src/backend/executor/nodeModifyTable.c | 93 +++++++++++++++++++++++++- src/test/regress/expected/merge.out | 58 ++++++++++++++++ src/test/regress/sql/merge.sql | 41 ++++++++++++ 3 files changed, 189 insertions(+), 3 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index b8810f8b33e..a31c24c3cc3 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -64,6 +64,7 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "rewrite/rewriteHandler.h" +#include "rewrite/rewriteManip.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" #include "utils/builtins.h" @@ -3394,6 +3395,7 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) switch (action->commandType) { case CMD_INSERT: + /* INSERT actions always use rootRelInfo */ ExecCheckPlanOutput(rootRelInfo->ri_RelationDesc, action->targetList); @@ -3433,9 +3435,23 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) } else { - /* not partitioned? use the stock relation and slot */ - tgtslot = resultRelInfo->ri_newTupleSlot; - tgtdesc = RelationGetDescr(resultRelInfo->ri_RelationDesc); + /* + * If the MERGE targets an inherited table, we insert + * into the root table, so we must initialize its + * "new" tuple slot, if not already done, and use its + * relation descriptor for the projection. + * + * For non-inherited tables, rootRelInfo and + * resultRelInfo are the same, and the "new" tuple + * slot will already have been initialized. + */ + if (rootRelInfo->ri_newTupleSlot == NULL) + rootRelInfo->ri_newTupleSlot = + table_slot_create(rootRelInfo->ri_RelationDesc, + &estate->es_tupleTable); + + tgtslot = rootRelInfo->ri_newTupleSlot; + tgtdesc = RelationGetDescr(rootRelInfo->ri_RelationDesc); } action_state->mas_proj = @@ -3468,6 +3484,77 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) } } } + + /* + * If the MERGE targets an inherited table, any INSERT actions will use + * rootRelInfo, and rootRelInfo will not be in the resultRelInfo array. + * Therefore we must initialize its WITH CHECK OPTION constraints, as + * ExecInitModifyTable did for the resultRelInfo entries, but there should + * be nothing to do for RETURNING, since MERGE does not support RETURNING. + * + * Note that the planner does not build a withCheckOptionList for the root + * relation, but as in ExecInitPartitionInfo, we can use the first + * resultRelInfo entry as a reference to calculate the attno's for the + * root table. + */ + if (rootRelInfo != mtstate->resultRelInfo && + rootRelInfo->ri_RelationDesc->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && + (mtstate->mt_merge_subcommands & MERGE_INSERT) != 0) + { + Relation rootRelation = rootRelInfo->ri_RelationDesc; + Relation firstResultRel = mtstate->resultRelInfo[0].ri_RelationDesc; + + if (node->withCheckOptionLists != NIL) + { + List *wcoList; + List *wcoExprs = NIL; + + /* There should be as many WCO lists as result rels */ + Assert(list_length(node->withCheckOptionLists) == + list_length(node->resultRelations)); + + /* + * Use the first WCO list as a reference. In the most common case, + * this will be for the same relation as rootRelInfo, and so there + * will be no need to adjust its attno's. + */ + wcoList = linitial(node->withCheckOptionLists); + if (rootRelation != firstResultRel) + { + int firstVarno = mtstate->resultRelInfo[0].ri_RangeTableIndex; + AttrMap *part_attmap; + bool found_whole_row; + + /* Convert any Vars in it to contain the root's attno's */ + part_attmap = + build_attrmap_by_name(RelationGetDescr(rootRelation), + RelationGetDescr(firstResultRel), + false); + + wcoList = (List *) + map_variable_attnos((Node *) wcoList, + firstVarno, 0, + part_attmap, + RelationGetForm(rootRelation)->reltype, + &found_whole_row); + } + + foreach(lc, wcoList) + { + WithCheckOption *wco = lfirst_node(WithCheckOption, lc); + ExprState *wcoExpr = ExecInitQual(castNode(List, wco->qual), + &mtstate->ps); + + wcoExprs = lappend(wcoExprs, wcoExpr); + } + + rootRelInfo->ri_WithCheckOptions = wcoList; + rootRelInfo->ri_WithCheckOptionExprs = wcoExprs; + } + + /* MERGE does not support RETURNING */ + Assert(node->returningLists == NIL); + } } /* diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out index 5d1be9f6b24..fbc47c47f00 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -2311,6 +2311,64 @@ SELECT * FROM new_measurement ORDER BY city_id, logdate; 1 | 01-17-2007 | | (2 rows) +-- MERGE into inheritance root table +DROP TRIGGER insert_measurement_trigger ON measurement; +ALTER TABLE measurement ADD CONSTRAINT mcheck CHECK (city_id = 0) NO INHERIT; +EXPLAIN (COSTS OFF) +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); + QUERY PLAN +-------------------------------------------------------------------------- + Merge on measurement m + Merge on measurement_y2007m01 m_1 + -> Nested Loop Left Join + -> Result + -> Seq Scan on measurement_y2007m01 m_1 + Filter: ((city_id = 1) AND (logdate = '01-17-2007'::date)) +(6 rows) + +BEGIN; +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 0 | 07-21-2005 | 25 | 35 + 0 | 01-17-2007 | 25 | 100 +(2 rows) + +ROLLBACK; +ALTER TABLE measurement ENABLE ROW LEVEL SECURITY; +ALTER TABLE measurement FORCE ROW LEVEL SECURITY; +CREATE POLICY measurement_p ON measurement USING (peaktemp IS NOT NULL); +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, NULL, 100); -- should fail +ERROR: new row violates row-level security policy for table "measurement" +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); -- ok +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 0 | 07-21-2005 | 25 | 35 + 0 | 01-17-2007 | 25 | 100 +(2 rows) + DROP TABLE measurement, new_measurement CASCADE; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table measurement_y2006m02 diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql index 4609241b2a5..d357471c350 100644 --- a/src/test/regress/sql/merge.sql +++ b/src/test/regress/sql/merge.sql @@ -1500,6 +1500,47 @@ WHEN MATCHED THEN DELETE; SELECT * FROM new_measurement ORDER BY city_id, logdate; +-- MERGE into inheritance root table +DROP TRIGGER insert_measurement_trigger ON measurement; +ALTER TABLE measurement ADD CONSTRAINT mcheck CHECK (city_id = 0) NO INHERIT; + +EXPLAIN (COSTS OFF) +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); + +BEGIN; +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; +ROLLBACK; + +ALTER TABLE measurement ENABLE ROW LEVEL SECURITY; +ALTER TABLE measurement FORCE ROW LEVEL SECURITY; +CREATE POLICY measurement_p ON measurement USING (peaktemp IS NOT NULL); + +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, NULL, 100); -- should fail + +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); -- ok +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + DROP TABLE measurement, new_measurement CASCADE; DROP FUNCTION measurement_insert_trigger(); From 5c7fd5976284b8aa1f44682f2501b23cbe7bda94 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 1 Jun 2025 14:48:35 -0400 Subject: [PATCH 028/115] Fix edge-case resource leaks in PL/Python error reporting. PLy_elog_impl and its subroutine PLy_traceback intended to avoid leaking any PyObject reference counts, but their coverage of the matter was sadly incomplete. In particular, out-of-memory errors in most of the string-construction subroutines could lead to reference count leaks, because those calls were outside the PG_TRY blocks responsible for dropping reference counts. Fix by (a) adjusting the scopes of the PG_TRY blocks, and (b) moving the responsibility for releasing the reference counts of the traceback-stack objects to PLy_elog_impl. This requires some additional "volatile" markers, but not too many. In passing, fix an ancient thinko: use of the "e_module_o" PyObject was guarded by "if (e_type_s)", where surely "if (e_module_o)" was meant. This would only have visible consequences if the "__name__" attribute were present but the "__module__" attribute wasn't, which apparently never happens; but someday it might. Rearranging the PG_TRY blocks requires indenting a fair amount of code one more tab stop, which I'll do separately for clarity. Author: Tom Lane Discussion: https://postgr.es/m/2954090.1748723636@sss.pgh.pa.us Backpatch-through: 13 --- src/pl/plpython/plpy_elog.c | 105 +++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c index 70de5ba13d7..aedcf5dacc8 100644 --- a/src/pl/plpython/plpy_elog.c +++ b/src/pl/plpython/plpy_elog.c @@ -18,7 +18,8 @@ PyObject *PLy_exc_spi_error = NULL; static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, - char **xmsg, char **tbmsg, int *tb_depth); + char *volatile *xmsg, char *volatile *tbmsg, + int *tb_depth); static void PLy_get_spi_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **query, int *position, char **schema_name, char **table_name, char **column_name, @@ -43,13 +44,23 @@ void PLy_elog_impl(int elevel, const char *fmt,...) { int save_errno = errno; - char *xmsg; - char *tbmsg; + char *volatile xmsg = NULL; + char *volatile tbmsg = NULL; int tb_depth; StringInfoData emsg; PyObject *exc, *val, *tb; + + /* If we'll need emsg, must initialize it before entering PG_TRY */ + if (fmt) + initStringInfo(&emsg); + + PyErr_Fetch(&exc, &val, &tb); + + /* Use a PG_TRY block to ensure we release the PyObjects just acquired */ + PG_TRY(); + { const char *primary = NULL; int sqlerrcode = 0; char *detail = NULL; @@ -62,8 +73,6 @@ PLy_elog_impl(int elevel, const char *fmt,...) char *datatype_name = NULL; char *constraint_name = NULL; - PyErr_Fetch(&exc, &val, &tb); - if (exc != NULL) { PyErr_NormalizeException(&exc, &val, &tb); @@ -81,13 +90,11 @@ PLy_elog_impl(int elevel, const char *fmt,...) elevel = FATAL; } - /* this releases our refcount on tb! */ PLy_traceback(exc, val, tb, &xmsg, &tbmsg, &tb_depth); if (fmt) { - initStringInfo(&emsg); for (;;) { va_list ap; @@ -113,8 +120,6 @@ PLy_elog_impl(int elevel, const char *fmt,...) primary = xmsg; } - PG_TRY(); - { ereport(elevel, (errcode(sqlerrcode ? sqlerrcode : ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), errmsg_internal("%s", primary ? primary : "no exception data"), @@ -136,14 +141,23 @@ PLy_elog_impl(int elevel, const char *fmt,...) } PG_FINALLY(); { + Py_XDECREF(exc); + Py_XDECREF(val); + /* Must release all the objects in the traceback stack */ + while (tb != NULL && tb != Py_None) + { + PyObject *tb_prev = tb; + + tb = PyObject_GetAttrString(tb, "tb_next"); + Py_DECREF(tb_prev); + } + /* For neatness' sake, also release our string buffers */ if (fmt) pfree(emsg.data); if (xmsg) pfree(xmsg); if (tbmsg) pfree(tbmsg); - Py_XDECREF(exc); - Py_XDECREF(val); } PG_END_TRY(); } @@ -154,21 +168,14 @@ PLy_elog_impl(int elevel, const char *fmt,...) * The exception error message is returned in xmsg, the traceback in * tbmsg (both as palloc'd strings) and the traceback depth in * tb_depth. - * - * We release refcounts on all the Python objects in the traceback stack, - * but not on e or v. */ static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, - char **xmsg, char **tbmsg, int *tb_depth) + char *volatile *xmsg, char *volatile *tbmsg, int *tb_depth) { - PyObject *e_type_o; - PyObject *e_module_o; - char *e_type_s = NULL; - char *e_module_s = NULL; - PyObject *vob = NULL; - char *vstr; - StringInfoData xstr; + PyObject *volatile e_type_o = NULL; + PyObject *volatile e_module_o = NULL; + PyObject *volatile vob = NULL; StringInfoData tbstr; /* @@ -186,12 +193,18 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, /* * Format the exception and its value and put it in xmsg. */ + PG_TRY(); + { + char *e_type_s = NULL; + char *e_module_s = NULL; + const char *vstr; + StringInfoData xstr; e_type_o = PyObject_GetAttrString(e, "__name__"); e_module_o = PyObject_GetAttrString(e, "__module__"); if (e_type_o) e_type_s = PLyUnicode_AsString(e_type_o); - if (e_type_s) + if (e_module_o) e_module_s = PLyUnicode_AsString(e_module_o); if (v && ((vob = PyObject_Str(v)) != NULL)) @@ -215,18 +228,24 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, appendStringInfo(&xstr, ": %s", vstr); *xmsg = xstr.data; + } + PG_FINALLY(); + { + Py_XDECREF(e_type_o); + Py_XDECREF(e_module_o); + Py_XDECREF(vob); + } + PG_END_TRY(); /* * Now format the traceback and put it in tbmsg. */ - *tb_depth = 0; initStringInfo(&tbstr); /* Mimic Python traceback reporting as close as possible. */ appendStringInfoString(&tbstr, "Traceback (most recent call last):"); while (tb != NULL && tb != Py_None) { - PyObject *volatile tb_prev = NULL; PyObject *volatile frame = NULL; PyObject *volatile code = NULL; PyObject *volatile name = NULL; @@ -254,17 +273,6 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, filename = PyObject_GetAttrString(code, "co_filename"); if (filename == NULL) elog(ERROR, "could not get file name from Python code object"); - } - PG_CATCH(); - { - Py_XDECREF(frame); - Py_XDECREF(code); - Py_XDECREF(name); - Py_XDECREF(lineno); - Py_XDECREF(filename); - PG_RE_THROW(); - } - PG_END_TRY(); /* The first frame always points at , skip it. */ if (*tb_depth > 0) @@ -320,18 +328,19 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, } } } + } + PG_FINALLY(); + { + Py_XDECREF(frame); + Py_XDECREF(code); + Py_XDECREF(name); + Py_XDECREF(lineno); + Py_XDECREF(filename); + } + PG_END_TRY(); - Py_DECREF(frame); - Py_DECREF(code); - Py_DECREF(name); - Py_DECREF(lineno); - Py_DECREF(filename); - - /* Release the current frame and go to the next one. */ - tb_prev = tb; + /* Advance to the next frame. */ tb = PyObject_GetAttrString(tb, "tb_next"); - Assert(tb_prev != Py_None); - Py_DECREF(tb_prev); if (tb == NULL) elog(ERROR, "could not traverse Python traceback"); (*tb_depth)++; @@ -339,10 +348,6 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, /* Return the traceback. */ *tbmsg = tbstr.data; - - Py_XDECREF(e_type_o); - Py_XDECREF(e_module_o); - Py_XDECREF(vob); } /* From ecc8fd2b77635b43c034359c9af52941772ede53 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 1 Jun 2025 14:55:24 -0400 Subject: [PATCH 029/115] Run pgindent on the previous commit. Clean up after rearranging PG_TRY blocks. Author: Tom Lane Discussion: https://postgr.es/m/2954090.1748723636@sss.pgh.pa.us Backpatch-through: 13 --- src/pl/plpython/plpy_elog.c | 266 ++++++++++++++++++------------------ 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c index aedcf5dacc8..13f6b87a9f2 100644 --- a/src/pl/plpython/plpy_elog.c +++ b/src/pl/plpython/plpy_elog.c @@ -61,64 +61,64 @@ PLy_elog_impl(int elevel, const char *fmt,...) /* Use a PG_TRY block to ensure we release the PyObjects just acquired */ PG_TRY(); { - const char *primary = NULL; - int sqlerrcode = 0; - char *detail = NULL; - char *hint = NULL; - char *query = NULL; - int position = 0; - char *schema_name = NULL; - char *table_name = NULL; - char *column_name = NULL; - char *datatype_name = NULL; - char *constraint_name = NULL; - - if (exc != NULL) - { - PyErr_NormalizeException(&exc, &val, &tb); - - if (PyErr_GivenExceptionMatches(val, PLy_exc_spi_error)) - PLy_get_spi_error_data(val, &sqlerrcode, - &detail, &hint, &query, &position, + const char *primary = NULL; + int sqlerrcode = 0; + char *detail = NULL; + char *hint = NULL; + char *query = NULL; + int position = 0; + char *schema_name = NULL; + char *table_name = NULL; + char *column_name = NULL; + char *datatype_name = NULL; + char *constraint_name = NULL; + + if (exc != NULL) + { + PyErr_NormalizeException(&exc, &val, &tb); + + if (PyErr_GivenExceptionMatches(val, PLy_exc_spi_error)) + PLy_get_spi_error_data(val, &sqlerrcode, + &detail, &hint, &query, &position, + &schema_name, &table_name, &column_name, + &datatype_name, &constraint_name); + else if (PyErr_GivenExceptionMatches(val, PLy_exc_error)) + PLy_get_error_data(val, &sqlerrcode, &detail, &hint, &schema_name, &table_name, &column_name, &datatype_name, &constraint_name); - else if (PyErr_GivenExceptionMatches(val, PLy_exc_error)) - PLy_get_error_data(val, &sqlerrcode, &detail, &hint, - &schema_name, &table_name, &column_name, - &datatype_name, &constraint_name); - else if (PyErr_GivenExceptionMatches(val, PLy_exc_fatal)) - elevel = FATAL; - } + else if (PyErr_GivenExceptionMatches(val, PLy_exc_fatal)) + elevel = FATAL; + } - PLy_traceback(exc, val, tb, - &xmsg, &tbmsg, &tb_depth); + PLy_traceback(exc, val, tb, + &xmsg, &tbmsg, &tb_depth); - if (fmt) - { - for (;;) + if (fmt) { - va_list ap; - int needed; - - errno = save_errno; - va_start(ap, fmt); - needed = appendStringInfoVA(&emsg, dgettext(TEXTDOMAIN, fmt), ap); - va_end(ap); - if (needed == 0) - break; - enlargeStringInfo(&emsg, needed); - } - primary = emsg.data; + for (;;) + { + va_list ap; + int needed; + + errno = save_errno; + va_start(ap, fmt); + needed = appendStringInfoVA(&emsg, dgettext(TEXTDOMAIN, fmt), ap); + va_end(ap); + if (needed == 0) + break; + enlargeStringInfo(&emsg, needed); + } + primary = emsg.data; - /* If there's an exception message, it goes in the detail. */ - if (xmsg) - detail = xmsg; - } - else - { - if (xmsg) - primary = xmsg; - } + /* If there's an exception message, it goes in the detail. */ + if (xmsg) + detail = xmsg; + } + else + { + if (xmsg) + primary = xmsg; + } ereport(elevel, (errcode(sqlerrcode ? sqlerrcode : ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), @@ -195,39 +195,39 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, */ PG_TRY(); { - char *e_type_s = NULL; - char *e_module_s = NULL; - const char *vstr; - StringInfoData xstr; - - e_type_o = PyObject_GetAttrString(e, "__name__"); - e_module_o = PyObject_GetAttrString(e, "__module__"); - if (e_type_o) - e_type_s = PLyUnicode_AsString(e_type_o); - if (e_module_o) - e_module_s = PLyUnicode_AsString(e_module_o); - - if (v && ((vob = PyObject_Str(v)) != NULL)) - vstr = PLyUnicode_AsString(vob); - else - vstr = "unknown"; - - initStringInfo(&xstr); - if (!e_type_s || !e_module_s) - { - /* shouldn't happen */ - appendStringInfoString(&xstr, "unrecognized exception"); - } - /* mimics behavior of traceback.format_exception_only */ - else if (strcmp(e_module_s, "builtins") == 0 - || strcmp(e_module_s, "__main__") == 0 - || strcmp(e_module_s, "exceptions") == 0) - appendStringInfoString(&xstr, e_type_s); - else - appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s); - appendStringInfo(&xstr, ": %s", vstr); - - *xmsg = xstr.data; + char *e_type_s = NULL; + char *e_module_s = NULL; + const char *vstr; + StringInfoData xstr; + + e_type_o = PyObject_GetAttrString(e, "__name__"); + e_module_o = PyObject_GetAttrString(e, "__module__"); + if (e_type_o) + e_type_s = PLyUnicode_AsString(e_type_o); + if (e_module_o) + e_module_s = PLyUnicode_AsString(e_module_o); + + if (v && ((vob = PyObject_Str(v)) != NULL)) + vstr = PLyUnicode_AsString(vob); + else + vstr = "unknown"; + + initStringInfo(&xstr); + if (!e_type_s || !e_module_s) + { + /* shouldn't happen */ + appendStringInfoString(&xstr, "unrecognized exception"); + } + /* mimics behavior of traceback.format_exception_only */ + else if (strcmp(e_module_s, "builtins") == 0 + || strcmp(e_module_s, "__main__") == 0 + || strcmp(e_module_s, "exceptions") == 0) + appendStringInfoString(&xstr, e_type_s); + else + appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s); + appendStringInfo(&xstr, ": %s", vstr); + + *xmsg = xstr.data; } PG_FINALLY(); { @@ -274,61 +274,61 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, if (filename == NULL) elog(ERROR, "could not get file name from Python code object"); - /* The first frame always points at , skip it. */ - if (*tb_depth > 0) - { - PLyExecutionContext *exec_ctx = PLy_current_execution_context(); - char *proname; - char *fname; - char *line; - char *plain_filename; - long plain_lineno; - - /* - * The second frame points at the internal function, but to mimic - * Python error reporting we want to say . - */ - if (*tb_depth == 1) - fname = ""; - else - fname = PLyUnicode_AsString(name); - - proname = PLy_procedure_name(exec_ctx->curr_proc); - plain_filename = PLyUnicode_AsString(filename); - plain_lineno = PyLong_AsLong(lineno); - - if (proname == NULL) - appendStringInfo(&tbstr, "\n PL/Python anonymous code block, line %ld, in %s", - plain_lineno - 1, fname); - else - appendStringInfo(&tbstr, "\n PL/Python function \"%s\", line %ld, in %s", - proname, plain_lineno - 1, fname); - - /* - * function code object was compiled with "" as the - * filename - */ - if (exec_ctx->curr_proc && plain_filename != NULL && - strcmp(plain_filename, "") == 0) + /* The first frame always points at , skip it. */ + if (*tb_depth > 0) { + PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + char *proname; + char *fname; + char *line; + char *plain_filename; + long plain_lineno; + /* - * If we know the current procedure, append the exact line - * from the source, again mimicking Python's traceback.py - * module behavior. We could store the already line-split - * source to avoid splitting it every time, but producing a - * traceback is not the most important scenario to optimize - * for. But we do not go as far as traceback.py in reading - * the source of imported modules. + * The second frame points at the internal function, but to + * mimic Python error reporting we want to say . */ - line = get_source_line(exec_ctx->curr_proc->src, plain_lineno); - if (line) + if (*tb_depth == 1) + fname = ""; + else + fname = PLyUnicode_AsString(name); + + proname = PLy_procedure_name(exec_ctx->curr_proc); + plain_filename = PLyUnicode_AsString(filename); + plain_lineno = PyLong_AsLong(lineno); + + if (proname == NULL) + appendStringInfo(&tbstr, "\n PL/Python anonymous code block, line %ld, in %s", + plain_lineno - 1, fname); + else + appendStringInfo(&tbstr, "\n PL/Python function \"%s\", line %ld, in %s", + proname, plain_lineno - 1, fname); + + /* + * function code object was compiled with "" as the + * filename + */ + if (exec_ctx->curr_proc && plain_filename != NULL && + strcmp(plain_filename, "") == 0) { - appendStringInfo(&tbstr, "\n %s", line); - pfree(line); + /* + * If we know the current procedure, append the exact line + * from the source, again mimicking Python's traceback.py + * module behavior. We could store the already line-split + * source to avoid splitting it every time, but producing + * a traceback is not the most important scenario to + * optimize for. But we do not go as far as traceback.py + * in reading the source of imported modules. + */ + line = get_source_line(exec_ctx->curr_proc->src, plain_lineno); + if (line) + { + appendStringInfo(&tbstr, "\n %s", line); + pfree(line); + } } } } - } PG_FINALLY(); { Py_XDECREF(frame); From 5e6d561bc14db260e7456e02f7a15f46b0302f58 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 2 Jun 2025 12:04:08 +0900 Subject: [PATCH 030/115] Use replay LSN as target for cascading logical WAL senders A cascading WAL sender doing logical decoding (as known as doing its work on a standby) has been using as flush LSN the value returned by GetStandbyFlushRecPtr() (last position safely flushed to disk). This is incorrect as such processes are only able to decode changes up to the LSN that has been replayed by the startup process. This commit changes cascading logical WAL senders to use the replay LSN, as returned by GetXLogReplayRecPtr(). This distinction is important particularly during shutdown, when WAL senders need to send any remaining available data to their clients, switching WAL senders to a caught-up state. Using the latest flush LSN rather than the replay LSN could cause the WAL senders to be stuck in an infinite loop preventing them to shut down, as the startup process does not run when WAL senders attempt to catch up, so they could keep waiting for work that would never happen. Backpatch down to v16, where logical decoding on standbys has been introduced. Author: Alexey Makhmutov Reviewed-by: Ajin Cherian Reviewed-by: Bertrand Drouvot Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/52138028-7246-421c-9161-4fa108b88070@postgrespro.ru Backpatch-through: 16 --- src/backend/replication/walsender.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 1e0480b1d55..dafa0a2d790 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3119,8 +3119,16 @@ XLogSendLogical(void) if (flushPtr == InvalidXLogRecPtr || logical_decoding_ctx->reader->EndRecPtr >= flushPtr) { + /* + * For cascading logical WAL senders, we use the replay LSN instead of + * the flush LSN, since logical decoding on a standby only processes + * WAL that has been replayed. This distinction becomes particularly + * important during shutdown, as new WAL is no longer replayed and the + * last replayed LSN marks the furthest point up to which decoding can + * proceed. + */ if (am_cascading_walsender) - flushPtr = GetStandbyFlushRecPtr(NULL); + flushPtr = GetXLogReplayRecPtr(NULL); else flushPtr = GetFlushRecPtr(NULL); } From ab758ec4d30745427e46b51b7b19b3c5483d513d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 2 Jun 2025 15:22:44 -0400 Subject: [PATCH 031/115] Disallow "=" in names of reloptions and foreign-data options. We store values for these options as array elements with the syntax "name=value", hence a name containing "=" confuses matters when it's time to read the array back in. Since validation of the options is often done (long) after this conversion to array format, that leads to confusing and off-point error messages. We can improve matters by rejecting names containing "=" up-front. (Probably a better design would have involved pairs of array elements, but it's too late now --- and anyway, there's no evident use-case for option names like this. We already reject such names in some other contexts such as GUCs.) Reported-by: Chapman Flack Author: Tom Lane Reviewed-by: Chapman Flack Discussion: https://postgr.es/m/6830EB30.8090904@acm.org Backpatch-through: 13 --- contrib/file_fdw/expected/file_fdw.out | 4 ++++ contrib/file_fdw/sql/file_fdw.sql | 2 ++ src/backend/access/common/reloptions.c | 17 +++++++++++++---- src/backend/commands/foreigncmds.c | 15 +++++++++++++-- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/contrib/file_fdw/expected/file_fdw.out b/contrib/file_fdw/expected/file_fdw.out index 72304e0ff32..6ae956f8801 100644 --- a/contrib/file_fdw/expected/file_fdw.out +++ b/contrib/file_fdw/expected/file_fdw.out @@ -48,6 +48,10 @@ SET ROLE regress_file_fdw_superuser; CREATE USER MAPPING FOR regress_file_fdw_superuser SERVER file_server; CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server; -- validator tests +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (foo 'bar'); -- ERROR +ERROR: invalid option "foo" +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS ("a=b" 'true'); -- ERROR +ERROR: invalid option name "a=b": must not contain "=" CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'xml'); -- ERROR ERROR: COPY format "xml" not recognized CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', quote ':'); -- ERROR diff --git a/contrib/file_fdw/sql/file_fdw.sql b/contrib/file_fdw/sql/file_fdw.sql index f0548e14e18..e91b9799c42 100644 --- a/contrib/file_fdw/sql/file_fdw.sql +++ b/contrib/file_fdw/sql/file_fdw.sql @@ -55,6 +55,8 @@ CREATE USER MAPPING FOR regress_file_fdw_superuser SERVER file_server; CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server; -- validator tests +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (foo 'bar'); -- ERROR +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS ("a=b" 'true'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'xml'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', quote ':'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape ':'); -- ERROR diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 469de9bb49f..9648a769580 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -1234,8 +1234,9 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, } else { - text *t; + const char *name; const char *value; + text *t; Size len; /* @@ -1282,11 +1283,19 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, * have just "name", assume "name=true" is meant. Note: the * namespace is not output. */ + name = def->defname; if (def->arg != NULL) value = defGetString(def); else value = "true"; + /* Insist that name not contain "=", else "a=b=c" is ambiguous */ + if (strchr(name, '=') != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid option name \"%s\": must not contain \"=\"", + name))); + /* * This is not a great place for this test, but there's no other * convenient place to filter the option out. As WITH (oids = @@ -1294,7 +1303,7 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, * amount of ugly. */ if (acceptOidsOff && def->defnamespace == NULL && - strcmp(def->defname, "oids") == 0) + strcmp(name, "oids") == 0) { if (defGetBoolean(def)) ereport(ERROR, @@ -1304,11 +1313,11 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, continue; } - len = VARHDRSZ + strlen(def->defname) + 1 + strlen(value); + len = VARHDRSZ + strlen(name) + 1 + strlen(value); /* +1 leaves room for sprintf's trailing null */ t = (text *) palloc(len + 1); SET_VARSIZE(t, len); - sprintf(VARDATA(t), "%s=%s", def->defname, value); + sprintf(VARDATA(t), "%s=%s", name, value); astate = accumArrayResult(astate, PointerGetDatum(t), false, TEXTOID, diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index 0ecff545a9e..6baf80cf09c 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -71,15 +71,26 @@ optionListToArray(List *options) foreach(cell, options) { DefElem *def = lfirst(cell); + const char *name; const char *value; Size len; text *t; + name = def->defname; value = defGetString(def); - len = VARHDRSZ + strlen(def->defname) + 1 + strlen(value); + + /* Insist that name not contain "=", else "a=b=c" is ambiguous */ + if (strchr(name, '=') != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid option name \"%s\": must not contain \"=\"", + name))); + + len = VARHDRSZ + strlen(name) + 1 + strlen(value); + /* +1 leaves room for sprintf's trailing null */ t = palloc(len + 1); SET_VARSIZE(t, len); - sprintf(VARDATA(t), "%s=%s", def->defname, value); + sprintf(VARDATA(t), "%s=%s", name, value); astate = accumArrayResult(astate, PointerGetDatum(t), false, TEXTOID, From 6e71b7a39646e658ff8ccd55acf8b1d9d29d129b Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 4 Jun 2025 09:47:25 -0500 Subject: [PATCH 032/115] doc: Remove notes about "unencrypted" passwords. The documentation for the pg_authid system catalog and the pg_shadow system view indicates that passwords might be stored in cleartext, but that hasn't been possible for some time. Oversight in commit eb61136dc7. Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/aD2yKkZro4nbl5ol%40nathan Backpatch-through: 13 --- doc/src/sgml/catalogs.sgml | 7 +------ doc/src/sgml/system-views.sgml | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 21893b85dd3..4e56ba40806 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -1590,7 +1590,7 @@ rolpassword text - Password (possibly encrypted); null if none. The format depends + Encrypted password; null if none. The format depends on the form of encryption used. @@ -1626,11 +1626,6 @@ SCRAM-SHA-256$<iteration count>:&l ServerKey are in Base64 encoded format. This format is the same as that specified by RFC 5803. - - - A password that does not follow either of those formats is assumed to be - unencrypted. - diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index dc709ec9f50..e0b53ad3157 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -3494,7 +3494,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx passwd text - Password (possibly encrypted); null if none. See + Encrypted password; null if none. See pg_authid for details of how encrypted passwords are stored. From aad8bd69530bd76f94df87c3e043687cbf29ee70 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 5 Jun 2025 11:29:24 -0400 Subject: [PATCH 033/115] Doc: you must own the target object to use SECURITY LABEL. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For some reason this wasn't mentioned before. Author: Patrick Stählin Reviewed-by: Tom Lane Discussion: https://postgr.es/m/931e012a-57ba-41ba-9b88-24323a46dec5@packi.ch Backpatch-through: 13 --- doc/src/sgml/ref/security_label.sgml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/src/sgml/ref/security_label.sgml b/doc/src/sgml/ref/security_label.sgml index e5e5fb483e9..aa45c0af248 100644 --- a/doc/src/sgml/ref/security_label.sgml +++ b/doc/src/sgml/ref/security_label.sgml @@ -84,6 +84,10 @@ SECURITY LABEL [ FOR provider ] ON based on object labels, rather than traditional discretionary access control (DAC) concepts such as users and groups. + + + You must own the database object to use SECURITY LABEL. + From 169429264d0638b18e01926977b910ab70457f14 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 6 Jun 2025 08:18:23 -0400 Subject: [PATCH 034/115] pg_prewarm: Allow autoprewarm to use more than 1GB to dump blocks. Reported-by: Daria Shanina Author: Daria Shanina Author: Robert Haas Backpatch-through: 13 --- contrib/pg_prewarm/autoprewarm.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 93835449c0e..b1655d66861 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -608,8 +608,15 @@ apw_dump_now(bool is_bgworker, bool dump_unlogged) return 0; } - block_info_array = - (BlockInfoRecord *) palloc(sizeof(BlockInfoRecord) * NBuffers); + /* + * With sufficiently large shared_buffers, allocation will exceed 1GB, so + * allow for a huge allocation to prevent outright failure. + * + * (In the future, it might be a good idea to redesign this to use a more + * memory-efficient data structure.) + */ + block_info_array = (BlockInfoRecord *) + palloc_extended((sizeof(BlockInfoRecord) * NBuffers), MCXT_ALLOC_HUGE); for (num_blocks = 0, i = 0; i < NBuffers; i++) { From 3f37400cfb87002e48ee98d6c0d34a597d0dddf8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 10 Jun 2025 18:39:34 -0400 Subject: [PATCH 035/115] Don't reduce output request size on non-Unix-socket connections. Traditionally, libpq's pqPutMsgEnd has rounded down the amount-to-send to be a multiple of 8K when it is eagerly writing some data. This still seems like a good idea when sending through a Unix socket, as pipes typically have a buffer size of 8K or some fraction/multiple of that. But there's not much argument for it on a TCP connection, since (a) standard MTU values are not commensurate with that, and (b) the kernel typically applies its own packet splitting/merging logic. Worse, our SSL and GSSAPI code paths both have API stipulations that if they fail to send all the data that was offered in the previous write attempt, we mustn't offer less data in the next attempt; else we may get "SSL error: bad length" or "GSSAPI caller failed to retransmit all data needing to be retried". The previous write attempt might've been pqFlush attempting to send everything in the buffer, so pqPutMsgEnd can't safely write less than the full buffer contents. (Well, we could add some more state to track exactly how much the previous write attempt was, but there's little value evident in such extra complication.) Hence, apply the round-down only on AF_UNIX sockets, where we never use SSL or GSSAPI. Interestingly, we had a very closely related bug report before, which I attempted to fix in commit d053a879b. But the test case we had then seemingly didn't trigger this pqFlush-then-pqPutMsgEnd scenario, or at least we failed to recognize this variant of the bug. Bug: #18907 Reported-by: Dorjpalam Batbaatar Author: Tom Lane Discussion: https://postgr.es/m/18907-d41b9bcf6f29edda@postgresql.org Backpatch-through: 13 --- src/backend/libpq/be-secure-gssapi.c | 6 +++--- src/interfaces/libpq/fe-misc.c | 28 ++++++++++++++++++++++++- src/interfaces/libpq/fe-secure-gssapi.c | 6 +++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/backend/libpq/be-secure-gssapi.c b/src/backend/libpq/be-secure-gssapi.c index 657beaa5a70..2839972e666 100644 --- a/src/backend/libpq/be-secure-gssapi.c +++ b/src/backend/libpq/be-secure-gssapi.c @@ -120,9 +120,9 @@ be_gssapi_write(Port *port, void *ptr, size_t len) * again, so if it offers a len less than that, something is wrong. * * Note: it may seem attractive to report partial write completion once - * we've successfully sent any encrypted packets. However, that can cause - * problems for callers; notably, pqPutMsgEnd's heuristic to send only - * full 8K blocks interacts badly with such a hack. We won't save much, + * we've successfully sent any encrypted packets. However, doing that + * expands the state space of this processing and has been responsible for + * bugs in the past (cf. commit d053a879b). We won't save much, * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index 02dd799c455..59ed2ff98df 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -539,9 +539,35 @@ pqPutMsgEnd(PGconn *conn) /* Make message eligible to send */ conn->outCount = conn->outMsgEnd; + /* If appropriate, try to push out some data */ if (conn->outCount >= 8192) { - int toSend = conn->outCount - (conn->outCount % 8192); + int toSend = conn->outCount; + + /* + * On Unix-pipe connections, it seems profitable to prefer sending + * pipe-buffer-sized packets not randomly-sized ones, so retain the + * last partial-8K chunk in our buffer for now. On TCP connections, + * the advantage of that is far less clear. Moreover, it flat out + * isn't safe when using SSL or GSSAPI, because those code paths have + * API stipulations that if they fail to send all the data that was + * offered in the previous write attempt, we mustn't offer less data + * in this write attempt. The previous write attempt might've been + * pqFlush attempting to send everything in the buffer, so we mustn't + * offer less now. (Presently, we won't try to use SSL or GSSAPI on + * Unix connections, so those checks are just Asserts. They'll have + * to become part of the regular if-test if we ever change that.) + */ + if (conn->raddr.addr.ss_family == AF_UNIX) + { +#ifdef USE_SSL + Assert(!conn->ssl_in_use); +#endif +#ifdef ENABLE_GSS + Assert(!conn->gssenc); +#endif + toSend -= toSend % 8192; + } if (pqSendSome(conn, toSend) < 0) return EOF; diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c index 8000d0b5783..a8560e20b5a 100644 --- a/src/interfaces/libpq/fe-secure-gssapi.c +++ b/src/interfaces/libpq/fe-secure-gssapi.c @@ -112,9 +112,9 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) * again, so if it offers a len less than that, something is wrong. * * Note: it may seem attractive to report partial write completion once - * we've successfully sent any encrypted packets. However, that can cause - * problems for callers; notably, pqPutMsgEnd's heuristic to send only - * full 8K blocks interacts badly with such a hack. We won't save much, + * we've successfully sent any encrypted packets. However, doing that + * expands the state space of this processing and has been responsible for + * bugs in the past (cf. commit d053a879b). We won't save much, * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) From c7f25feb3862000a4bc1930aea50ba923be0bdb6 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 11 Jun 2025 09:17:31 -0400 Subject: [PATCH 036/115] Make _bt_killitems drop pins it acquired itself. Teach nbtree's _bt_killitems to leave the so->currPos page that it sets LP_DEAD items on in whatever state it was in when _bt_killitems was called. In particular, make sure that so->dropPin scans don't acquire a pin whose reference is saved in so->currPos.buf. Allowing _bt_killitems to change so->currPos.buf like this is wrong. The immediate consequence of allowing it is that code in _bt_steppage (that copies so->currPos into so->markPos) will behave as if the scan is a !so->dropPin scan. so->markPos will therefore retain the buffer pin indefinitely, even though _bt_killitems only needs to acquire a pin (along with a lock) for long enough to mark known-dead items LP_DEAD. This issue came to light following a report of a failure of an assertion from recent commit e6eed40e. The test case in question involves the use of mark and restore. An initial call to _bt_killitems takes place that leaves so->currPos.buf in a state that is inconsistent with the scan being so->dropPin. A subsequent call to _bt_killitems for the same position (following so->currPos being saved in so->markPos, and then restored as so->currPos) resulted in the failure of an assertion that tests that so->currPos.buf is InvalidBuffer when the scan is so->dropPin (non-assert builds got a "resource was not closed" WARNING instead). The same problem exists on earlier releases, though the issue is far more subtle there. Recent commit e6eed40e introduced the so->dropPin field as a partial replacement for testing so->currPos.buf directly. Earlier releases won't get an assertion failure (or buffer pin leak), but they will allow the second _bt_killitems call from the test case to behave as if a buffer pin was consistently held since the original call to _bt_readpage. This is wrong; there will have been an initial window during which no pin was held on the so->currPos page, and yet the second _bt_killitems call will neglect to check if so->currPos.lsn continues to match the page's now-current LSN. As a result of all this, it's just about possible that _bt_killitems will set the wrong items LP_DEAD (on release branches). This could only happen with merge joins (the sole user of nbtree mark/restore support), when a concurrently inserted index tuple used a recently-recycled TID (and only when the new tuple was inserted onto the same page as a distinct concurrently-removed tuple with the same TID). This is exactly the scenario that _bt_killitems' check of the page's now-current LSN against the LSN stashed in currPos was supposed to prevent. A follow-up commit will make nbtree completely stop conditioning whether or not a position's pin needs to be dropped on whether the 'buf' field is set. All call sites that might need to drop a still-held pin will be taught to rely on the scan-level so->dropPin field recently introduced by commit e6eed40e. That will make bugs of the same general nature as this one impossible (or make them much easier to detect, at least). Author: Peter Geoghegan Reported-By: Alexander Lakhin Discussion: https://postgr.es/m/545be1e5-3786-439a-9257-a90d30f8b849@gmail.com Backpatch-through: 13 --- src/backend/access/nbtree/nbtutils.c | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index e4528db4779..5873b61acfb 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -1713,9 +1713,9 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, * current page and killed tuples thereon (generally, this should only be * called if so->numKilled > 0). * - * The caller does not have a lock on the page and may or may not have the - * page pinned in a buffer. Note that read-lock is sufficient for setting - * LP_DEAD status (which is only a hint). + * Caller should not have a lock on the so->currPos page, but may hold a + * buffer pin. When we return, it still won't be locked. It'll continue to + * hold whatever pins were held before calling here. * * We match items by heap TID before assuming they are the right ones to * delete. We cope with cases where items have moved right due to insertions. @@ -1747,7 +1747,8 @@ _bt_killitems(IndexScanDesc scan) int i; int numKilled = so->numKilled; bool killedsomething = false; - bool droppedpin PG_USED_FOR_ASSERTS_ONLY; + bool droppedpin; + Buffer buf; Assert(BTScanPosIsValid(so->currPos)); @@ -1766,29 +1767,31 @@ _bt_killitems(IndexScanDesc scan) * LSN. */ droppedpin = false; - _bt_lockbuf(scan->indexRelation, so->currPos.buf, BT_READ); - - page = BufferGetPage(so->currPos.buf); + buf = so->currPos.buf; + _bt_lockbuf(scan->indexRelation, buf, BT_READ); } else { - Buffer buf; + XLogRecPtr latestlsn; droppedpin = true; /* Attempt to re-read the buffer, getting pin and lock. */ buf = _bt_getbuf(scan->indexRelation, so->currPos.currPage, BT_READ); - page = BufferGetPage(buf); - if (BufferGetLSNAtomic(buf) == so->currPos.lsn) - so->currPos.buf = buf; - else + latestlsn = BufferGetLSNAtomic(buf); + Assert(!XLogRecPtrIsInvalid(so->currPos.lsn)); + Assert(so->currPos.lsn <= latestlsn); + if (so->currPos.lsn != latestlsn) { /* Modified while not pinned means hinting is not safe. */ _bt_relbuf(scan->indexRelation, buf); return; } + + /* Unmodified, hinting is safe */ } + page = BufferGetPage(buf); opaque = BTPageGetOpaque(page); minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); @@ -1905,10 +1908,13 @@ _bt_killitems(IndexScanDesc scan) if (killedsomething) { opaque->btpo_flags |= BTP_HAS_GARBAGE; - MarkBufferDirtyHint(so->currPos.buf, true); + MarkBufferDirtyHint(buf, true); } - _bt_unlockbuf(scan->indexRelation, so->currPos.buf); + if (!droppedpin) + _bt_unlockbuf(scan->indexRelation, buf); + else + _bt_relbuf(scan->indexRelation, buf); } From cea8f2c3e44b5fac59a7298c6b9045c5cbb0eaeb Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sat, 14 Jun 2025 03:33:15 +0300 Subject: [PATCH 037/115] Keep WAL segments by the flushed value of the slot's restart LSN The patch fixes the issue with the unexpected removal of old WAL segments after checkpoint, followed by an immediate restart. The issue occurs when a slot is advanced after the start of the checkpoint and before old WAL segments are removed at the end of the checkpoint. The idea of the patch is to get the minimal restart_lsn at the beginning of checkpoint (or restart point) creation and use this value when calculating the oldest LSN for WAL segments removal at the end of checkpoint. This idea was proposed by Tomas Vondra in the discussion. Unlike 291221c46575, this fix doesn't affect ABI and is intended for back branches. Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497 Author: Vitaly Davydov Reviewed-by: Tomas Vondra Reviewed-by: Alexander Korotkov Reviewed-by: Amit Kapila Backpatch-through: 13 --- src/backend/access/transam/xlog.c | 55 +++++++++++++++++++---- src/backend/replication/logical/logical.c | 10 ++++- src/backend/replication/walsender.c | 4 ++ 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 46faf404ba8..196a49ccec7 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -650,7 +650,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr, TimeLineID newTLI); static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags); -static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo); +static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN, + XLogSegNo *logSegNo); static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void); static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, @@ -6492,6 +6493,7 @@ CreateCheckPoint(int flags) VirtualTransactionId *vxids; int nvxids; int oldXLogAllowed = 0; + XLogRecPtr slotsMinReqLSN; /* * An end-of-recovery checkpoint is really a shutdown checkpoint, just @@ -6693,6 +6695,15 @@ CreateCheckPoint(int flags) */ END_CRIT_SECTION(); + /* + * Get the current minimum LSN to be used later in the WAL segment + * cleanup. We may clean up only WAL segments, which are not needed + * according to synchronized LSNs of replication slots. The slot's LSN + * might be advanced concurrently, so we call this before + * CheckPointReplicationSlots() synchronizes replication slots. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + /* * In some cases there are groups of actions that must all occur on one * side or the other of a checkpoint record. Before flushing the @@ -6858,17 +6869,25 @@ CreateCheckPoint(int flags) * prevent the disk holding the xlog from growing full. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); + KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, _logSegNo, InvalidOid, InvalidTransactionId)) { + /* + * Recalculate the current minimum LSN to be used in the WAL segment + * cleanup. Then, we must synchronize the replication slots again in + * order to make this LSN safe to use. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + CheckPointReplicationSlots(); + /* * Some slots have been invalidated; recalculate the old-segment * horizon, starting again from RedoRecPtr. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); + KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); } _logSegNo--; RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr, @@ -7140,6 +7159,7 @@ CreateRestartPoint(int flags) XLogRecPtr endptr; XLogSegNo _logSegNo; TimestampTz xtime; + XLogRecPtr slotsMinReqLSN; /* Concurrent checkpoint/restartpoint cannot happen */ Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER); @@ -7222,6 +7242,15 @@ CreateRestartPoint(int flags) MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); + /* + * Get the current minimum LSN to be used later in the WAL segment + * cleanup. We may clean up only WAL segments, which are not needed + * according to synchronized LSNs of replication slots. The slot's LSN + * might be advanced concurrently, so we call this before + * CheckPointReplicationSlots() synchronizes replication slots. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + if (log_checkpoints) LogCheckpointStart(flags, true); @@ -7304,17 +7333,25 @@ CreateRestartPoint(int flags) receivePtr = GetWalRcvFlushRecPtr(NULL, NULL); replayPtr = GetXLogReplayRecPtr(&replayTLI); endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr; - KeepLogSeg(endptr, &_logSegNo); + KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo); if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, _logSegNo, InvalidOid, InvalidTransactionId)) { + /* + * Recalculate the current minimum LSN to be used in the WAL segment + * cleanup. Then, we must synchronize the replication slots again in + * order to make this LSN safe to use. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + CheckPointReplicationSlots(); + /* * Some slots have been invalidated; recalculate the old-segment * horizon, starting again from RedoRecPtr. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(endptr, &_logSegNo); + KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo); } _logSegNo--; @@ -7409,6 +7446,7 @@ GetWALAvailability(XLogRecPtr targetLSN) XLogSegNo oldestSegMaxWalSize; /* oldest segid kept by max_wal_size */ XLogSegNo oldestSlotSeg; /* oldest segid kept by slot */ uint64 keepSegs; + XLogRecPtr slotsMinReqLSN; /* * slot does not reserve WAL. Either deactivated, or has never been active @@ -7422,8 +7460,9 @@ GetWALAvailability(XLogRecPtr targetLSN) * oldestSlotSeg to the current segment. */ currpos = GetXLogWriteRecPtr(); + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size); - KeepLogSeg(currpos, &oldestSlotSeg); + KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg); /* * Find the oldest extant segment file. We get 1 until checkpoint removes @@ -7484,7 +7523,7 @@ GetWALAvailability(XLogRecPtr targetLSN) * invalidation is optionally done here, instead. */ static void -KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) +KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo) { XLogSegNo currSegNo; XLogSegNo segno; @@ -7497,7 +7536,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) * Calculate how many segments are kept by slots first, adjusting for * max_slot_wal_keep_size. */ - keep = XLogGetReplicationSlotMinimumLSN(); + keep = slotsMinReqLSN; if (keep != InvalidXLogRecPtr && keep < recptr) { XLByteToSeg(keep, segno, wal_segment_size); diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 1dbb747465f..6e1879d8149 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -1880,7 +1880,15 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) SpinLockRelease(&MyReplicationSlot->mutex); - /* first write new xmin to disk, so we know what's up after a crash */ + /* + * First, write new xmin and restart_lsn to disk so we know what's up + * after a crash. Even when we do this, the checkpointer can see the + * updated restart_lsn value in the shared memory; then, a crash can + * happen before we manage to write that value to the disk. Thus, + * checkpointer still needs to make special efforts to keep WAL + * segments required by the restart_lsn written to the disk. See + * CreateCheckPoint() and CreateRestartPoint() for details. + */ if (updated_xmin || updated_restart) { ReplicationSlotMarkDirty(); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index dafa0a2d790..5bbf6cc9a5e 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -2071,6 +2071,10 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn) * be energy wasted - the worst thing lost information could cause here is * to give wrong information in a statistics view - we'll just potentially * be more conservative in removing files. + * + * Checkpointer makes special efforts to keep the WAL segments required by + * the restart_lsn written to the disk. See CreateCheckPoint() and + * CreateRestartPoint() for details. */ } From b2ae077205e18ac3e6d7bc5f7a6fa25a39323ec0 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 16 Jun 2025 17:35:55 -0700 Subject: [PATCH 038/115] Fix re-distributing previously distributed invalidation messages during logical decoding. Commit 4909b38af0 introduced logic to distribute invalidation messages from catalog-modifying transactions to all concurrent in-progress transactions. However, since each transaction distributes not only its original invalidation messages but also previously distributed messages to other transactions, this leads to an exponential increase in allocation request size for invalidation messages, ultimately causing memory allocation failure. This commit fixes this issue by tracking distributed invalidation messages separately per decoded transaction and not redistributing these messages to other in-progress transactions. The maximum size of distributed invalidation messages that one transaction can store is limited to MAX_DISTR_INVAL_MSG_PER_TXN (8MB). Once the size of the distributed invalidation messages exceeds this threshold, we invalidate all caches in locations where distributed invalidation messages need to be executed. Back-patch to all supported versions where we introduced the fix by commit 4909b38af0. Note that this commit adds two new fields to ReorderBufferTXN to store the distributed transactions. This change breaks ABI compatibility in back branches, affecting third-party extensions that depend on the size of the ReorderBufferTXN struct, though this scenario seems unlikely. Additionally, it adds a new flag to the txn_flags field of ReorderBufferTXN to indicate distributed invalidation message overflow. This should not affect existing implementations, as it is unlikely that third-party extensions use unused bits in the txn_flags field. Bug: #18938 #18942 Author: vignesh C Reported-by: Duncan Sands Reported-by: John Hutchins Reported-by: Laurence Parry Reported-by: Max Madden Reported-by: Braulio Fdo Gonzalez Reviewed-by: Masahiko Sawada Reviewed-by: Amit Kapila Reviewed-by: Hayato Kuroda Discussion: https://postgr.es/m/680bdaf6-f7d1-4536-b580-05c2760c67c6@deepbluecap.com Discussion: https://postgr.es/m/18942-0ab1e5ae156613ad@postgresql.org Discussion: https://postgr.es/m/18938-57c9a1c463b68ce0@postgresql.org Discussion: https://postgr.es/m/CAD1FGCT2sYrP_70RTuo56QTizyc+J3wJdtn2gtO3VttQFpdMZg@mail.gmail.com Discussion: https://postgr.es/m/CANO2=B=2BT1hSYCE=nuuTnVTnjidMg0+-FfnRnqM6kd23qoygg@mail.gmail.com Backpatch-through: 13 --- .../expected/invalidation_distribution.out | 23 ++- .../specs/invalidation_distribution.spec | 11 + .../replication/logical/reorderbuffer.c | 195 +++++++++++++++--- src/backend/replication/logical/snapbuild.c | 12 +- src/include/replication/reorderbuffer.h | 34 ++- 5 files changed, 230 insertions(+), 45 deletions(-) diff --git a/contrib/test_decoding/expected/invalidation_distribution.out b/contrib/test_decoding/expected/invalidation_distribution.out index ad0a944cbf3..ae53b1e61de 100644 --- a/contrib/test_decoding/expected/invalidation_distribution.out +++ b/contrib/test_decoding/expected/invalidation_distribution.out @@ -1,4 +1,4 @@ -Parsed test spec with 2 sessions +Parsed test spec with 3 sessions starting permutation: s1_insert_tbl1 s1_begin s1_insert_tbl1 s2_alter_pub_add_tbl s1_commit s1_insert_tbl1 s2_get_binary_changes step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); @@ -18,3 +18,24 @@ count stop (1 row) + +starting permutation: s1_begin s1_insert_tbl1 s3_begin s3_insert_tbl1 s2_alter_pub_add_tbl s1_insert_tbl1 s1_commit s3_commit s2_get_binary_changes +step s1_begin: BEGIN; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s3_begin: BEGIN; +step s3_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (2, 2); +step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s1_commit: COMMIT; +step s3_commit: COMMIT; +step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; +count +----- + 1 +(1 row) + +?column? +-------- +stop +(1 row) + diff --git a/contrib/test_decoding/specs/invalidation_distribution.spec b/contrib/test_decoding/specs/invalidation_distribution.spec index decbed627e3..67d41969ac1 100644 --- a/contrib/test_decoding/specs/invalidation_distribution.spec +++ b/contrib/test_decoding/specs/invalidation_distribution.spec @@ -28,5 +28,16 @@ setup { SET synchronous_commit=on; } step "s2_alter_pub_add_tbl" { ALTER PUBLICATION pub ADD TABLE tbl1; } step "s2_get_binary_changes" { SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; } +session "s3" +setup { SET synchronous_commit=on; } +step "s3_begin" { BEGIN; } +step "s3_insert_tbl1" { INSERT INTO tbl1 (val1, val2) VALUES (2, 2); } +step "s3_commit" { COMMIT; } + # Expect to get one insert change. LOGICAL_REP_MSG_INSERT = 'I' permutation "s1_insert_tbl1" "s1_begin" "s1_insert_tbl1" "s2_alter_pub_add_tbl" "s1_commit" "s1_insert_tbl1" "s2_get_binary_changes" + +# Expect to get one insert change with LOGICAL_REP_MSG_INSERT = 'I' from +# the second "s1_insert_tbl1" executed after adding the table tbl1 to the +# publication in "s2_alter_pub_add_tbl". +permutation "s1_begin" "s1_insert_tbl1" "s3_begin" "s3_insert_tbl1" "s2_alter_pub_add_tbl" "s1_insert_tbl1" "s1_commit" "s3_commit" "s2_get_binary_changes" diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index fa04e829cc9..6464a926c20 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -103,11 +103,22 @@ #include "storage/sinval.h" #include "utils/builtins.h" #include "utils/combocid.h" +#include "utils/inval.h" #include "utils/memdebug.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/relfilenumbermap.h" +/* + * Each transaction has an 8MB limit for invalidation messages distributed from + * other transactions. This limit is set considering scenarios with many + * concurrent logical decoding operations. When the distributed invalidation + * messages reach this threshold, the transaction is marked as + * RBTXN_DISTR_INVAL_OVERFLOWED to invalidate the complete cache as we have lost + * some inval messages and hence don't know what needs to be invalidated. + */ +#define MAX_DISTR_INVAL_MSG_PER_TXN \ + ((8 * 1024 * 1024) / sizeof(SharedInvalidationMessage)) /* entry for a hash table we use to map from xid to our transaction state */ typedef struct ReorderBufferTXNByIdEnt @@ -461,6 +472,12 @@ ReorderBufferReturnTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) txn->invalidations = NULL; } + if (txn->invalidations_distributed) + { + pfree(txn->invalidations_distributed); + txn->invalidations_distributed = NULL; + } + /* Reset the toast hash */ ReorderBufferToastReset(rb, txn); @@ -2539,7 +2556,17 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, AbortCurrentTransaction(); /* make sure there's no cache pollution */ - ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + if (rbtxn_distr_inval_overflowed(txn)) + { + Assert(txn->ninvalidations_distributed == 0); + InvalidateSystemCaches(); + } + else + { + ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + ReorderBufferExecuteInvalidations(txn->ninvalidations_distributed, + txn->invalidations_distributed); + } if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); @@ -2585,8 +2612,17 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, AbortCurrentTransaction(); /* make sure there's no cache pollution */ - ReorderBufferExecuteInvalidations(txn->ninvalidations, - txn->invalidations); + if (rbtxn_distr_inval_overflowed(txn)) + { + Assert(txn->ninvalidations_distributed == 0); + InvalidateSystemCaches(); + } + else + { + ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + ReorderBufferExecuteInvalidations(txn->ninvalidations_distributed, + txn->invalidations_distributed); + } if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); @@ -2916,7 +2952,8 @@ ReorderBufferAbort(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, * We might have decoded changes for this transaction that could load * the cache as per the current transaction's view (consider DDL's * happened in this transaction). We don't want the decoding of future - * transactions to use those cache entries so execute invalidations. + * transactions to use those cache entries so execute only the inval + * messages in this transaction. */ if (txn->ninvalidations > 0) ReorderBufferImmediateInvalidation(rb, txn->ninvalidations, @@ -3003,9 +3040,10 @@ ReorderBufferForget(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn) txn->final_lsn = lsn; /* - * Process cache invalidation messages if there are any. Even if we're not - * interested in the transaction's contents, it could have manipulated the - * catalog and we need to update the caches according to that. + * Process only cache invalidation messages in this transaction if there + * are any. Even if we're not interested in the transaction's contents, it + * could have manipulated the catalog and we need to update the caches + * according to that. */ if (txn->base_snapshot != NULL && txn->ninvalidations > 0) ReorderBufferImmediateInvalidation(rb, txn->ninvalidations, @@ -3257,6 +3295,57 @@ ReorderBufferAddNewTupleCids(ReorderBuffer *rb, TransactionId xid, txn->ntuplecids++; } +/* + * Add new invalidation messages to the reorder buffer queue. + */ +static void +ReorderBufferQueueInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs) +{ + ReorderBufferChange *change; + + change = ReorderBufferGetChange(rb); + change->action = REORDER_BUFFER_CHANGE_INVALIDATION; + change->data.inval.ninvalidations = nmsgs; + change->data.inval.invalidations = (SharedInvalidationMessage *) + palloc(sizeof(SharedInvalidationMessage) * nmsgs); + memcpy(change->data.inval.invalidations, msgs, + sizeof(SharedInvalidationMessage) * nmsgs); + + ReorderBufferQueueChange(rb, xid, lsn, change, false); +} + +/* + * A helper function for ReorderBufferAddInvalidations() and + * ReorderBufferAddDistributedInvalidations() to accumulate the invalidation + * messages to the **invals_out. + */ +static void +ReorderBufferAccumulateInvalidations(SharedInvalidationMessage **invals_out, + uint32 *ninvals_out, + SharedInvalidationMessage *msgs_new, + Size nmsgs_new) +{ + if (*ninvals_out == 0) + { + *ninvals_out = nmsgs_new; + *invals_out = (SharedInvalidationMessage *) + palloc(sizeof(SharedInvalidationMessage) * nmsgs_new); + memcpy(*invals_out, msgs_new, sizeof(SharedInvalidationMessage) * nmsgs_new); + } + else + { + /* Enlarge the array of inval messages */ + *invals_out = (SharedInvalidationMessage *) + repalloc(*invals_out, sizeof(SharedInvalidationMessage) * + (*ninvals_out + nmsgs_new)); + memcpy(*invals_out + *ninvals_out, msgs_new, + nmsgs_new * sizeof(SharedInvalidationMessage)); + *ninvals_out += nmsgs_new; + } +} + /* * Accumulate the invalidations for executing them later. * @@ -3277,7 +3366,6 @@ ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, { ReorderBufferTXN *txn; MemoryContext oldcontext; - ReorderBufferChange *change; txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); @@ -3292,35 +3380,76 @@ ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, Assert(nmsgs > 0); - /* Accumulate invalidations. */ - if (txn->ninvalidations == 0) - { - txn->ninvalidations = nmsgs; - txn->invalidations = (SharedInvalidationMessage *) - palloc(sizeof(SharedInvalidationMessage) * nmsgs); - memcpy(txn->invalidations, msgs, - sizeof(SharedInvalidationMessage) * nmsgs); - } - else + ReorderBufferAccumulateInvalidations(&txn->invalidations, + &txn->ninvalidations, + msgs, nmsgs); + + ReorderBufferQueueInvalidations(rb, xid, lsn, nmsgs, msgs); + + MemoryContextSwitchTo(oldcontext); +} + +/* + * Accumulate the invalidations distributed by other committed transactions + * for executing them later. + * + * This function is similar to ReorderBufferAddInvalidations() but stores + * the given inval messages to the txn->invalidations_distributed with the + * overflow check. + * + * This needs to be called by committed transactions to distribute their + * inval messages to in-progress transactions. + */ +void +ReorderBufferAddDistributedInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs) +{ + ReorderBufferTXN *txn; + MemoryContext oldcontext; + + txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); + + oldcontext = MemoryContextSwitchTo(rb->context); + + /* + * Collect all the invalidations under the top transaction, if available, + * so that we can execute them all together. See comments + * ReorderBufferAddInvalidations. + */ + txn = rbtxn_get_toptxn(txn); + + Assert(nmsgs > 0); + + if (!rbtxn_distr_inval_overflowed(txn)) { - txn->invalidations = (SharedInvalidationMessage *) - repalloc(txn->invalidations, sizeof(SharedInvalidationMessage) * - (txn->ninvalidations + nmsgs)); + /* + * Check the transaction has enough space for storing distributed + * invalidation messages. + */ + if (txn->ninvalidations_distributed + nmsgs >= MAX_DISTR_INVAL_MSG_PER_TXN) + { + /* + * Mark the invalidation message as overflowed and free up the + * messages accumulated so far. + */ + txn->txn_flags |= RBTXN_DISTR_INVAL_OVERFLOWED; - memcpy(txn->invalidations + txn->ninvalidations, msgs, - nmsgs * sizeof(SharedInvalidationMessage)); - txn->ninvalidations += nmsgs; + if (txn->invalidations_distributed) + { + pfree(txn->invalidations_distributed); + txn->invalidations_distributed = NULL; + txn->ninvalidations_distributed = 0; + } + } + else + ReorderBufferAccumulateInvalidations(&txn->invalidations_distributed, + &txn->ninvalidations_distributed, + msgs, nmsgs); } - change = ReorderBufferGetChange(rb); - change->action = REORDER_BUFFER_CHANGE_INVALIDATION; - change->data.inval.ninvalidations = nmsgs; - change->data.inval.invalidations = (SharedInvalidationMessage *) - palloc(sizeof(SharedInvalidationMessage) * nmsgs); - memcpy(change->data.inval.invalidations, msgs, - sizeof(SharedInvalidationMessage) * nmsgs); - - ReorderBufferQueueChange(rb, xid, lsn, change, false); + /* Queue the invalidation messages into the transaction */ + ReorderBufferQueueInvalidations(rb, xid, lsn, nmsgs, msgs); MemoryContextSwitchTo(oldcontext); } diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index d48ebb8337b..6c49dda75b6 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -918,6 +918,13 @@ SnapBuildDistributeSnapshotAndInval(SnapBuild *builder, XLogRecPtr lsn, Transact * contents built by the current transaction even after its decoding, * which should have been invalidated due to concurrent catalog * changing transaction. + * + * Distribute only the invalidation messages generated by the current + * committed transaction. Invalidation messages received from other + * transactions would have already been propagated to the relevant + * in-progress transactions. This transaction would have processed + * those invalidations, ensuring that subsequent transactions observe + * a consistent cache state. */ if (txn->xid != xid) { @@ -931,8 +938,9 @@ SnapBuildDistributeSnapshotAndInval(SnapBuild *builder, XLogRecPtr lsn, Transact { Assert(msgs != NULL); - ReorderBufferAddInvalidations(builder->reorder, txn->xid, lsn, - ninvalidations, msgs); + ReorderBufferAddDistributedInvalidations(builder->reorder, + txn->xid, lsn, + ninvalidations, msgs); } } } diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index 8a32bbe28df..1606e0ea007 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -177,15 +177,16 @@ typedef struct ReorderBufferChange } ReorderBufferChange; /* ReorderBufferTXN txn_flags */ -#define RBTXN_HAS_CATALOG_CHANGES 0x0001 -#define RBTXN_IS_SUBXACT 0x0002 -#define RBTXN_IS_SERIALIZED 0x0004 -#define RBTXN_IS_SERIALIZED_CLEAR 0x0008 -#define RBTXN_IS_STREAMED 0x0010 -#define RBTXN_HAS_PARTIAL_CHANGE 0x0020 -#define RBTXN_PREPARE 0x0040 -#define RBTXN_SKIPPED_PREPARE 0x0080 -#define RBTXN_HAS_STREAMABLE_CHANGE 0x0100 +#define RBTXN_HAS_CATALOG_CHANGES 0x0001 +#define RBTXN_IS_SUBXACT 0x0002 +#define RBTXN_IS_SERIALIZED 0x0004 +#define RBTXN_IS_SERIALIZED_CLEAR 0x0008 +#define RBTXN_IS_STREAMED 0x0010 +#define RBTXN_HAS_PARTIAL_CHANGE 0x0020 +#define RBTXN_PREPARE 0x0040 +#define RBTXN_SKIPPED_PREPARE 0x0080 +#define RBTXN_HAS_STREAMABLE_CHANGE 0x0100 +#define RBTXN_DISTR_INVAL_OVERFLOWED 0x0200 /* Does the transaction have catalog changes? */ #define rbtxn_has_catalog_changes(txn) \ @@ -249,6 +250,12 @@ typedef struct ReorderBufferChange ((txn)->txn_flags & RBTXN_SKIPPED_PREPARE) != 0 \ ) +/* Is the array of distributed inval messages overflowed? */ +#define rbtxn_distr_inval_overflowed(txn) \ +( \ + ((txn)->txn_flags & RBTXN_DISTR_INVAL_OVERFLOWED) != 0 \ +) + /* Is this a top-level transaction? */ #define rbtxn_is_toptxn(txn) \ ( \ @@ -435,6 +442,12 @@ typedef struct ReorderBufferTXN * Private data pointer of the output plugin. */ void *output_plugin_private; + + /* + * Stores cache invalidation messages distributed by other transactions. + */ + uint32 ninvalidations_distributed; + SharedInvalidationMessage *invalidations_distributed; } ReorderBufferTXN; /* so we can define the callbacks used inside struct ReorderBuffer itself */ @@ -728,6 +741,9 @@ extern void ReorderBufferAddNewTupleCids(ReorderBuffer *rb, TransactionId xid, CommandId cmin, CommandId cmax, CommandId combocid); extern void ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Size nmsgs, SharedInvalidationMessage *msgs); +extern void ReorderBufferAddDistributedInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs); extern void ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations, SharedInvalidationMessage *invalidations); extern void ReorderBufferProcessXid(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn); From 1e24ea1603505142f63dcc8e7dbbb120312e2fe5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 20 Jun 2025 13:41:11 -0400 Subject: [PATCH 039/115] Use SnapshotDirty when checking for conflicting index names. While choosing an autogenerated name for an index, look for pre-existing relations using a SnapshotDirty snapshot, instead of the previous behavior that considered only committed-good pg_class rows. This allows us to detect and avoid conflicts against indexes that are still being built. It's still possible to fail due to a race condition, but the window is now just the amount of time that it takes DefineIndex to validate all its parameters, call smgrcreate(), and enter the index's pg_class row. Formerly the race window covered the entire time needed to create and fill an index, which could be very long if the table is large. Worse, if the conflicting index creation is part of a larger transaction, it wouldn't be visible till COMMIT. So this isn't a complete solution, but it should greatly ameliorate the problem, and the patch is simple enough to be back-patchable. It might at some point be useful to do the same for pg_constraint entries (cf. ChooseConstraintName, ConstraintNameExists, and related functions). However, in the absence of field complaints, I'll leave that alone for now. The relation-name test should be good enough for index-based constraints, while foreign-key constraints seem to be okay since they require exclusive locks to create. Bug: #18959 Reported-by: Maximilian Chrzan Author: Tom Lane Reviewed-by: Dilip Kumar Discussion: https://postgr.es/m/18959-f63b53b864bb1417@postgresql.org Backpatch-through: 13 --- src/backend/commands/indexcmds.c | 38 ++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index cf6ef3a955d..80da56d9743 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2462,7 +2462,9 @@ makeObjectName(const char *name1, const char *name2, const char *label) * constraint names.) * * Note: it is theoretically possible to get a collision anyway, if someone - * else chooses the same name concurrently. This is fairly unlikely to be + * else chooses the same name concurrently. We shorten the race condition + * window by checking for conflicting relations using SnapshotDirty, but + * that doesn't close the window entirely. This is fairly unlikely to be * a problem in practice, especially if one is holding an exclusive lock on * the relation identified by name1. However, if choosing multiple names * within a single command, you'd better create the new object and do @@ -2478,15 +2480,45 @@ ChooseRelationName(const char *name1, const char *name2, int pass = 0; char *relname = NULL; char modlabel[NAMEDATALEN]; + SnapshotData SnapshotDirty; + Relation pgclassrel; + + /* prepare to search pg_class with a dirty snapshot */ + InitDirtySnapshot(SnapshotDirty); + pgclassrel = table_open(RelationRelationId, AccessShareLock); /* try the unmodified label first */ strlcpy(modlabel, label, sizeof(modlabel)); for (;;) { + ScanKeyData key[2]; + SysScanDesc scan; + bool collides; + relname = makeObjectName(name1, name2, modlabel); - if (!OidIsValid(get_relname_relid(relname, namespaceid))) + /* is there any conflicting relation name? */ + ScanKeyInit(&key[0], + Anum_pg_class_relname, + BTEqualStrategyNumber, F_NAMEEQ, + CStringGetDatum(relname)); + ScanKeyInit(&key[1], + Anum_pg_class_relnamespace, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(namespaceid)); + + scan = systable_beginscan(pgclassrel, ClassNameNspIndexId, + true /* indexOK */ , + &SnapshotDirty, + 2, key); + + collides = HeapTupleIsValid(systable_getnext(scan)); + + systable_endscan(scan); + + /* break out of loop if no conflict */ + if (!collides) { if (!isconstraint || !ConstraintNameExists(relname, namespaceid)) @@ -2498,6 +2530,8 @@ ChooseRelationName(const char *name1, const char *name2, snprintf(modlabel, sizeof(modlabel), "%s%d", label, ++pass); } + table_close(pgclassrel, AccessShareLock); + return relname; } From 7a93bd5986e4b741fc3fdd8406431c77161c6d12 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 Jun 2025 12:52:37 -0400 Subject: [PATCH 040/115] Doc: improve documentation about width_bucket(). Specify whether the bucket bounds are inclusive or exclusive, and improve some other vague language. Explain the behavior that occurs when the "low" bound is greater than the "high" bound. Make width_bucket_numeric's comment more like that for width_bucket_float8, in particular noting that infinite bounds are rejected (since they became possible in v14). Reported-by: Ben Peachey Higdon Author: Robert Treat Co-authored-by: Tom Lane Reviewed-by: Dean Rasheed Discussion: https://postgr.es/m/2BD74F86-5B89-4AC1-8F13-23CED3546AC1@gmail.com Backpatch-through: 13 --- doc/src/sgml/func.sgml | 18 ++++++++++++++---- src/backend/utils/adt/float.c | 4 ++-- src/backend/utils/adt/numeric.c | 7 ++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 5efac2f7e06..bafd8dc3548 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1774,13 +1774,23 @@ repeat('Pg', 4) PgPgPgPg which operand falls in a histogram having count equal-width buckets spanning the range low to high. - Returns 0 + The buckets have inclusive lower bounds and exclusive upper bounds. + Returns 0 for an input less + than low, or count+1 for an input - outside that range. + greater than or equal to high. + If low > high, + the behavior is mirror-reversed, with bucket 1 + now being the one just below low, and the + inclusive bounds now being on the upper side. width_bucket(5.35, 0.024, 10.06, 5) 3 + + + width_bucket(9, 10, 0, 10) + 2 @@ -1792,8 +1802,8 @@ repeat('Pg', 4) PgPgPgPg Returns the number of the bucket in which operand falls given an array listing the - lower bounds of the buckets. Returns 0 for an - input less than the first lower + inclusive lower bounds of the buckets. + Returns 0 for an input less than the first lower bound. operand and the array elements can be of any type having standard comparison operators. The thresholds array must be diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index dfa90a04fb2..9f39ad254bb 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -4075,8 +4075,8 @@ float84ge(PG_FUNCTION_ARGS) * in the histogram. width_bucket() returns an integer indicating the * bucket number that 'operand' belongs to in an equiwidth histogram * with the specified characteristics. An operand smaller than the - * lower bound is assigned to bucket 0. An operand greater than the - * upper bound is assigned to an additional bucket (with number + * lower bound is assigned to bucket 0. An operand greater than or equal + * to the upper bound is assigned to an additional bucket (with number * count+1). We don't allow "NaN" for any of the float8 inputs, and we * don't allow either of the histogram bounds to be +/- infinity. */ diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index e2e243835e2..3ea1b910039 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -1835,9 +1835,10 @@ generate_series_step_numeric(PG_FUNCTION_ARGS) * in the histogram. width_bucket() returns an integer indicating the * bucket number that 'operand' belongs to in an equiwidth histogram * with the specified characteristics. An operand smaller than the - * lower bound is assigned to bucket 0. An operand greater than the - * upper bound is assigned to an additional bucket (with number - * count+1). We don't allow "NaN" for any of the numeric arguments. + * lower bound is assigned to bucket 0. An operand greater than or equal + * to the upper bound is assigned to an additional bucket (with number + * count+1). We don't allow "NaN" for any of the numeric inputs, and we + * don't allow either of the histogram bounds to be +/- infinity. */ Datum width_bucket_numeric(PG_FUNCTION_ARGS) From 629cc16231683c183c8a024629284aba5a056a28 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sun, 22 Jun 2025 14:13:46 +0200 Subject: [PATCH 041/115] meson: Fix meson warning WARNING: You should add the boolean check kwarg to the run_command call. It currently defaults to false, but it will default to true in meson 2.0. Introduced by commit bc46104fc9a. (This only happens in the msvc branch. All the other run_command calls are ok.) Reviewed-by: Andres Freund Discussion: https://www.postgresql.org/message-id/flat/42e13eb0-862a-441e-8d84-4f0fd5f6def0%40eisentraut.org --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index a8b0f1ecc9f..1367081ed27 100644 --- a/meson.build +++ b/meson.build @@ -1061,7 +1061,7 @@ if not perlopt.disabled() if cc.get_id() == 'msvc' # prevent binary mismatch between MSVC built plperl and Strawberry or # msys ucrt perl libraries - perl_v = run_command(perl, '-V').stdout() + perl_v = run_command(perl, '-V', check: false).stdout() if not perl_v.contains('USE_THREAD_SAFE_LOCALE') perl_ccflags += ['-DNO_THREAD_SAFE_LOCALE'] endif From e5fcc6d14f35e165f7f8e0a31c3e83ad57cc1f65 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Tue, 24 Jun 2025 14:21:10 +0900 Subject: [PATCH 042/115] doc: Fix incorrect UUID index entry in function documentation. Previously, the UUID functions documentation defined the "UUID" index entry to link to the UUID data type page, even though that entry already exists there. Instead, the UUID functions page should define its own index entry linking to itself. This commit updates the UUID index entry in the UUID functions documentation to point to the correct section, improving navigation and avoiding duplication. Back-patch to all supported versions. Author: Fujii Masao Reviewed-by: Masahiko Sawada Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/f33e0493-5773-4296-87c5-7ce459054cfe@oss.nttdata.com Backpatch-through: 13 --- doc/src/sgml/func.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index bafd8dc3548..15b8a3eaa5d 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -13957,7 +13957,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple UUID Functions - + UUID generating From abb487ad1ecf0e9dd8d64108baa949b752d8c756 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Tue, 24 Jun 2025 11:49:37 +0200 Subject: [PATCH 043/115] doc: Remove dead link to NewbieDoc Docbook Guide The link returns 404 and no replacement is available in the project on Sourceforge where the content once was. Since we already link to resources for both beginner and experienced docs hackers, remove the the dead link. Backpatch to all supported versions as the link was added in 8.1. Author: Daniel Gustafsson Reviewed-by: Magnus Hagander Reviewed-by: Michael Paquier Reported-by: jian he Discussion: https://postgr.es/m/CACJufxH=YzQPDOe+2WuYZ7seD-BOyjCBmP6JiErpoSiVZWDRnw@mail.gmail.com Backpatch-through: 13 --- doc/src/sgml/docguide.sgml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/src/sgml/docguide.sgml b/doc/src/sgml/docguide.sgml index fd72b3975ad..b21e0ec852f 100644 --- a/doc/src/sgml/docguide.sgml +++ b/doc/src/sgml/docguide.sgml @@ -60,9 +60,7 @@ maintained by the OASIS group. The official DocBook site has good introductory and reference documentation and - a complete O'Reilly book for your online reading pleasure. The - - NewbieDoc Docbook Guide is very helpful for beginners. + a complete O'Reilly book for your online reading pleasure. The FreeBSD Documentation Project also uses DocBook and has some good information, including a number of style guidelines that might be From 87c8ed3db16f94250ea4c3698c261294237a4c3b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 24 Jun 2025 14:14:04 -0400 Subject: [PATCH 044/115] Prevent excessive delays before launching new logrep workers. The logical replication launcher process would sometimes sleep for as much as 3 minutes before noticing that it is supposed to launch a new worker. This could happen if (1) WaitForReplicationWorkerAttach absorbed a process latch wakeup that was meant to cause ApplyLauncherMain to do work, or (2) logicalrep_worker_launch reported failure, either because of resource limits or because the new worker terminated immediately. In case (2), the expected behavior is that we retry the launch after wal_retrieve_retry_interval, but that didn't reliably happen. It's not clear how often such conditions would occur in the field, but in our subscription test suite they are somewhat common, especially in tests that exercise cases that cause quick worker failure. That causes the tests to take substantially longer than they ought to do on typical setups. To fix (1), make WaitForReplicationWorkerAttach re-set the latch before returning if it cleared it while looping. To fix (2), ensure that we reduce wait_time to no more than wal_retrieve_retry_interval when logicalrep_worker_launch reports failure. In passing, fix a couple of perhaps-hypothetical race conditions, e.g. examining worker->in_use without a lock. Backpatch to v16. Problem (2) didn't exist before commit 5a3a95385 because the previous code always set wait_time to wal_retrieve_retry_interval when launching a worker, regardless of success or failure of the launch. That behavior also greatly mitigated problem (1), so I'm not excited about adapting the remainder of the patch to the substantially-different code in older branches. Author: Tom Lane Reviewed-by: Amit Kapila Reviewed-by: Ashutosh Bapat Discussion: https://postgr.es/m/817604.1750723007@sss.pgh.pa.us Backpatch-through: 16 --- src/backend/replication/logical/launcher.c | 38 +++++++++++++++++---- src/backend/replication/logical/tablesync.c | 17 +++++---- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 8395ae7b23c..423d85fd40c 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -190,12 +190,14 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, uint16 generation, BackgroundWorkerHandle *handle) { - BgwHandleStatus status; - int rc; + bool result = false; + bool dropped_latch = false; for (;;) { + BgwHandleStatus status; pid_t pid; + int rc; CHECK_FOR_INTERRUPTS(); @@ -204,8 +206,9 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, /* Worker either died or has started. Return false if died. */ if (!worker->in_use || worker->proc) { + result = worker->in_use; LWLockRelease(LogicalRepWorkerLock); - return worker->in_use; + break; } LWLockRelease(LogicalRepWorkerLock); @@ -220,7 +223,7 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, if (generation == worker->generation) logicalrep_worker_cleanup(worker); LWLockRelease(LogicalRepWorkerLock); - return false; + break; /* result is already false */ } /* @@ -235,8 +238,18 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, { ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); + dropped_latch = true; } } + + /* + * If we had to clear a latch event in order to wait, be sure to restore + * it before exiting. Otherwise caller may miss events. + */ + if (dropped_latch) + SetLatch(MyLatch); + + return result; } /* @@ -1174,9 +1187,20 @@ ApplyLauncherMain(Datum main_arg) (elapsed = TimestampDifferenceMilliseconds(last_start, now)) >= wal_retrieve_retry_interval) { ApplyLauncherSetWorkerStartTime(sub->oid, now); - logicalrep_worker_launch(sub->dbid, sub->oid, sub->name, - sub->owner, InvalidOid, - DSM_HANDLE_INVALID); + if (!logicalrep_worker_launch(sub->dbid, sub->oid, sub->name, + sub->owner, InvalidOid, + DSM_HANDLE_INVALID)) + { + /* + * We get here either if we failed to launch a worker + * (perhaps for resource-exhaustion reasons) or if we + * launched one but it immediately quit. Either way, it + * seems appropriate to try again after + * wal_retrieve_retry_interval. + */ + wait_time = Min(wait_time, + wal_retrieve_retry_interval); + } } else { diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 7d4ee482069..ca88133ed14 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -603,13 +603,18 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) TimestampDifferenceExceeds(hentry->last_start_time, now, wal_retrieve_retry_interval)) { - logicalrep_worker_launch(MyLogicalRepWorker->dbid, - MySubscription->oid, - MySubscription->name, - MyLogicalRepWorker->userid, - rstate->relid, - DSM_HANDLE_INVALID); + /* + * Set the last_start_time even if we fail to start + * the worker, so that we won't retry until + * wal_retrieve_retry_interval has elapsed. + */ hentry->last_start_time = now; + (void) logicalrep_worker_launch(MyLogicalRepWorker->dbid, + MySubscription->oid, + MySubscription->name, + MyLogicalRepWorker->userid, + rstate->relid, + DSM_HANDLE_INVALID); } } } From d187cabddadcbea2033d172e738edbd65b5a3f8d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 25 Jun 2025 10:03:52 +0900 Subject: [PATCH 045/115] Avoid scribbling of VACUUM options This fixes two issues with the handling of VacuumParams in vacuum_rel(). This code path has the idea to change the passed-in pointer of VacuumParams for the "truncate" and "index_cleanup" options for the relation worked on, impacting the two following scenarios where incorrect options may be used because a VacuumParams pointer is shared across multiple relations: - Multiple relations in a single VACUUM command. - TOAST relations vacuumed with their main relation. The problem is avoided by providing to the two callers of vacuum_rel() copies of VacuumParams, before the pointer is updated for the "truncate" and "index_cleanup" options. The refactoring of the VACUUM option and parameters done in 0d831389749a did not introduce an issue, but it has encouraged the problem we are dealing with in this commit, with b84dbc8eb80b for "truncate" and a96c41feec6b for "index_cleanup" that have been added a couple of years after the initial refactoring. HEAD will be improved with a different patch that hardens the uses of VacuumParams across the tree. This cannot be backpatched as it introduces an ABI breakage. The backend portion of the patch has been authored by Nathan, while I have implemented the tests. The tests rely on injection points to check the option values, making them faster, more reliable than the tests originally proposed by Shihao, and they also provide more coverage. This part can only be backpatched down to v17. Reported-by: Shihao Zhong Author: Nathan Bossart Co-authored-by: Michael Paquier Discussion: https://postgr.es/m/CAGRkXqTo+aK=GTy5pSc-9cy8H2F2TJvcrZ-zXEiNJj93np1UUw@mail.gmail.com Backpatch-through: 13 --- src/backend/commands/vacuum.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index f36b9544472..9ec511979e6 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -619,7 +619,15 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + VacuumParams params_copy; + + /* + * vacuum_rel() scribbles on the parameters, so give it a copy + * to avoid affecting other relations. + */ + memcpy(¶ms_copy, params, sizeof(VacuumParams)); + + if (!vacuum_rel(vrel->oid, vrel->relation, ¶ms_copy, bstrategy)) continue; } @@ -1993,9 +2001,16 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + VacuumParams toast_vacuum_params; Assert(params != NULL); + /* + * This function scribbles on the parameters, so make a copy early to + * avoid affecting the TOAST table (if we do end up recursing to it). + */ + memcpy(&toast_vacuum_params, params, sizeof(VacuumParams)); + /* Begin a transaction for vacuuming this relation */ StartTransactionCommand(); @@ -2258,10 +2273,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (toast_relid != InvalidOid) { - VacuumParams toast_vacuum_params; - /* force VACOPT_PROCESS_MAIN so vacuum_rel() processes it */ - memcpy(&toast_vacuum_params, params, sizeof(VacuumParams)); toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); From a4a1f9ec0aac2714ae9dad765b6259fb9b74e1e1 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 25 Jun 2025 10:18:22 +0530 Subject: [PATCH 046/115] Doc: Improve documentation of stream abort. Protocol v4 introduces parallel streaming, which allows Stream Abort messages to include additional abort information such as LSN and timestamp. However, the current documentation only states, "This field is available since protocol version 4," which may misleadingly suggest that the fields are always present when using protocol v4. This patch clarifies that the abort LSN and timestamp are included only when parallel streaming is enabled, even under protocol v4. Author: Anthonin Bonnefoy Reviewed-by: Amit Kapila Backpatch-through: 16, where it was introduced Discussion: https://postgr.es/m/CAO6_XqoKteQR1AnaR8iPcegbBE+HkAc2-g12rxN04yOt4-2ORg@mail.gmail.com --- doc/src/sgml/protocol.sgml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index c4bd395d325..14203572ea7 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -6936,8 +6936,8 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int64 (XLogRecPtr) - The LSN of the abort. This field is available since protocol version - 4. + The LSN of the abort operation, present only when streaming is set to parallel. + This field is available since protocol version 4. @@ -6946,9 +6946,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int64 (TimestampTz) - Abort timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). This field is - available since protocol version 4. + Abort timestamp of the transaction, present only when streaming is set to + parallel. The value is in number of microseconds since PostgreSQL epoch (2000-01-01). + This field is available since protocol version 4. From 5d4033a066151c41939b8dc92a3301e385aaffcc Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Thu, 26 Jun 2025 09:38:42 +0100 Subject: [PATCH 047/115] doc: Fix indentation of MERGE synopsis. The convention in the documentation for other SQL commands is to indent continuation lines and sub-clauses in the "Synopsis" section by 4 spaces, so do the same for MERGE. Author: Dean Rasheed Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/CAEZATCV+9tR9+WM-SCcdBEZ3x7WVxUpADD5jX9WeGX97z4LCGA@mail.gmail.com Backpatch-through: 15 --- doc/src/sgml/ref/merge.sgml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml index 815b9989ae9..f35cef27961 100644 --- a/doc/src/sgml/ref/merge.sgml +++ b/doc/src/sgml/ref/merge.sgml @@ -23,34 +23,34 @@ PostgreSQL documentation [ WITH with_query [, ...] ] MERGE INTO [ ONLY ] target_table_name [ * ] [ [ AS ] target_alias ] -USING data_source ON join_condition -when_clause [...] + USING data_source ON join_condition + when_clause [...] where data_source is: -{ [ ONLY ] source_table_name [ * ] | ( source_query ) } [ [ AS ] source_alias ] + { [ ONLY ] source_table_name [ * ] | ( source_query ) } [ [ AS ] source_alias ] and when_clause is: -{ WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } | - WHEN NOT MATCHED [ AND condition ] THEN { merge_insert | DO NOTHING } } + { WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } | + WHEN NOT MATCHED [ AND condition ] THEN { merge_insert | DO NOTHING } } and merge_insert is: -INSERT [( column_name [, ...] )] -[ OVERRIDING { SYSTEM | USER } VALUE ] -{ VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES } + INSERT [( column_name [, ...] )] + [ OVERRIDING { SYSTEM | USER } VALUE ] + { VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES } and merge_update is: -UPDATE SET { column_name = { expression | DEFAULT } | - ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | - ( column_name [, ...] ) = ( sub-SELECT ) - } [, ...] + UPDATE SET { column_name = { expression | DEFAULT } | + ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | + ( column_name [, ...] ) = ( sub-SELECT ) + } [, ...] and merge_delete is: -DELETE + DELETE From 13a449fc5d4896452958fd4aa5b007aa24c0287f Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Thu, 26 Jun 2025 15:03:32 -0400 Subject: [PATCH 048/115] Remove unused check in heap_xlog_insert() 8e03eb92e9a reverted the commit 39b66a91bd which allowed freezing in the heap_insert() code path but forgot to remove the corresponding check in heap_xlog_insert(). This code is extraneous but not harmful. However, cleaning it up makes it very clear that, as of now, we do not support any freezing of pages in the heap_insert() path. Author: Melanie Plageman Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/flat/CAAKRu_Zp4Pi-t51OFWm1YZ-cctDfBhHCMZ%3DEx6PKxv0o8y2GvA%40mail.gmail.com Backpatch-through: 14 --- src/backend/access/heap/heapam.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 6e7e07929d2..e6c83334de4 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -9714,6 +9714,9 @@ heap_xlog_insert(XLogReaderState *record) ItemPointerSetBlockNumber(&target_tid, blkno); ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); + /* No freezing in the heap_insert() code path */ + Assert(!(xlrec->flags & XLH_INSERT_ALL_FROZEN_SET)); + /* * The visibility map may need to be fixed even if the heap page is * already up-to-date. @@ -9784,10 +9787,6 @@ heap_xlog_insert(XLogReaderState *record) if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED) PageClearAllVisible(page); - /* XLH_INSERT_ALL_FROZEN_SET implies that all tuples are visible */ - if (xlrec->flags & XLH_INSERT_ALL_FROZEN_SET) - PageSetAllVisible(page); - MarkBufferDirty(buffer); } if (BufferIsValid(buffer)) From 01f26f5c2e4563a2dfc6a32dfe1d309c004bd748 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Fri, 27 Jun 2025 13:37:26 -0500 Subject: [PATCH 049/115] Use correct DatumGet*() function in test_shm_mq_main(). This is purely cosmetic, as dsm_attach() interprets its argument as a dsm_handle (i.e., an unsigned integer), but we might as well fix it. Oversight in commit 4db3744f1f. Author: Jianghua Yang Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAAZLFmRxkUD5jRs0W3K%3DUe4_ZS%2BRcAb0PCE1S0vVJBn3sWH2UQ%40mail.gmail.com Backpatch-through: 13 --- src/test/modules/test_shm_mq/worker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/modules/test_shm_mq/worker.c b/src/test/modules/test_shm_mq/worker.c index 88077273370..3167e3b3691 100644 --- a/src/test/modules/test_shm_mq/worker.c +++ b/src/test/modules/test_shm_mq/worker.c @@ -77,7 +77,7 @@ test_shm_mq_main(Datum main_arg) * exit, which is fine. If there were a ResourceOwner, it would acquire * ownership of the mapping, but we have no need for that. */ - seg = dsm_attach(DatumGetInt32(main_arg)); + seg = dsm_attach(DatumGetUInt32(main_arg)); if (seg == NULL) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), From c15798cf94c452f057c6b8dd38c904bb30a8864d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 29 Jun 2025 13:56:03 -0400 Subject: [PATCH 050/115] Obtain required table lock during cross-table constraint updates. Sometimes a table's constraint may depend on a column of another table, so that we have to update the constraint when changing the referenced column's type. We need to have lock on the constraint's table to do that. ATPostAlterTypeCleanup believed that this case was only possible for FOREIGN KEY constraints, but it's wrong at least for CHECK and EXCLUDE constraints; and in general, we'd probably need exclusive lock to alter any sort of constraint. So just remove the contype check and acquire lock for any other table. This prevents a "you don't have lock" assertion failure, though no ill effect is observed in production builds. We'll error out later anyway because we don't presently support physically altering column types within stored composite columns. But the catalog-munging is basically all there, so we may as well make that part work. Bug: #18970 Reported-by: Alexander Lakhin Diagnosed-by: jian he Author: Tom Lane Discussion: https://postgr.es/m/18970-a7d1cfe1f8d5d8d9@postgresql.org Backpatch-through: 13 --- src/backend/commands/tablecmds.c | 21 +++++++++++---------- src/test/regress/expected/alter_table.out | 7 +++++++ src/test/regress/sql/alter_table.sql | 9 +++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index cfb64768303..5252c971eec 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -13489,9 +13489,12 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) /* * Re-parse the index and constraint definitions, and attach them to the * appropriate work queue entries. We do this before dropping because in - * the case of a FOREIGN KEY constraint, we might not yet have exclusive - * lock on the table the constraint is attached to, and we need to get - * that before reparsing/dropping. + * the case of a constraint on another table, we might not yet have + * exclusive lock on the table the constraint is attached to, and we need + * to get that before reparsing/dropping. (That's possible at least for + * FOREIGN KEY, CHECK, and EXCLUSION constraints; in non-FK cases it + * requires a dependency on the target table's composite type in the other + * table's constraint expressions.) * * We can't rely on the output of deparsing to tell us which relation to * operate on, because concurrent activity might have made the name @@ -13507,7 +13510,6 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Form_pg_constraint con; Oid relid; Oid confrelid; - char contype; bool conislocal; tup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(oldId)); @@ -13524,7 +13526,6 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) elog(ERROR, "could not identify relation associated with constraint %u", oldId); } confrelid = con->confrelid; - contype = con->contype; conislocal = con->conislocal; ReleaseSysCache(tup); @@ -13541,12 +13542,12 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) continue; /* - * When rebuilding an FK constraint that references the table we're - * modifying, we might not yet have any lock on the FK's table, so get - * one now. We'll need AccessExclusiveLock for the DROP CONSTRAINT - * step, so there's no value in asking for anything weaker. + * When rebuilding another table's constraint that references the + * table we're modifying, we might not yet have any lock on the other + * table, so get one now. We'll need AccessExclusiveLock for the DROP + * CONSTRAINT step, so there's no value in asking for anything weaker. */ - if (relid != tab->relid && contype == CONSTRAINT_FOREIGN) + if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); ATPostAlterTypeParse(oldId, relid, confrelid, diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 0e439a6488b..de757a94dab 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -4583,6 +4583,13 @@ alter table attbl alter column p1 set data type bigint; alter table atref alter column c1 set data type bigint; drop table attbl, atref; /* End test case for bug #17409 */ +/* Test case for bug #18970 */ +create table attbl(a int); +create table atref(b attbl check ((b).a is not null)); +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +drop table attbl, atref; +/* End test case for bug #18970 */ -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index d2845abc97a..b4380ca4b9c 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -3020,6 +3020,15 @@ drop table attbl, atref; /* End test case for bug #17409 */ +/* Test case for bug #18970 */ + +create table attbl(a int); +create table atref(b attbl check ((b).a is not null)); +alter table attbl alter column a type numeric; -- someday this should work +drop table attbl, atref; + +/* End test case for bug #18970 */ + -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); From d74231839aa34a242e6e2da1efaf5d6c0013c6b3 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Tue, 1 Jul 2025 13:13:04 +0900 Subject: [PATCH 051/115] Fix typos in comments Commit 19d8e2308bc added enum values with the prefix TU_, but a few comments still referred to TUUI_, which was used in development versions of the patches committed as 19d8e2308bc. Author: Yugo Nagata Discussion: https://postgr.es/m/20250701110216.8ac8a9e4c6f607f1d954f44a@sraoss.co.jp Backpatch-through: 16 --- src/backend/executor/execIndexing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c index 1d82b64b897..a11f43d04e9 100644 --- a/src/backend/executor/execIndexing.c +++ b/src/backend/executor/execIndexing.c @@ -263,7 +263,7 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) * executor is performing an UPDATE that could not use an * optimization like heapam's HOT (in more general terms a * call to table_tuple_update() took place and set - * 'update_indexes' to TUUI_All). Receiving this hint makes + * 'update_indexes' to TU_All). Receiving this hint makes * us consider if we should pass down the 'indexUnchanged' * hint in turn. That's something that we figure out for * each index_insert() call iff 'update' is true. @@ -274,7 +274,7 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) * HOT has been applied and any updated columns are indexed * only by summarizing indexes (or in more general terms a * call to table_tuple_update() took place and set - * 'update_indexes' to TUUI_Summarizing). We can (and must) + * 'update_indexes' to TU_Summarizing). We can (and must) * therefore only update the indexes that have * 'amsummarizing' = true. * From 3a2617e4f0be734f58f7219986c323469b502921 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 1 Jul 2025 12:08:20 -0400 Subject: [PATCH 052/115] Make safeguard against incorrect flags for fsync more portable. The existing code assumed that O_RDONLY is defined as 0, but this is not required by POSIX and is not true on GNU Hurd. We can avoid the assumption by relying on O_ACCMODE to mask the fcntl() result. (Hopefully, all supported platforms define that.) Author: Michael Banck Co-authored-by: Samuel Thibault Reviewed-by: Tom Lane Discussion: https://postgr.es/m/6862e8d1.050a0220.194b8d.76fa@mx.google.com Discussion: https://postgr.es/m/68480868.5d0a0220.1e214d.68a6@mx.google.com Backpatch-through: 13 --- src/backend/storage/file/fd.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 16b3e8f9058..ee91bb79aca 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -375,25 +375,22 @@ pg_fsync(int fd) * portable, even if it runs ok on the current system. * * We assert here that a descriptor for a file was opened with write - * permissions (either O_RDWR or O_WRONLY) and for a directory without - * write permissions (O_RDONLY). + * permissions (i.e., not O_RDONLY) and for a directory without write + * permissions (O_RDONLY). Notice that the assertion check is made even + * if fsync() is disabled. * - * Ignore any fstat errors and let the follow-up fsync() do its work. - * Doing this sanity check here counts for the case where fsync() is - * disabled. + * If fstat() fails, ignore it and let the follow-up fsync() complain. */ if (fstat(fd, &st) == 0) { int desc_flags = fcntl(fd, F_GETFL); - /* - * O_RDONLY is historically 0, so just make sure that for directories - * no write flags are used. - */ + desc_flags &= O_ACCMODE; + if (S_ISDIR(st.st_mode)) - Assert((desc_flags & (O_RDWR | O_WRONLY)) == 0); + Assert(desc_flags == O_RDONLY); else - Assert((desc_flags & (O_RDWR | O_WRONLY)) != 0); + Assert(desc_flags != O_RDONLY); } errno = 0; #endif From d25d392e89440f97bfafc0e80dc7737872659d76 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 1 Jul 2025 12:40:35 -0400 Subject: [PATCH 053/115] Make sure IOV_MAX is defined. We stopped defining IOV_MAX on non-Windows systems in 75357ab94, on the assumption that every non-Windows system defines it in as required by X/Open. GNU Hurd, however, doesn't follow that standard either. Put back the old logic to assume 16 if it's not defined. Author: Michael Banck Co-authored-by: Christoph Berg Reviewed-by: Tom Lane Discussion: https://postgr.es/m/6862e8d1.050a0220.194b8d.76fa@mx.google.com Discussion: https://postgr.es/m/6846e0c3.df0a0220.39ef9b.c60e@mx.google.com Backpatch-through: 16 --- src/include/port/pg_iovec.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h index 689799c4258..5882c5b20f0 100644 --- a/src/include/port/pg_iovec.h +++ b/src/include/port/pg_iovec.h @@ -20,9 +20,6 @@ #else -/* POSIX requires at least 16 as a maximum iovcnt. */ -#define IOV_MAX 16 - /* Define our own POSIX-compatible iovec struct. */ struct iovec { @@ -32,6 +29,15 @@ struct iovec #endif +/* + * If didn't define IOV_MAX, define our own. X/Open requires at + * least 16. (GNU Hurd apparently feel that they're not bound by X/Open, + * because they don't define this symbol at all.) + */ +#ifndef IOV_MAX +#define IOV_MAX 16 +#endif + /* Define a reasonable maximum that is safe to use on the stack. */ #define PG_IOV_MAX Min(IOV_MAX, 32) From d271b04dc64ef34654f7ff2a2bb382c34543ea1e Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 1 Jul 2025 13:54:38 -0500 Subject: [PATCH 054/115] Document pg_get_multixact_members(). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oversight in commit 0ac5ad5134. Author: Sami Imseih Co-authored-by: Álvaro Herrera Reviewed-by: Ashutosh Bapat Discussion: https://postgr.es/m/20150619215231.GT133018%40postgresql.org Discussion: https://postgr.es/m/CAA5RZ0sjQDDwJfMRb%3DZ13nDLuRpF13ME2L_BdGxi0op8RKjmDg%40mail.gmail.com Backpatch-through: 13 --- doc/src/sgml/func.sgml | 28 +++++++++++++++++++++++++++- doc/src/sgml/maintenance.sgml | 5 ++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 15b8a3eaa5d..f4d6d69630e 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25540,6 +25540,31 @@ SELECT collation for ('foo' COLLATE "de_DE"); details. + + + + + pg_get_multixact_members + + pg_get_multixact_members ( multixid xid ) + setof record + ( xid xid, + mode text ) + + + Returns the transaction ID and lock mode for each member of the + specified multixact ID. The lock modes forupd, + fornokeyupd, sh, and + keysh correspond to the row-level locks + FOR UPDATE, FOR NO KEY UPDATE, + FOR SHARE, and FOR KEY SHARE, + respectively, as described in . Two + additional modes are specific to multixacts: + nokeyupd, used by updates that do not modify key + columns, and upd, used by updates or deletes that + modify key columns. + + @@ -25548,7 +25573,8 @@ SELECT collation for ('foo' COLLATE "de_DE"); The internal transaction ID type xid is 32 bits wide and wraps around every 4 billion transactions. However, the functions shown in , except - age and mxid_age, use a + age, mxid_age, and + pg_get_multixact_members, use a 64-bit type xid8 that does not wrap around during the life of an installation and can be converted to xid by casting if required; see for details. diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 895b703a96b..d6d44d74069 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -760,7 +760,10 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. careful aging management, storage cleanup, and wraparound handling. There is a separate storage area which holds the list of members in each multixact, which also uses a 32-bit counter and which must also - be managed. + be managed. The system function + pg_get_multixact_members() described in + can be used to examine the + transaction IDs associated with a multixact ID. From 779f24c0b7be5d66504a30c6d15ab0430bdf59e2 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 1 Jul 2025 22:20:13 +0200 Subject: [PATCH 055/115] Update comment for IndexInfo.ii_NullsNotDistinct Commit 7a7b3e11e61 added the ii_NullsNotDistinct field, but the comment was not updated. Author: Japin Li Reviewed-by: Richard Guo Discussion: https://www.postgresql.org/message-id/flat/ME0P300MB04453E6C7EA635F0ECF41BFCB6832%40ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM --- src/include/nodes/execnodes.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 61a50a847c7..f40cb9bb5ba 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -154,8 +154,9 @@ typedef struct ExprState * UniqueOps These are like Exclusion*, but for unique indexes * UniqueProcs * UniqueStrats - * Unique is it a unique index? * OpclassOptions opclass-specific options, or NULL if none + * Unique is it a unique index? + * NullsNotDistinct is NULLS NOT DISTINCT? * ReadyForInserts is it valid for inserts? * CheckedUnchanged IndexUnchanged status determined yet? * IndexUnchanged aminsert hint, cached for retail inserts From 5c639523f721e9bd6139916200470e151d690728 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 2 Jul 2025 13:48:45 +0900 Subject: [PATCH 056/115] Fix bug in archive streamer with LZ4 decompression When decompressing some input data, the calculation for the initial starting point and the initial size were incorrect, potentially leading to failures when decompressing contents with LZ4. These initialization points are fixed in this commit, bringing the logic closer to what exists for gzip and zstd. The contents of the compressed data is clear (for example backups taken with LZ4 can still be decompressed with a "lz4" command), only the decompression part reading the input data was impacted by this issue. This code path impacts pg_basebackup and pg_verifybackup, which can use the LZ4 decompression routines with an archive streamer, or any tools that try to use the archive streamers in src/fe_utils/. The issue is easier to reproduce with files that have a low-compression rate, like ones filled with random data, for a size of at least 512kB, but this could happen with anything as long as it is stored in a data folder. Some tests are added based on this idea, with a file filled with random bytes grabbed from the backend, written at the root of the data folder. This is proving good enough to reproduce the original problem. Author: Mikhail Gribkov Discussion: https://postgr.es/m/CAMEv5_uQS1Hg6KCaEP2JkrTBbZ-nXQhxomWrhYQvbdzR-zy-wA@mail.gmail.com Backpatch-through: 15 --- src/bin/pg_basebackup/bbstreamer_lz4.c | 4 +-- src/bin/pg_verifybackup/t/008_untar.pl | 24 ++++++++++++++++++ src/bin/pg_verifybackup/t/010_client_untar.pl | 25 +++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 395fcb92795..782f5581559 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -320,9 +320,9 @@ bbstreamer_lz4_decompressor_content(bbstreamer *streamer, mystreamer = (bbstreamer_lz4_frame *) streamer; next_in = (uint8 *) data; - next_out = (uint8 *) mystreamer->base.bbs_buffer.data; + next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written; avail_in = len; - avail_out = mystreamer->base.bbs_buffer.maxlen; + avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written; while (avail_in > 0) { diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 1a783d11883..5bd2e303d2a 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -16,6 +16,22 @@ $primary->init(allows_streaming => 1); $primary->start; +# Create file with some random data and an arbitrary size, useful to check +# the solidity of the compression and decompression logic. The size of the +# file is chosen to be around 640kB. This has proven to be large enough to +# detect some issues related to LZ4, and low enough to not impact the runtime +# of the test significantly. +my $junk_data = $primary->safe_psql( + 'postgres', qq( + SELECT string_agg(encode(sha256(i::text::bytea), 'hex'), '') + FROM generate_series(1, 10240) s(i);)); +my $data_dir = $primary->data_dir; +my $junk_file = "$data_dir/junk"; +open my $jf, '>', $junk_file + or die "Could not create junk file: $!"; +print $jf $junk_data; +close $jf; + my $backup_path = $primary->backup_dir . '/server-backup'; my $extract_path = $primary->backup_dir . '/extracted-backup'; @@ -42,6 +58,14 @@ 'decompress_flags' => [ '-d', '-m' ], 'enabled' => check_pg_config("#define USE_LZ4 1") }, + { + 'compression_method' => 'lz4', + 'backup_flags' => [ '--compress', 'server-lz4:5' ], + 'backup_archive' => 'base.tar.lz4', + 'decompress_program' => $ENV{'LZ4'}, + 'decompress_flags' => [ '-d', '-m' ], + 'enabled' => check_pg_config("#define USE_LZ4 1") + }, { 'compression_method' => 'zstd', 'backup_flags' => [ '--compress', 'server-zstd' ], diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 44d83e777ff..6050da2bf9d 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -15,6 +15,22 @@ $primary->init(allows_streaming => 1); $primary->start; +# Create file with some random data and an arbitrary size, useful to check +# the solidity of the compression and decompression logic. The size of the +# file is chosen to be around 640kB. This has proven to be large enough to +# detect some issues related to LZ4, and low enough to not impact the runtime +# of the test significantly. +my $junk_data = $primary->safe_psql( + 'postgres', qq( + SELECT string_agg(encode(sha256(i::text::bytea), 'hex'), '') + FROM generate_series(1, 10240) s(i);)); +my $data_dir = $primary->data_dir; +my $junk_file = "$data_dir/junk"; +open my $jf, '>', $junk_file + or die "Could not create junk file: $!"; +print $jf $junk_data; +close $jf; + my $backup_path = $primary->backup_dir . '/client-backup'; my $extract_path = $primary->backup_dir . '/extracted-backup'; @@ -42,6 +58,15 @@ 'output_file' => 'base.tar', 'enabled' => check_pg_config("#define USE_LZ4 1") }, + { + 'compression_method' => 'lz4', + 'backup_flags' => [ '--compress', 'client-lz4:1' ], + 'backup_archive' => 'base.tar.lz4', + 'decompress_program' => $ENV{'LZ4'}, + 'decompress_flags' => ['-d'], + 'output_file' => 'base.tar', + 'enabled' => check_pg_config("#define USE_LZ4 1") + }, { 'compression_method' => 'zstd', 'backup_flags' => [ '--compress', 'client-zstd:5' ], From 4ef4b9ba77375221c597f590cde1a1adc10453ca Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Thu, 3 Jul 2025 16:03:19 +0900 Subject: [PATCH 057/115] doc: Remove incorrect note about wal_status in pg_replication_slots. The documentation previously stated that the wal_status column is NULL if restart_lsn is NULL in the pg_replication_slots view. This is incorrect, and wal_status can be "lost" even when restart_lsn is NULL. This commit removes the incorrect description. Back-patched to all supported versions. Author: Fujii Masao Reviewed-by: Nisha Moond Discussion: https://postgr.es/m/c9d23cdc-b5dd-455a-8ee9-f1f24d701d89@oss.nttdata.com Backpatch-through: 13 --- doc/src/sgml/system-views.sgml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index e0b53ad3157..9b8d07b2b71 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -2491,8 +2491,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx The last two states are seen only when is - non-negative. If restart_lsn is NULL, this - field is null. + non-negative. From db51bdf975e28003f08013a12bc46c0848533edc Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Thu, 3 Jul 2025 23:07:23 +0900 Subject: [PATCH 058/115] doc: Update outdated descriptions of wal_status in pg_replication_slots. The documentation for pg_replication_slots previously mentioned only max_slot_wal_keep_size as a condition under which the wal_status column could show unreserved or lost. However, since commit be87200, replication slots can also be invalidated due to horizon or wal_level, and since commit ac0e33136ab, idle_replication_slot_timeout can also trigger this state. This commit updates the description of the wal_status column to reflect that max_slot_wal_keep_size is not the only cause of the lost state. Back-patched to v16, where the additional invalidation cases were introduced. Author: Fujii Masao Reviewed-by: Hayato Kuroda Reviewed-by: Nisha Moond Discussion: https://postgr.es/m/78b34e84-2195-4f28-a151-5d204a382fdd@oss.nttdata.com Backpatch-through: 16 --- doc/src/sgml/system-views.sgml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index 9b8d07b2b71..328bdfdd152 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -2478,20 +2478,18 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx unreserved means that the slot no longer retains the required WAL files and some of them are to be removed at - the next checkpoint. This state can return + the next checkpoint. This typically occurs when + is set to + a non-negative value. This state can return to reserved or extended. - lost means that some required WAL files have - been removed and this slot is no longer usable. + lost means that this slot is no longer usable. - The last two states are seen only when - is - non-negative. From d36980b7159a343ec56baca40bfe6c67765095b7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 3 Jul 2025 13:46:07 -0400 Subject: [PATCH 059/115] Obtain required table lock during cross-table updates, redux. Commits 8319e5cb5 et al missed the fact that ATPostAlterTypeCleanup contains three calls to ATPostAlterTypeParse, and the other two also need protection against passing a relid that we don't yet have lock on. Add similar logic to those code paths, and add some test cases demonstrating the need for it. In v18 and master, the test cases demonstrate that there's a behavioral discrepancy between stored generated columns and virtual generated columns: we disallow changing the expression of a stored column if it's used in any composite-type columns, but not that of a virtual column. Since the expression isn't actually relevant to either sort of composite-type usage, this prohibition seems unnecessary; but changing it is a matter for separate discussion. For now we are just documenting the existing behavior. Reported-by: jian he Author: jian he Reviewed-by: Tom Lane Discussion: CACJufxGKJtGNRRSXfwMW9SqVOPEMdP17BJ7DsBf=tNsv9pWU9g@mail.gmail.com Backpatch-through: 13 --- src/backend/commands/tablecmds.c | 22 ++++++++++++++++++++++ src/test/regress/expected/alter_table.out | 8 ++++++++ src/test/regress/sql/alter_table.sql | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 5252c971eec..016ae0a65f9 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -13561,6 +13561,14 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Oid relid; relid = IndexGetRelation(oldId, false); + + /* + * As above, make sure we have lock on the index's table if it's not + * the same table. + */ + if (relid != tab->relid) + LockRelationOid(relid, AccessExclusiveLock); + ATPostAlterTypeParse(oldId, relid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -13577,6 +13585,20 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Oid relid; relid = StatisticsGetRelation(oldId, false); + + /* + * As above, make sure we have lock on the statistics object's table + * if it's not the same table. However, we take + * ShareUpdateExclusiveLock here, aligning with the lock level used in + * CreateStatistics and RemoveStatisticsById. + * + * CAUTION: this should be done after all cases that grab + * AccessExclusiveLock, else we risk causing deadlock due to needing + * to promote our table lock. + */ + if (relid != tab->relid) + LockRelationOid(relid, ShareUpdateExclusiveLock); + ATPostAlterTypeParse(oldId, relid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index de757a94dab..29b7c305789 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -4588,6 +4588,14 @@ create table attbl(a int); create table atref(b attbl check ((b).a is not null)); alter table attbl alter column a type numeric; -- someday this should work ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +alter table atref drop constraint atref_b_check; +create statistics atref_stat on ((b).a is not null) from atref; +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +drop statistics atref_stat; +create index atref_idx on atref (((b).a)); +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type drop table attbl, atref; /* End test case for bug #18970 */ -- Test that ALTER TABLE rewrite preserves a clustered index diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index b4380ca4b9c..c45f9af17d0 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -3025,6 +3025,14 @@ drop table attbl, atref; create table attbl(a int); create table atref(b attbl check ((b).a is not null)); alter table attbl alter column a type numeric; -- someday this should work +alter table atref drop constraint atref_b_check; + +create statistics atref_stat on ((b).a is not null) from atref; +alter table attbl alter column a type numeric; -- someday this should work +drop statistics atref_stat; + +create index atref_idx on atref (((b).a)); +alter table attbl alter column a type numeric; -- someday this should work drop table attbl, atref; /* End test case for bug #18970 */ From 7e7059abfd2296b8716d2648baea67c445492cce Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 4 Jul 2025 15:10:21 +0900 Subject: [PATCH 060/115] Disable commit timestamps during bootstrap Attempting to use commit timestamps during bootstrapping leads to an assertion failure, that can be reached for example with an initdb -c that enables track_commit_timestamp. It makes little sense to register a commit timestamp for a BootstrapTransactionId, so let's disable the activation of the module in this case. This problem has been independently reported once by each author of this commit. Each author has proposed basically the same patch, relying on IsBootstrapProcessingMode() to skip the use of commit_ts during bootstrap. The test addition is a suggestion by me, and is applied down to v16. Author: Hayato Kuroda Author: Andy Fan Reviewed-by: Bertrand Drouvot Reviewed-by: Fujii Masao Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/OSCPR01MB14966FF9E4C4145F37B937E52F5102@OSCPR01MB14966.jpnprd01.prod.outlook.com Discussion: https://postgr.es/m/87plejmnpy.fsf@163.com Backpatch-through: 13 --- src/backend/access/transam/commit_ts.c | 7 +++++++ src/test/modules/commit_ts/t/001_base.pl | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index b897fabc702..356e5529a3a 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -664,6 +664,13 @@ ActivateCommitTs(void) TransactionId xid; int pageno; + /* + * During bootstrap, we should not register commit timestamps so skip the + * activation in this case. + */ + if (IsBootstrapProcessingMode()) + return; + /* If we've done this already, there's nothing to do */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); if (commitTsShared->commitTsActive) diff --git a/src/test/modules/commit_ts/t/001_base.pl b/src/test/modules/commit_ts/t/001_base.pl index ae3fc5f52d2..90527db6387 100644 --- a/src/test/modules/commit_ts/t/001_base.pl +++ b/src/test/modules/commit_ts/t/001_base.pl @@ -11,8 +11,7 @@ use PostgreSQL::Test::Cluster; my $node = PostgreSQL::Test::Cluster->new('foxtrot'); -$node->init; -$node->append_conf('postgresql.conf', 'track_commit_timestamp = on'); +$node->init(extra => [ '-c', "track_commit_timestamp=on" ]); $node->start; # Create a table, compare "now()" to the commit TS of its xmin From f63e408e894c855775d1bd3224890cb618fd3894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Fri, 4 Jul 2025 18:05:43 +0200 Subject: [PATCH 061/115] pg_upgrade: check for inconsistencies in not-null constraints w/inheritance With tables defined like this, CREATE TABLE ip (id int PRIMARY KEY); CREATE TABLE ic (id int) INHERITS (ip); ALTER TABLE ic ALTER id DROP NOT NULL; pg_upgrade fails during the schema restore phase due to this error: ERROR: column "id" in child table must be marked NOT NULL This can only be fixed by marking the child column as NOT NULL before the upgrade, which could take an arbitrary amount of time (because ic's data must be scanned). Have pg_upgrade's check mode warn if that condition is found, so that users know what to adjust before running the upgrade for real. Author: Ali Akbar Reviewed-by: Justin Pryzby Backpatch-through: 13 Discussion: https://postgr.es/m/CACQjQLoMsE+1pyLe98pi0KvPG2jQQ94LWJ+PTiLgVRK4B=i_jg@mail.gmail.com --- src/bin/pg_upgrade/check.c | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index f1cd14ec9b1..ed03fcecbca 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -23,6 +23,7 @@ static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster); static void check_for_user_defined_postfix_ops(ClusterInfo *cluster); static void check_for_incompatible_polymorphics(ClusterInfo *cluster); static void check_for_tables_with_oids(ClusterInfo *cluster); +static void check_for_not_null_inheritance(ClusterInfo *cluster); static void check_for_composite_data_type_usage(ClusterInfo *cluster); static void check_for_reg_data_type_usage(ClusterInfo *cluster); static void check_for_aclitem_data_type_usage(ClusterInfo *cluster); @@ -154,6 +155,13 @@ check_and_dump_old_cluster(bool live_check) if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100) check_for_tables_with_oids(&old_cluster); + /* + * Pre-PG 18 allowed child tables to omit not-null constraints that their + * parents columns have, but schema restore fails for them. Verify there + * are none. + */ + check_for_not_null_inheritance(&old_cluster); + /* * PG 12 changed the 'sql_identifier' type storage to be based on name, * not varchar, which breaks on-disk format for existing data. So we need @@ -1097,6 +1105,84 @@ check_for_tables_with_oids(ClusterInfo *cluster) check_ok(); } +/* + * check_for_not_null_inheritance() + * + * An attempt to create child tables lacking not-null constraints that are + * present in their parents errors out. This can no longer occur since 18, + * but previously there were various ways for that to happen. Check that + * the cluster to be upgraded doesn't have any of those problems. + */ +static void +check_for_not_null_inheritance(ClusterInfo *cluster) +{ + FILE *script = NULL; + char output_path[MAXPGPATH]; + int ntup; + + prep_status("Checking for not-null constraint inconsistencies"); + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "not_null_inconsistent_columns.txt"); + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + PGresult *res; + bool db_used = false; + int i_nspname, + i_relname, + i_attname; + DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum]; + PGconn *conn = connectToServer(&old_cluster, active_db->db_name); + + res = executeQueryOrDie(conn, + "SELECT cc.relnamespace::pg_catalog.regnamespace AS nspname, " + " cc.relname, ac.attname " + "FROM pg_catalog.pg_inherits i, pg_catalog.pg_attribute ac, " + " pg_catalog.pg_attribute ap, pg_catalog.pg_class cc " + "WHERE cc.oid = ac.attrelid AND i.inhrelid = ac.attrelid " + " AND i.inhparent = ap.attrelid AND ac.attname = ap.attname " + " AND ap.attnum > 0 and ap.attnotnull AND NOT ac.attnotnull"); + + ntup = PQntuples(res); + i_nspname = PQfnumber(res, "nspname"); + i_relname = PQfnumber(res, "relname"); + i_attname = PQfnumber(res, "attname"); + for (int i = 0; i < ntup; i++) + { + if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + if (!db_used) + { + fprintf(script, "In database: %s\n", active_db->db_name); + db_used = true; + } + + fprintf(script, " %s.%s.%s\n", + PQgetvalue(res, i, i_nspname), + PQgetvalue(res, i, i_relname), + PQgetvalue(res, i, i_attname)); + } + + PQclear(res); + PQfinish(conn); + } + + if (script) + { + fclose(script); + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains inconsistent NOT NULL constraints.\n" + "If the parent column(s) are NOT NULL, then the child column must\n" + "also be marked NOT NULL, or the upgrade will fail.\n" + "You can fix this by running\n" + " ALTER TABLE tablename ALTER column SET NOT NULL;\n" + "on each column listed in the file:\n" + " %s", output_path); + } + else + check_ok(); +} /* * check_for_composite_data_type_usage() From f943e2339f6c13730367ed826f0c496a00953a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Fri, 4 Jul 2025 21:30:05 +0200 Subject: [PATCH 062/115] Fix new pg_upgrade query not to rely on regnamespace That was invented in 9.5, and pg_upgrade claims to support back to 9.0. But we don't need that with a simple query change, tested by Tom Lane. Discussion: https://postgr.es/m/202507041645.afjl5rssvrgu@alvherre.pgsql --- src/bin/pg_upgrade/check.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index ed03fcecbca..0aee919c44a 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -1136,12 +1136,13 @@ check_for_not_null_inheritance(ClusterInfo *cluster) PGconn *conn = connectToServer(&old_cluster, active_db->db_name); res = executeQueryOrDie(conn, - "SELECT cc.relnamespace::pg_catalog.regnamespace AS nspname, " - " cc.relname, ac.attname " + "SELECT nspname, cc.relname, ac.attname " "FROM pg_catalog.pg_inherits i, pg_catalog.pg_attribute ac, " - " pg_catalog.pg_attribute ap, pg_catalog.pg_class cc " + " pg_catalog.pg_attribute ap, pg_catalog.pg_class cc, " + " pg_catalog.pg_namespace nc " "WHERE cc.oid = ac.attrelid AND i.inhrelid = ac.attrelid " " AND i.inhparent = ap.attrelid AND ac.attname = ap.attname " + " AND cc.relnamespace = nc.oid " " AND ap.attnum > 0 and ap.attnotnull AND NOT ac.attnotnull"); ntup = PQntuples(res); From d24a96ce2cdb9260d71d7a655f95758a077e0e9d Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 7 Jul 2025 08:54:39 +0900 Subject: [PATCH 063/115] Fix incompatibility with libxml2 >= 2.14 libxml2 has deprecated the members of xmlBuffer, and it is recommended to access them with dedicated routines. We have only one case in the tree where this shows an impact: xml2/xpath.c where "content" was getting directly accessed. The rest of the code looked fine, checking the PostgreSQL code with libxml2 close to the top of its "2.14" branch. xmlBufferContent() exists since year 2000 based on a check of the upstream libxml2 tree, so let's switch to it. Like 400928b83bd2, backpatch all the way down as this can have an impact on all the branches already released once newer versions of libxml2 get more popular. Reported-by: Walid Ibrahim Reviewed-by: Tom Lane Discussion: https://postgr.es/m/aGdSdcR4QTjEHX6s@paquier.xyz Backpatch-through: 13 --- contrib/xml2/xpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 212cb74aa22..94bb31434c8 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -174,7 +174,7 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset, xmlBufferWriteCHAR(buf, toptagname); xmlBufferWriteChar(buf, ">"); } - result = xmlStrdup(buf->content); + result = xmlStrdup(xmlBufferContent(buf)); xmlBufferFree(buf); return result; } From 3bbc1c4a73384bee6af6ec0c28875d2576c0d2ca Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 7 Jul 2025 14:33:20 -0400 Subject: [PATCH 064/115] Restore the ability to run pl/pgsql expression queries in parallel. pl/pgsql's notion of an "expression" is very broad, encompassing any SQL SELECT query that returns a single column and no more than one row. So there are cases, for example evaluation of an aggregate function, where the query involves significant work and it'd be useful to run it with parallel workers. This used to be possible, but commits 3eea7a0c9 et al unintentionally disabled it. The simplest fix is to make exec_eval_expr() pass maxtuples = 0 rather than 2 to exec_run_select(). This avoids the new rule that we will never use parallelism when a nonzero "count" limit is passed to ExecutorRun(). (Note that the pre-3eea7a0c9 behavior was indeed unsafe, so reverting that rule is not in the cards.) The reason for passing 2 before was that exec_eval_expr() will throw an error if it gets more than one returned row, so we figured that as soon as we have two rows we know that will happen and we might as well stop running the query. That choice was cost-free when it was made; but disabling parallelism is far from cost-free, so now passing 2 amounts to optimizing a failure case at the expense of useful cases. An expression query that can return more than one row is certainly broken. People might now need to wait a bit longer to discover such breakage; but hopefully few will use enormously expensive cases as their first test of new pl/pgsql logic. Author: Dipesh Dhameliya Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CABgZEgdfbnq9t6xXJnmXbChNTcWFjeM_6nuig41tm327gYi2ig@mail.gmail.com Backpatch-through: 13 --- src/pl/plpgsql/src/pl_exec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 0394da0a1c0..56190698b43 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -5709,7 +5709,7 @@ exec_eval_expr(PLpgSQL_execstate *estate, /* * Else do it the hard way via exec_run_select */ - rc = exec_run_select(estate, expr, 2, NULL); + rc = exec_run_select(estate, expr, 0, NULL); if (rc != SPI_OK_SELECT) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -5763,6 +5763,10 @@ exec_eval_expr(PLpgSQL_execstate *estate, /* ---------- * exec_run_select Execute a select query + * + * Note: passing maxtuples different from 0 ("return all tuples") is + * deprecated because it will prevent parallel execution of the query. + * However, we retain the parameter in case we need it someday. * ---------- */ static int From abb517d619c35cedb13e0c593dcd4cc4219f3aff Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 8 Jul 2025 12:50:19 -0400 Subject: [PATCH 065/115] Fix low-probability memory leak in XMLSERIALIZE(... INDENT). xmltotext_with_options() did not consider the possibility that pg_xml_init() could fail --- most likely due to OOM. If that happened, the already-parsed xmlDoc structure would be leaked. Oversight in commit 483bdb2af. Bug: #18981 Author: Dmitry Kovalenko Reviewed-by: Tom Lane Discussion: https://postgr.es/m/18981-9bc3c80f107ae925@postgresql.org Backpatch-through: 16 --- src/backend/utils/adt/xml.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 55154e0261e..4063869e56f 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -642,7 +642,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) volatile xmlBufferPtr buf = NULL; volatile xmlSaveCtxtPtr ctxt = NULL; ErrorSaveContext escontext = {T_ErrorSaveContext}; - PgXmlErrorContext *xmlerrcxt; + PgXmlErrorContext *volatile xmlerrcxt = NULL; #endif if (xmloption_arg != XMLOPTION_DOCUMENT && !indent) @@ -683,13 +683,18 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) return (text *) data; } - /* Otherwise, we gotta spin up some error handling. */ - xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL); - + /* + * Otherwise, we gotta spin up some error handling. Unlike most other + * routines in this module, we already have a libxml "doc" structure to + * free, so we need to call pg_xml_init() inside the PG_TRY and be + * prepared for it to fail (typically due to palloc OOM). + */ PG_TRY(); { size_t decl_len = 0; + xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL); + /* The serialized data will go into this buffer. */ buf = xmlBufferCreate(); @@ -817,10 +822,10 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) xmlSaveClose(ctxt); if (buf) xmlBufferFree(buf); - if (doc) - xmlFreeDoc(doc); + xmlFreeDoc(doc); - pg_xml_done(xmlerrcxt, true); + if (xmlerrcxt) + pg_xml_done(xmlerrcxt, true); PG_RE_THROW(); } From d69836b13c467fb64663f8d1f6d0ed976cc7824e Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Wed, 9 Jul 2025 05:45:26 -0700 Subject: [PATCH 066/115] Fix tab-completion for COPY and \copy options. Commit c273d9d8ce4 reworked tab-completion of COPY and \copy in psql and added support for completing options within WITH clauses. However, the same COPY options were suggested for both COPY TO and COPY FROM commands, even though some options are only valid for one or the other. This commit separates the COPY options for COPY FROM and COPY TO commands to provide more accurate auto-completion suggestions. Back-patch to v14 where tab-completion for COPY and \copy options within WITH clauses was first supported. Author: Atsushi Torikoshi Reviewed-by: Yugo Nagata Discussion: https://postgr.es/m/079e7a2c801f252ae8d522b772790ed7@oss.nttdata.com Backpatch-through: 14 --- src/bin/psql/tab-complete.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index a1aa946b300..23d89d0720f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1164,6 +1164,18 @@ Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \ Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \ "STRICT", "SUPPORT" +/* COPY options shared between FROM and TO */ +#define Copy_common_options \ +"DELIMITER", "ENCODING", "ESCAPE", "FORMAT", "HEADER", "NULL", "QUOTE" + +/* COPY FROM options */ +#define Copy_from_options \ +Copy_common_options, "DEFAULT", "FORCE_NOT_NULL", "FORCE_NULL", "FREEZE" + +/* COPY TO options */ +#define Copy_to_options \ +Copy_common_options, "FORCE_QUOTE" + /* * These object types were introduced later than our support cutoff of * server version 9.2. We use the VersionedQuery infrastructure so that @@ -2854,11 +2866,13 @@ psql_completion(const char *text, int start, int end) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny)) COMPLETE_WITH("WITH (", "WHERE"); - /* Complete COPY FROM|TO filename WITH ( */ - else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(")) - COMPLETE_WITH("FORMAT", "FREEZE", "DELIMITER", "NULL", - "HEADER", "QUOTE", "ESCAPE", "FORCE_QUOTE", - "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING", "DEFAULT"); + /* Complete COPY FROM filename WITH ( */ + else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(")) + COMPLETE_WITH(Copy_from_options); + + /* Complete COPY TO filename WITH ( */ + else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny, "WITH", "(")) + COMPLETE_WITH(Copy_to_options); /* Complete COPY FROM|TO filename WITH (FORMAT */ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "FORMAT")) From 53a936b61f12cd9220340abc1a7843eb003d1abf Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 11 Jul 2025 18:50:13 -0400 Subject: [PATCH 067/115] Fix inconsistent quoting of role names in ACLs. getid() and putid(), which parse and deparse role names within ACL input/output, applied isalnum() to see if a character within a role name requires quoting. They did this even for non-ASCII characters, which is problematic because the results would depend on encoding, locale, and perhaps even platform. So it's possible that putid() could elect not to quote some string that, later in some other environment, getid() will decide is not a valid identifier, causing dump/reload or similar failures. To fix this in a way that won't risk interoperability problems with unpatched versions, make getid() treat any non-ASCII as a legitimate identifier character (hence not requiring quotes), while making putid() treat any non-ASCII as requiring quoting. We could remove the resulting excess quoting once we feel that no unpatched servers remain in the wild, but that'll be years. A lesser problem is that getid() did the wrong thing with an input consisting of just two double quotes (""). That has to represent an empty string, but getid() read it as a single double quote instead. The case cannot arise in the normal course of events, since we don't allow empty-string role names. But let's fix it while we're here. Although we've not heard field reports of problems with non-ASCII role names, there's clearly a hazard there, so back-patch to all supported versions. Reported-by: Peter Eisentraut Author: Tom Lane Discussion: https://postgr.es/m/3792884.1751492172@sss.pgh.pa.us Backpatch-through: 13 --- src/backend/utils/adt/acl.c | 33 ++++++++++++++++++------ src/test/regress/expected/privileges.out | 20 ++++++++++++++ src/test/regress/sql/privileges.sql | 8 ++++++ 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 883e09393a4..d2278374d97 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -124,6 +124,22 @@ static AclResult pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode); static void RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue); +/* + * Test whether an identifier char can be left unquoted in ACLs. + * + * Formerly, we used isalnum() even on non-ASCII characters, resulting in + * unportable behavior. To ensure dump compatibility with old versions, + * we now treat high-bit-set characters as always requiring quoting during + * putid(), but getid() will always accept them without quotes. + */ +static inline bool +is_safe_acl_char(unsigned char c, bool is_getid) +{ + if (IS_HIGHBIT_SET(c)) + return is_getid; + return isalnum(c) || c == '_'; +} + /* * getid * Consumes the first alphanumeric string (identifier) found in string @@ -149,21 +165,22 @@ getid(const char *s, char *n, Node *escontext) while (isspace((unsigned char) *s)) s++; - /* This code had better match what putid() does, below */ for (; *s != '\0' && - (isalnum((unsigned char) *s) || - *s == '_' || - *s == '"' || - in_quotes); + (in_quotes || *s == '"' || is_safe_acl_char(*s, true)); s++) { if (*s == '"') { + if (!in_quotes) + { + in_quotes = true; + continue; + } /* safe to look at next char (could be '\0' though) */ if (*(s + 1) != '"') { - in_quotes = !in_quotes; + in_quotes = false; continue; } /* it's an escaped double quote; skip the escaping char */ @@ -197,10 +214,10 @@ putid(char *p, const char *s) const char *src; bool safe = true; + /* Detect whether we need to use double quotes */ for (src = s; *src; src++) { - /* This test had better match what getid() does, above */ - if (!isalnum((unsigned char) *src) && *src != '_') + if (!is_safe_acl_char(*src, false)) { safe = false; break; diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 620fbe8c522..99daf089e30 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -2332,6 +2332,26 @@ SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, 'SELECT, fake_privilege', FALSE); -- error ERROR: unrecognized privilege type: "fake_privilege" +-- Test quoting and dequoting of user names in ACLs +CREATE ROLE "regress_""quoted"; +SELECT makeaclitem('regress_"quoted'::regrole, 'regress_"quoted'::regrole, + 'SELECT', TRUE); + makeaclitem +------------------------------------------ + "regress_""quoted"=r*/"regress_""quoted" +(1 row) + +SELECT '"regress_""quoted"=r*/"regress_""quoted"'::aclitem; + aclitem +------------------------------------------ + "regress_""quoted"=r*/"regress_""quoted" +(1 row) + +SELECT '""=r*/""'::aclitem; -- used to be misparsed as """" +ERROR: a name must follow the "/" sign +LINE 1: SELECT '""=r*/""'::aclitem; + ^ +DROP ROLE "regress_""quoted"; -- Test non-throwing aclitem I/O SELECT pg_input_is_valid('regress_priv_user1=r/regress_priv_user2', 'aclitem'); pg_input_is_valid diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 259f1aedd1b..d84b4041e8b 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -1481,6 +1481,14 @@ SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, 'SELECT, fake_privilege', FALSE); -- error +-- Test quoting and dequoting of user names in ACLs +CREATE ROLE "regress_""quoted"; +SELECT makeaclitem('regress_"quoted'::regrole, 'regress_"quoted'::regrole, + 'SELECT', TRUE); +SELECT '"regress_""quoted"=r*/"regress_""quoted"'::aclitem; +SELECT '""=r*/""'::aclitem; -- used to be misparsed as """" +DROP ROLE "regress_""quoted"; + -- Test non-throwing aclitem I/O SELECT pg_input_is_valid('regress_priv_user1=r/regress_priv_user2', 'aclitem'); SELECT pg_input_is_valid('regress_priv_user1=r/', 'aclitem'); From 2e7390928e80fe1e7bfd581724f7dcce3d27197d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 15 Jul 2025 16:35:42 -0400 Subject: [PATCH 068/115] Doc: clarify description of current-date/time functions. Minor wordsmithing of the func.sgml paragraph describing statement_timestamp() and allied functions: don't switch between "statement" and "command" when those are being used to mean about the same thing. Also, add some text to protocol.sgml describing the perhaps-surprising behavior these functions have in a multi-statement Query message. Reported-by: P M Author: Tom Lane Reviewed-by: Laurenz Albe Reviewed-by: David G. Johnston Discussion: https://postgr.es/m/175223006802.3157505.14764328206246105568@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/func.sgml | 6 +++--- doc/src/sgml/protocol.sgml | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index f4d6d69630e..4faa7782dce 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -10802,10 +10802,10 @@ now() statement (more specifically, the time of receipt of the latest command message from the client). statement_timestamp() and transaction_timestamp() - return the same value during the first command of a transaction, but might - differ during subsequent commands. + return the same value during the first statement of a transaction, but might + differ during subsequent statements. clock_timestamp() returns the actual current time, and - therefore its value changes even within a single SQL command. + therefore its value changes even within a single SQL statement. timeofday() is a historical PostgreSQL function. Like clock_timestamp(), it returns the actual current time, diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 14203572ea7..c3df074bc3a 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -800,6 +800,16 @@ SELCT 1/0; Errors detected at semantic analysis or later, such as a misspelled table or column name, do not have this effect. + + + Lastly, note that all the statements within the Query message will + observe the same value of statement_timestamp(), + since that timestamp is updated only upon receipt of the Query + message. This will result in them all observing the same + value of transaction_timestamp() as well, + except in cases where the query string ends a previously-started + transaction and begins a new one. + From 5db55e13f2109c578f6fe0fce49574d801eef739 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 15 Jul 2025 18:11:18 -0400 Subject: [PATCH 069/115] Silence uninitialized-value warnings in compareJsonbContainers(). Because not every path through JsonbIteratorNext() sets val->type, some compilers complain that compareJsonbContainers() is comparing possibly-uninitialized values. The paths that don't set it return WJB_DONE, WJB_END_ARRAY, or WJB_END_OBJECT, so it's clear by manual inspection that the "(ra == rb)" code path is safe, and indeed we aren't seeing warnings about that. But the (ra != rb) case is much less obviously safe. In Assert-enabled builds it seems that the asserts rejecting WJB_END_ARRAY and WJB_END_OBJECT persuade gcc 15.x not to warn, which makes little sense because it's impossible to believe that the compiler can prove of its own accord that ra/rb aren't WJB_DONE here. (In fact they never will be, so the code isn't wrong, but why is there no warning?) Without Asserts, the appearance of warnings is quite unsurprising. We discussed fixing this by converting those two Asserts into pg_assume, but that seems not very satisfactory when it's so unclear why the compiler is or isn't warning: the warning could easily reappear with some other compiler version. Let's fix it in a less magical, more future-proof way by changing JsonbIteratorNext() so that it always does set val->type. The cost of that should be pretty negligible, and it makes the function's API spec less squishy. Reported-by: Erik Rijkers Author: Tom Lane Reviewed-by: Andres Freund Discussion: https://postgr.es/m/988bf1bc-3f1f-99f3-bf98-222f1cd9dc5e@xs4all.nl Discussion: https://postgr.es/m/0c623e8a204187b87b4736792398eaf1@postgrespro.ru Backpatch-through: 13 --- src/backend/utils/adt/jsonb_util.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 9cc95b773db..2854cc0bc0c 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -272,9 +272,6 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b) else { /* - * It's safe to assume that the types differed, and that the va - * and vb values passed were set. - * * If the two values were of the same container type, then there'd * have been a chance to observe the variation in the number of * elements/pairs (when processing WJB_BEGIN_OBJECT, say). They're @@ -847,15 +844,20 @@ JsonbIteratorInit(JsonbContainer *container) * It is our job to expand the jbvBinary representation without bothering them * with it. However, clients should not take it upon themselves to touch array * or Object element/pair buffers, since their element/pair pointers are - * garbage. Also, *val will not be set when returning WJB_END_ARRAY or - * WJB_END_OBJECT, on the assumption that it's only useful to access values - * when recursing in. + * garbage. + * + * *val is not meaningful when the result is WJB_DONE, WJB_END_ARRAY or + * WJB_END_OBJECT. However, we set val->type = jbvNull in those cases, + * so that callers may assume that val->type is always well-defined. */ JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) { if (*it == NULL) + { + val->type = jbvNull; return WJB_DONE; + } /* * When stepping into a nested container, we jump back here to start @@ -893,6 +895,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) * nesting). */ *it = freeAndGetParent(*it); + val->type = jbvNull; return WJB_END_ARRAY; } @@ -946,6 +949,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) * of nesting). */ *it = freeAndGetParent(*it); + val->type = jbvNull; return WJB_END_OBJECT; } else @@ -990,8 +994,10 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) return WJB_VALUE; } - elog(ERROR, "invalid iterator state"); - return -1; + elog(ERROR, "invalid jsonb iterator state"); + /* satisfy compilers that don't know that elog(ERROR) doesn't return */ + val->type = jbvNull; + return WJB_DONE; } /* From ff6783ce526031fe9134f4d2139a78f9fd52d3d5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 15 Jul 2025 18:53:00 -0400 Subject: [PATCH 070/115] Doc: clarify description of regexp fields in pg_ident.conf. The grammar was a little shaky and confusing here, so word-smith it a bit. Also, adjust the comments in pg_ident.conf.sample to use the same terminology as the SGML docs, in particular "DATABASE-USERNAME" not "PG-USERNAME". Back-patch appropriate subsets. I did not risk changing pg_ident.conf.sample in released branches, but it still seems OK to change it in v18. Reported-by: Alexey Shishkin Author: Tom Lane Reviewed-by: David G. Johnston Discussion: https://postgr.es/m/175206279327.3157504.12519088928605422253@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/client-auth.sgml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 37ded4ba879..661a25790f4 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -962,8 +962,9 @@ local db1,db2,@demodbs all md5 the remainder of the field is treated as a regular expression. (See for details of PostgreSQL's regular expression syntax.) The regular - expression can include a single capture, or parenthesized subexpression, - which can then be referenced in the database-username + expression can include a single capture, or parenthesized subexpression. + The portion of the system user name that matched the capture can then + be referenced in the database-username field as \1 (backslash-one). This allows the mapping of multiple user names in a single line, which is particularly useful for simple syntax substitutions. For example, these entries @@ -981,12 +982,11 @@ mymap /^(.*)@otherdomain\.com$ guest If the database-username field starts with a slash (/), the remainder of the field is treated - as a regular expression (see - for details of PostgreSQL's regular - expression syntax). It is not possible to use \1 - to use a capture from regular expression on - system-username for a regular expression - on database-username. + as a regular expression. + When the database-username field is a regular + expression, it is not possible to use \1 within it to + refer to a capture from the system-username + field. From e92573917a49ce7d8d0cb5f996813500945616ee Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Wed, 16 Jul 2025 08:32:52 +0900 Subject: [PATCH 071/115] doc: Fix confusing description of streaming option in START_REPLICATION. Previously, the documentation described the streaming option as a boolean, which is outdated since it's no longer a boolean as of protocol version 4. This could confuse users. This commit updates the description to remove the "boolean" reference and clearly list the valid values for the streaming option. Back-patch to v16, where the streaming option changed to a non-boolean. Author: Euler Taveira Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/8d21fb98-5c25-4dee-8387-e5a62b01ea7d@app.fastmail.com Backpatch-through: 16 --- doc/src/sgml/protocol.sgml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index c3df074bc3a..d23f3d407d4 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -3178,11 +3178,13 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" - Boolean option to enable streaming of in-progress transactions. - It accepts an additional value "parallel" to enable sending extra - information with some messages to be used for parallelisation. - Minimum protocol version 2 is required to turn it on. Minimum protocol - version 4 is required for the "parallel" option. + Option to enable streaming of in-progress transactions. Valid values are + off (the default), on and + parallel. The setting parallel + enables sending extra information with some messages to be used for + parallelization. Minimum protocol version 2 is required to turn it + on. Minimum protocol version 4 is required for the + parallel value. From 738ad9a53891646edcc4333b3918624dcf317028 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 16 Jul 2025 11:50:34 -0500 Subject: [PATCH 072/115] psql: Fix note on project naming in output of \copyright. This adjusts the wording to match the changes in commits 5987553fde, a233a603ba, and pgweb commit 2d764dbc08. Reviewed-by: Tom Lane Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/aHVo791guQR6uqwT%40nathan Backpatch-through: 13 --- src/bin/psql/help.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 14538bf3a7b..b5c192c3cdd 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -755,7 +755,7 @@ void print_copyright(void) { puts("PostgreSQL Database Management System\n" - "(formerly known as Postgres, then as Postgres95)\n\n" + "(also known as Postgres, formerly known as Postgres95)\n\n" "Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group\n\n" "Portions Copyright (c) 1994, The Regents of the University of California\n\n" "Permission to use, copy, modify, and distribute this software and its\n" From cef998ef8314ea88db15b66f21ac000c9d0c248c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Wed, 16 Jul 2025 19:22:53 +0200 Subject: [PATCH 073/115] Fix dumping of comments on invalid constraints on domains We skip dumping constraints together with domains if they are invalid ('separate') so that they appear after data -- but their comments were dumped together with the domain definition, which in effect leads to the comment being dumped when the constraint does not yet exist. Delay them in the same way. Oversight in 7eca575d1c28; backpatch all the way back. Author: jian he Discussion: https://postgr.es/m/CACJufxF_C2pe6J_+nPr6C5jf5rQnbYP8XOKr4HM8yHZtp2aQqQ@mail.gmail.com --- src/bin/pg_dump/pg_dump.c | 23 ++++++++++++++++++++++- src/test/regress/expected/constraints.out | 4 ++++ src/test/regress/sql/constraints.sql | 6 ++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 2001d28b49f..aa216d71456 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -11330,8 +11330,13 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) for (i = 0; i < tyinfo->nDomChecks; i++) { ConstraintInfo *domcheck = &(tyinfo->domChecks[i]); - PQExpBuffer conprefix = createPQExpBuffer(); + PQExpBuffer conprefix; + /* but only if the constraint itself was dumped here */ + if (domcheck->separate) + continue; + + conprefix = createPQExpBuffer(); appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN", fmtId(domcheck->dobj.name)); @@ -16987,6 +16992,22 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) .section = SECTION_POST_DATA, .createStmt = q->data, .dropStmt = delq->data)); + + if (coninfo->dobj.dump & DUMP_COMPONENT_COMMENT) + { + PQExpBuffer conprefix = createPQExpBuffer(); + char *qtypname = pg_strdup(fmtId(tyinfo->dobj.name)); + + appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN", + fmtId(coninfo->dobj.name)); + + dumpComment(fout, conprefix->data, qtypname, + tyinfo->dobj.namespace->dobj.name, + tyinfo->rolname, + coninfo->dobj.catId, 0, tyinfo->dobj.dumpId); + destroyPQExpBuffer(conprefix); + free(qtypname); + } } } else diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out index cf0b80d6169..a5b5795e587 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -830,3 +830,7 @@ DROP TABLE constraint_comments_tbl; DROP DOMAIN constraint_comments_dom; DROP ROLE regress_constraint_comments; DROP ROLE regress_constraint_comments_noaccess; +-- Leave some constraints for the pg_upgrade test to pick up +CREATE DOMAIN constraint_comments_dom AS int; +ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID; +COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint'; diff --git a/src/test/regress/sql/constraints.sql b/src/test/regress/sql/constraints.sql index e3e3bea7091..c47db9469f5 100644 --- a/src/test/regress/sql/constraints.sql +++ b/src/test/regress/sql/constraints.sql @@ -632,3 +632,9 @@ DROP DOMAIN constraint_comments_dom; DROP ROLE regress_constraint_comments; DROP ROLE regress_constraint_comments_noaccess; + +-- Leave some constraints for the pg_upgrade test to pick up +CREATE DOMAIN constraint_comments_dom AS int; + +ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID; +COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint'; From 246388618cee6b1005291267424ac67bd83496ac Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 17 Jul 2025 00:21:18 +0200 Subject: [PATCH 074/115] doc: Add example file for COPY The paragraph for introducing INSERT and COPY discussed how a file could be used for bulk loading with COPY, without actually showing what the file would look like. This adds a programlisting for the file contents. Backpatch to all supported branches since this example has lacked the file contents since PostgreSQL 7.2. Author: Daniel Gustafsson Reviewed-by: Fujii Masao Reviewed-by: Tom Lane Discussion: https://postgr.es/m/158017814191.19852.15019251381150731439@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/query.sgml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/query.sgml b/doc/src/sgml/query.sgml index 59962d6e856..bec8a52a589 100644 --- a/doc/src/sgml/query.sgml +++ b/doc/src/sgml/query.sgml @@ -264,8 +264,18 @@ COPY weather FROM '/home/user/weather.txt'; where the file name for the source file must be available on the machine running the backend process, not the client, since the backend process - reads the file directly. You can read more about the - COPY command in . + reads the file directly. The data inserted above into the weather table + could also be inserted from a file containing (values are separated by a + tab character): + + +San Francisco 46 50 0.25 1994-11-27 +San Francisco 43 57 0.0 1994-11-29 +Hayward 37 54 \N 1994-11-29 + + + You can read more about the COPY command in + . From 4871c1e9cb6e1a085f68c3c399dc4ba95d108524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Thu, 17 Jul 2025 17:40:22 +0200 Subject: [PATCH 075/115] Remove assertion from PortalRunMulti MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We have an assertion to ensure that a command tag has been assigned by the time we're done executing, but if we happen to execute a command with no queries, the assertion would fail. Per discussion, rather than contort things to get a tag assigned, just remove the assertion. Oversight in 2f9661311b83. That commit also retained a comment that explained logic that had been adjacent to it but diffused into various places, leaving none apt to keep part of the comment. Remove that part, and rewrite what remains for extra clarity. Bug: #18984 Backpatch-through: 13 Reported-by: Aleksander Alekseev Reviewed-by: Tom Lane Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/18984-0f4778a6599ac3ae@postgresql.org --- src/backend/tcop/pquery.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 3a20feb867f..5673f466bd6 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -1353,24 +1353,15 @@ PortalRunMulti(Portal portal, PopActiveSnapshot(); /* - * If a query completion data was supplied, use it. Otherwise use the - * portal's query completion data. - * - * Exception: Clients expect INSERT/UPDATE/DELETE tags to have counts, so - * fake them with zeros. This can happen with DO INSTEAD rules if there - * is no replacement query of the same type as the original. We print "0 - * 0" here because technically there is no query of the matching tag type, - * and printing a non-zero count for a different query type seems wrong, - * e.g. an INSERT that does an UPDATE instead should not print "0 1" if - * one row was updated. See QueryRewrite(), step 3, for details. + * If a command tag was requested and we did not fill in a run-time- + * determined tag above, copy the parse-time tag from the Portal. (There + * might not be any tag there either, in edge cases such as empty prepared + * statements. That's OK.) */ - if (qc && qc->commandTag == CMDTAG_UNKNOWN) - { - if (portal->qc.commandTag != CMDTAG_UNKNOWN) - CopyQueryCompletion(qc, &portal->qc); - /* If the caller supplied a qc, we should have set it by now. */ - Assert(qc->commandTag != CMDTAG_UNKNOWN); - } + if (qc && + qc->commandTag == CMDTAG_UNKNOWN && + portal->qc.commandTag != CMDTAG_UNKNOWN) + CopyQueryCompletion(qc, &portal->qc); } /* From 009c20a3da5a960367c007ddb5187034a904705b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 17 Jul 2025 12:46:38 -0400 Subject: [PATCH 076/115] Fix PQport to never return NULL unless the connection is NULL. This is the documented behavior, and it worked that way before v10. However, addition of the connhost[] array created cases where conn->connhost[conn->whichhost].port is NULL. The rest of libpq is careful to substitute DEF_PGPORT[_STR] for a null or empty port string, but we failed to do so here, leading to possibly returning NULL. As of v18 that causes psql's \conninfo command to segfault. Older psql versions avoid that, but it's pretty likely that other clients have trouble with this, so we'd better back-patch the fix. In stable branches, just revert to our historical behavior of returning an empty string when there was no user-given port specification. However, it seems substantially more useful and indeed more correct to hand back DEF_PGPORT_STR in such cases, so let's make v18 and master do that. Author: Daniele Varrazzo Reviewed-by: Laurenz Albe Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CA+mi_8YTS8WPZPO0PAb2aaGLwHuQ0DEQRF0ZMnvWss4y9FwDYQ@mail.gmail.com Backpatch-through: 13 --- src/interfaces/libpq/fe-connect.c | 4 +++- src/interfaces/libpq/libpq-int.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index ee4f7e516f4..7cd4386fe1d 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -7158,7 +7158,9 @@ PQport(const PGconn *conn) if (!conn) return NULL; - if (conn->connhost != NULL) + if (conn->connhost != NULL && + conn->connhost[conn->whichhost].port != NULL && + conn->connhost[conn->whichhost].port[0] != '\0') return conn->connhost[conn->whichhost].port; return ""; diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index a951f4992be..8b05ea9e5ad 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -347,7 +347,8 @@ typedef struct pg_conn_host pg_conn_host_type type; /* type of host address */ char *host; /* host name or socket path */ char *hostaddr; /* host numeric IP address */ - char *port; /* port number (always provided) */ + char *port; /* port number (if NULL or empty, use + * DEF_PGPORT[_STR]) */ char *password; /* password for this host, read from the * password file; NULL if not sought or not * found in password file. */ From b485e1c89a6dd210518eb4e26427df64831cf394 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sat, 19 Jul 2025 13:44:01 +0300 Subject: [PATCH 077/115] Fix infinite wait when reading a partially written WAL record If a crash occurs while writing a WAL record that spans multiple pages, the recovery process marks the page with the XLP_FIRST_IS_OVERWRITE_CONTRECORD flag. However, logical decoding currently attempts to read the full WAL record based on its expected size before checking this flag, which can lead to an infinite wait if the remaining data is never written (e.g., no activity after crash). This patch updates the logic first to read the page header and check for the XLP_FIRST_IS_OVERWRITE_CONTRECORD flag before attempting to reconstruct the full WAL record. If the flag is set, decoding correctly identifies the record as incomplete and avoids waiting for WAL data that will never arrive. Discussion: https://postgr.es/m/CAAKRu_ZCOzQpEumLFgG_%2Biw3FTa%2BhJ4SRpxzaQBYxxM_ZAzWcA%40mail.gmail.com Discussion: https://postgr.es/m/CALDaNm34m36PDHzsU_GdcNXU0gLTfFY5rzh9GSQv%3Dw6B%2BQVNRQ%40mail.gmail.com Author: Vignesh C Reviewed-by: Hayato Kuroda Reviewed-by: Dilip Kumar Reviewed-by: Michael Paquier Reviewed-by: Alexander Korotkov Backpatch-through: 13 --- src/backend/access/transam/xlogreader.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 85745fa3bf5..6db8dc00e82 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -724,11 +724,12 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) /* Calculate pointer to beginning of next page */ targetPagePtr += XLOG_BLCKSZ; - /* Wait for the next page to become available */ - readOff = ReadPageInternal(state, targetPagePtr, - Min(total_len - gotlen + SizeOfXLogShortPHD, - XLOG_BLCKSZ)); - + /* + * Read the page header before processing the record data, so we + * can handle the case where the previous record ended as being a + * partial one. + */ + readOff = ReadPageInternal(state, targetPagePtr, SizeOfXLogShortPHD); if (readOff == XLREAD_WOULDBLOCK) return XLREAD_WOULDBLOCK; else if (readOff < 0) @@ -777,6 +778,15 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) goto err; } + /* Wait for the next page to become available */ + readOff = ReadPageInternal(state, targetPagePtr, + Min(total_len - gotlen + SizeOfXLogShortPHD, + XLOG_BLCKSZ)); + if (readOff == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readOff < 0) + goto err; + /* Append the continuation from this page to the buffer */ pageHeaderSize = XLogPageHeaderSize(pageHeader); From 2b09054e4d18acf9bb8aee75c1894be05d98c58b Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Sun, 20 Jul 2025 11:58:31 +0900 Subject: [PATCH 078/115] doc: Document reopen of output file via SIGHUP in pg_recvlogical. When pg_recvlogical receives a SIGHUP signal, it closes the current output file and reopens a new one. This is useful since it allows us to rotate the output file by renaming the current file and sending a SIGHUP. This behavior was previously undocumented. This commit adds the missing documentation. Back-patch to all supported versions. Author: Fujii Masao Reviewed-by: Shinya Kato Discussion: https://postgr.es/m/0977fc4f-1523-4ecd-8a0e-391af4976367@oss.nttdata.com Backpatch-through: 13 --- doc/src/sgml/ref/pg_recvlogical.sgml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml index 648d3f0f62c..0af2343b87b 100644 --- a/doc/src/sgml/ref/pg_recvlogical.sgml +++ b/doc/src/sgml/ref/pg_recvlogical.sgml @@ -53,6 +53,16 @@ PostgreSQL documentation (ControlC) or SIGTERM signal. + + + When pg_recvlogical receives + a SIGHUP signal, it closes the current output file + and opens a new one using the filename specified by + the option. This allows us to rotate + the output file by first renaming the current file and then sending + a SIGHUP signal to + pg_recvlogical. + From 313d3102facdc61317d1292ab8f2d6cf1f254282 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 22 Jul 2025 14:00:07 +0900 Subject: [PATCH 079/115] ecpg: Fix NULL pointer dereference during connection lookup ECPGconnect() caches established connections to the server, supporting the case of a NULL connection name when a database name is not specified by its caller. A follow-up call to ECPGget_PGconn() to get an established connection from the cached set with a non-NULL name could cause a NULL pointer dereference if a NULL connection was listed in the cache and checked for a match. At least two connections are necessary to reproduce the issue: one with a NULL name and one with a non-NULL name. Author: Aleksander Alekseev Discussion: https://postgr.es/m/CAJ7c6TNvFTPUTZQuNAoqgzaSGz-iM4XR61D7vEj5PsQXwg2RyA@mail.gmail.com Backpatch-through: 13 --- src/interfaces/ecpg/ecpglib/connect.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index db0bae1fe08..19261fe56c2 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -66,7 +66,12 @@ ecpg_get_connection_nr(const char *connection_name) for (con = all_connections; con != NULL; con = con->next) { - if (strcmp(connection_name, con->name) == 0) + /* + * Check for the case of a NULL connection name, stored as such in + * the connection information by ECPGconnect() when the database + * name is not specified by its caller. + */ + if (con->name != NULL && strcmp(connection_name, con->name) == 0) break; } ret = con; From e4d58545550927d5d0e36b8b2f9cba886c6748a8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 23 Jul 2025 15:44:29 -0400 Subject: [PATCH 080/115] Fix build breakage on Solaris-alikes with late-model GCC. Solaris has never bothered to add "const" to the second argument of PAM conversation procs, as all other Unixen did decades ago. This resulted in an "incompatible pointer" compiler warning when building --with-pam, but had no more serious effect than that, so we never did anything about it. However, as of GCC 14 the case is an error not warning by default. To complicate matters, recent OpenIndiana (and maybe illumos in general?) *does* supply the "const" by default, so we can't just assume that platforms using our solaris template need help. What we can do, short of building a configure-time probe, is to make solaris.h #define _PAM_LEGACY_NONCONST, which causes OpenIndiana's pam_appl.h to revert to the traditional definition, and hopefully will have no effect anywhere else. Then we can use that same symbol to control whether we include "const" in the declaration of pam_passwd_conv_proc(). Bug: #18995 Reported-by: Andrew Watkins Author: Tom Lane Discussion: https://postgr.es/m/18995-82058da9ab4337a7@postgresql.org Backpatch-through: 13 --- src/backend/libpq/auth.c | 12 ++++++++++-- src/include/port/solaris.h | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index eaae83cc3a8..183d9e731d6 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -95,8 +95,16 @@ static int auth_peer(hbaPort *port); #define PGSQL_PAM_SERVICE "postgresql" /* Service name passed to PAM */ +/* Work around original Solaris' lack of "const" in the conv_proc signature */ +#ifdef _PAM_LEGACY_NONCONST +#define PG_PAM_CONST +#else +#define PG_PAM_CONST const +#endif + static int CheckPAMAuth(Port *port, const char *user, const char *password); -static int pam_passwd_conv_proc(int num_msg, const struct pam_message **msg, +static int pam_passwd_conv_proc(int num_msg, + PG_PAM_CONST struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); static struct pam_conv pam_passw_conv = { @@ -1910,7 +1918,7 @@ auth_peer(hbaPort *port) */ static int -pam_passwd_conv_proc(int num_msg, const struct pam_message **msg, +pam_passwd_conv_proc(int num_msg, PG_PAM_CONST struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { const char *passwd; diff --git a/src/include/port/solaris.h b/src/include/port/solaris.h index e63a3bd824d..8ff40007c7f 100644 --- a/src/include/port/solaris.h +++ b/src/include/port/solaris.h @@ -24,3 +24,12 @@ #if defined(__i386__) #include #endif + +/* + * On original Solaris, PAM conversation procs lack a "const" in their + * declaration; but recent OpenIndiana versions put it there by default. + * The least messy way to deal with this is to define _PAM_LEGACY_NONCONST, + * which causes OpenIndiana to declare pam_conv per the Solaris tradition, + * and also use that symbol to control omitting the "const" in our own code. + */ +#define _PAM_LEGACY_NONCONST 1 From f0cdc2afd15e51f580e53ebd269bd66ec0aaaa79 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sun, 27 Jul 2025 15:10:01 +0300 Subject: [PATCH 081/115] Limit checkpointer requests queue size If the number of sync requests is big enough, the palloc() call in AbsorbSyncRequests() will attempt to allocate more than 1 GB of memory, resulting in failure. This can lead to an infinite loop in the checkpointer process, as it repeatedly fails to absorb the pending requests. This commit limits the checkpointer requests queue size to 10M items. In addition to preventing the palloc() failure, this change helps to avoid long queue processing time. Also, this commit is for backpathing only. The master branch receives a more invasive yet comprehensive fix for this problem. Discussion: https://postgr.es/m/db4534f83a22a29ab5ee2566ad86ca92%40postgrespro.ru Backpatch-through: 13 --- src/backend/postmaster/checkpointer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index f482f6423d1..e93bf38a4f6 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -138,6 +138,9 @@ static CheckpointerShmemStruct *CheckpointerShmem; /* interval for calling AbsorbSyncRequests in CheckpointWriteDelay */ #define WRITES_PER_ABSORB 1000 +/* Max number of requests the checkpointer request queue can hold */ +#define MAX_CHECKPOINT_REQUESTS 10000000 + /* * GUC parameters */ @@ -903,7 +906,7 @@ CheckpointerShmemInit(void) */ MemSet(CheckpointerShmem, 0, size); SpinLockInit(&CheckpointerShmem->ckpt_lck); - CheckpointerShmem->max_requests = NBuffers; + CheckpointerShmem->max_requests = Min(NBuffers, MAX_CHECKPOINT_REQUESTS); ConditionVariableInit(&CheckpointerShmem->start_cv); ConditionVariableInit(&CheckpointerShmem->done_cv); } From 6d5e493b4a15ee54c68b65e5f48feca87291eb79 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Jul 2025 16:50:42 -0400 Subject: [PATCH 082/115] Avoid regression in the size of XML input that we will accept. This mostly reverts commit 6082b3d5d, "Use xmlParseInNodeContext not xmlParseBalancedChunkMemory". It turns out that xmlParseInNodeContext will reject text chunks exceeding 10MB, while (in most libxml2 versions) xmlParseBalancedChunkMemory will not. The bleeding-edge libxml2 bug that we needed to work around a year ago is presumably no longer a factor, and the argument that xmlParseBalancedChunkMemory is semi-deprecated is not enough to justify a functionality regression. Hence, go back to doing it the old way. Reported-by: Michael Paquier Author: Michael Paquier Co-authored-by: Erik Wienhold Reviewed-by: Tom Lane Discussion: https://postgr.es/m/aIGknLuc8b8ega2X@paquier.xyz Backpatch-through: 13 --- src/backend/utils/adt/xml.c | 68 ++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 4063869e56f..6ab773472f7 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -1709,7 +1709,7 @@ xml_doctype_in_content(const xmlChar *str) * xmloption_arg, but a DOCTYPE node in the input can force DOCUMENT mode). * * If parsed_nodes isn't NULL and we parse in CONTENT mode, the list - * of parsed nodes from the xmlParseInNodeContext call will be returned + * of parsed nodes from the xmlParseBalancedChunkMemory call will be returned * to *parsed_nodes. (It is caller's responsibility to free that.) * * Errors normally result in ereport(ERROR), but if escontext is an @@ -1735,6 +1735,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, PgXmlErrorContext *xmlerrcxt; volatile xmlParserCtxtPtr ctxt = NULL; volatile xmlDocPtr doc = NULL; + volatile int save_keep_blanks = -1; /* * This step looks annoyingly redundant, but we must do it to have a @@ -1762,7 +1763,6 @@ xml_parse(text *data, XmlOptionType xmloption_arg, PG_TRY(); { bool parse_as_document = false; - int options; int res_code; size_t count = 0; xmlChar *version = NULL; @@ -1793,18 +1793,6 @@ xml_parse(text *data, XmlOptionType xmloption_arg, parse_as_document = true; } - /* - * Select parse options. - * - * Note that here we try to apply DTD defaults (XML_PARSE_DTDATTR) - * according to SQL/XML:2008 GR 10.16.7.d: 'Default values defined by - * internal DTD are applied'. As for external DTDs, we try to support - * them too (see SQL/XML:2008 GR 10.16.7.e), but that doesn't really - * happen because xmlPgEntityLoader prevents it. - */ - options = XML_PARSE_NOENT | XML_PARSE_DTDATTR - | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS); - /* initialize output parameters */ if (parsed_xmloptiontype != NULL) *parsed_xmloptiontype = parse_as_document ? XMLOPTION_DOCUMENT : @@ -1814,11 +1802,26 @@ xml_parse(text *data, XmlOptionType xmloption_arg, if (parse_as_document) { + int options; + + /* set up parser context used by xmlCtxtReadDoc */ ctxt = xmlNewParserCtxt(); if (ctxt == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate parser context"); + /* + * Select parse options. + * + * Note that here we try to apply DTD defaults (XML_PARSE_DTDATTR) + * according to SQL/XML:2008 GR 10.16.7.d: 'Default values defined + * by internal DTD are applied'. As for external DTDs, we try to + * support them too (see SQL/XML:2008 GR 10.16.7.e), but that + * doesn't really happen because xmlPgEntityLoader prevents it. + */ + options = XML_PARSE_NOENT | XML_PARSE_DTDATTR + | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS); + doc = xmlCtxtReadDoc(ctxt, utf8string, NULL, /* no URL */ "UTF-8", @@ -1840,10 +1843,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } else { - xmlNodePtr root; - xmlNodePtr oldroot PG_USED_FOR_ASSERTS_ONLY; - - /* set up document with empty root node to be the context node */ + /* set up document that xmlParseBalancedChunkMemory will add to */ doc = xmlNewDoc(version); if (doc == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, @@ -1856,36 +1856,23 @@ xml_parse(text *data, XmlOptionType xmloption_arg, "could not allocate XML document"); doc->standalone = standalone; - root = xmlNewNode(NULL, (const xmlChar *) "content-root"); - if (root == NULL || xmlerrcxt->err_occurred) - xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, - "could not allocate xml node"); - - /* - * This attaches root to doc, so we need not free it separately; - * and there can't yet be any old root to free. - */ - oldroot = xmlDocSetRootElement(doc, root); - Assert(oldroot == NULL); + /* set parse options --- have to do this the ugly way */ + save_keep_blanks = xmlKeepBlanksDefault(preserve_whitespace ? 1 : 0); /* allow empty content */ if (*(utf8string + count)) { xmlNodePtr node_list = NULL; - xmlParserErrors res; - - res = xmlParseInNodeContext(root, - (char *) utf8string + count, - strlen((char *) utf8string + count), - options, - &node_list); - if (res != XML_ERR_OK || xmlerrcxt->err_occurred) + res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0, + utf8string + count, + &node_list); + if (res_code != 0 || xmlerrcxt->err_occurred) { - xmlFreeNodeList(node_list); xml_errsave(escontext, xmlerrcxt, ERRCODE_INVALID_XML_CONTENT, "invalid XML content"); + xmlFreeNodeList(node_list); goto fail; } @@ -1901,6 +1888,8 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } PG_CATCH(); { + if (save_keep_blanks != -1) + xmlKeepBlanksDefault(save_keep_blanks); if (doc != NULL) xmlFreeDoc(doc); if (ctxt != NULL) @@ -1912,6 +1901,9 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } PG_END_TRY(); + if (save_keep_blanks != -1) + xmlKeepBlanksDefault(save_keep_blanks); + if (ctxt != NULL) xmlFreeParserCtxt(ctxt); From d861b9282261b066a1147d920a27527c22dc499d Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Tue, 29 Jul 2025 10:41:13 +0300 Subject: [PATCH 083/115] Clarify documentation for the initcap function This commit documents differences in the definition of word separators for the initcap function between libc and ICU locale providers. Backpatch to all supported branches. Discussion: https://postgr.es/m/804cc10ef95d4d3b298e76b181fd9437%40postgrespro.ru Author: Oleg Tselebrovskiy Backpatch-through: 13 --- doc/src/sgml/func.sgml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 4faa7782dce..332d9175e26 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -3049,8 +3049,11 @@ repeat('Pg', 4) PgPgPgPg Converts the first letter of each word to upper case and the - rest to lower case. Words are sequences of alphanumeric - characters separated by non-alphanumeric characters. + rest to lower case. When using the libc locale + provider, words are sequences of alphanumeric characters separated + by non-alphanumeric characters; when using the ICU locale provider, + words are separated according to + Unicode Standard Annex #29. initcap('hi THOMAS') From 762c6d8d26e023afeb36019113ba9f60b811add1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 29 Jul 2025 12:47:19 -0400 Subject: [PATCH 084/115] Remove unnecessary complication around xmlParseBalancedChunkMemory. When I prepared 71c0921b6 et al yesterday, I was thinking that the logic involving explicitly freeing the node_list output was still needed to dodge leakage bugs in libxml2. But I was misremembering: we introduced that only because with early 2.13.x releases we could not trust xmlParseBalancedChunkMemory's result code, so we had to look to see if a node list was returned or not. There's no reason to believe that xmlParseBalancedChunkMemory will fail to clean up the node list when required, so simplify. (This essentially completes reverting all the non-cosmetic changes in 6082b3d5d.) Reported-by: Jim Jones Author: Tom Lane Discussion: https://postgr.es/m/997668.1753802857@sss.pgh.pa.us Backpatch-through: 13 --- src/backend/utils/adt/xml.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 6ab773472f7..d6dbb22d918 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -1862,24 +1862,16 @@ xml_parse(text *data, XmlOptionType xmloption_arg, /* allow empty content */ if (*(utf8string + count)) { - xmlNodePtr node_list = NULL; - res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0, utf8string + count, - &node_list); + parsed_nodes); if (res_code != 0 || xmlerrcxt->err_occurred) { xml_errsave(escontext, xmlerrcxt, ERRCODE_INVALID_XML_CONTENT, "invalid XML content"); - xmlFreeNodeList(node_list); goto fail; } - - if (parsed_nodes != NULL) - *parsed_nodes = node_list; - else - xmlFreeNodeList(node_list); } } From bbc20c8a9ffdefcabd70ea0c325827fe2b8f5960 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 29 Jul 2025 15:17:41 -0400 Subject: [PATCH 085/115] Don't put library-supplied -L/-I switches before user-supplied ones. For many optional libraries, we extract the -L and -l switches needed to link the library from a helper program such as llvm-config. In some cases we put the resulting -L switches into LDFLAGS ahead of -L switches specified via --with-libraries. That risks breaking the user's intention for --with-libraries. It's not such a problem if the library's -L switch points to a directory containing only that library, but on some platforms a library helper may "helpfully" offer a switch such as -L/usr/lib that points to a directory holding all standard libraries. If the user specified --with-libraries in hopes of overriding the standard build of some library, the -L/usr/lib switch prevents that from happening since it will come before the user-specified directory. To fix, avoid inserting these switches directly into LDFLAGS during configure, instead adding them to LIBDIRS or SHLIB_LINK. They will still eventually get added to LDFLAGS, but only after the switches coming from --with-libraries. The same problem exists for -I switches: those coming from --with-includes should appear before any coming from helper programs such as llvm-config. We have not heard field complaints about this case, but it seems certain that a user attempting to override a standard library could have issues. The changes for this go well beyond configure itself, however, because many Makefiles have occasion to manipulate CPPFLAGS to insert locally-desirable -I switches, and some of them got it wrong. The correct ordering is any -I switches pointing at within-the- source-tree-or-build-tree directories, then those from the tree-wide CPPFLAGS, then those from helper programs. There were several places that risked pulling in a system-supplied copy of libpq headers, for example, instead of the in-tree files. (Commit cb36f8ec2 fixed one instance of that a few months ago, but this exercise found more.) The Meson build scripts may or may not have any comparable problems, but I'll leave it to someone else to investigate that. Reported-by: Charles Samborski Author: Tom Lane Discussion: https://postgr.es/m/70f2155f-27ca-4534-b33d-7750e20633d7@demurgos.net Backpatch-through: 13 --- config/llvm.m4 | 4 ++-- configure | 20 ++++++++++---------- configure.ac | 18 +++++++++--------- src/Makefile.global.in | 2 +- src/backend/jit/llvm/Makefile | 2 +- src/bin/initdb/Makefile | 2 +- src/interfaces/libpq/Makefile | 2 +- src/pl/plpython/Makefile | 2 +- src/pl/tcl/Makefile | 2 +- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/config/llvm.m4 b/config/llvm.m4 index 21d8cd4f90f..93fa9e070e8 100644 --- a/config/llvm.m4 +++ b/config/llvm.m4 @@ -4,7 +4,7 @@ # ----------------- # # Look for the LLVM installation, check that it's new enough, set the -# corresponding LLVM_{CFLAGS,CXXFLAGS,BINPATH} and LDFLAGS +# corresponding LLVM_{CFLAGS,CXXFLAGS,BINPATH,LIBS} # variables. Also verify that CLANG is available, to transform C # into bitcode. # @@ -55,7 +55,7 @@ AC_DEFUN([PGAC_LLVM_SUPPORT], for pgac_option in `$LLVM_CONFIG --ldflags`; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LLVM_LIBS="$LLVM_LIBS $pgac_option";; esac done diff --git a/configure b/configure index eb05eaa227d..361c01fd523 100755 --- a/configure +++ b/configure @@ -5207,7 +5207,7 @@ fi for pgac_option in `$LLVM_CONFIG --ldflags`; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LLVM_LIBS="$LLVM_LIBS $pgac_option";; esac done @@ -9332,12 +9332,12 @@ fi # Note the user could also set XML2_CFLAGS/XML2_LIBS directly for pgac_option in $XML2_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $XML2_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -9562,12 +9562,12 @@ fi # note that -llz4 will be added by AC_CHECK_LIB below. for pgac_option in $LZ4_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $LZ4_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -9703,12 +9703,12 @@ fi # note that -lzstd will be added by AC_CHECK_LIB below. for pgac_option in $ZSTD_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $ZSTD_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -16721,7 +16721,7 @@ fi if test "$with_icu" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$ICU_CFLAGS $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ICU_CFLAGS" # Verify we have ICU's header files ac_fn_c_check_header_mongrel "$LINENO" "unicode/ucol.h" "ac_cv_header_unicode_ucol_h" "$ac_includes_default" @@ -18876,7 +18876,7 @@ Use --without-tcl to disable building PL/Tcl." "$LINENO" 5 fi # now that we have TCL_INCLUDE_SPEC, we can check for ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$TCL_INCLUDE_SPEC $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $TCL_INCLUDE_SPEC" ac_fn_c_check_header_mongrel "$LINENO" "tcl.h" "ac_cv_header_tcl_h" "$ac_includes_default" if test "x$ac_cv_header_tcl_h" = xyes; then : @@ -18945,7 +18945,7 @@ fi # check for if test "$with_python" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$python_includespec $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $python_includespec" ac_fn_c_check_header_mongrel "$LINENO" "Python.h" "ac_cv_header_Python_h" "$ac_includes_default" if test "x$ac_cv_header_Python_h" = xyes; then : diff --git a/configure.ac b/configure.ac index ca75eb00f5e..a870f98c101 100644 --- a/configure.ac +++ b/configure.ac @@ -1071,12 +1071,12 @@ if test "$with_libxml" = yes ; then # Note the user could also set XML2_CFLAGS/XML2_LIBS directly for pgac_option in $XML2_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $XML2_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1120,12 +1120,12 @@ if test "$with_lz4" = yes; then # note that -llz4 will be added by AC_CHECK_LIB below. for pgac_option in $LZ4_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $LZ4_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1145,12 +1145,12 @@ if test "$with_zstd" = yes; then # note that -lzstd will be added by AC_CHECK_LIB below. for pgac_option in $ZSTD_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $ZSTD_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1949,7 +1949,7 @@ fi if test "$with_icu" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$ICU_CFLAGS $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ICU_CFLAGS" # Verify we have ICU's header files AC_CHECK_HEADER(unicode/ucol.h, [], @@ -2298,7 +2298,7 @@ Use --without-tcl to disable building PL/Tcl.]) fi # now that we have TCL_INCLUDE_SPEC, we can check for ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$TCL_INCLUDE_SPEC $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $TCL_INCLUDE_SPEC" AC_CHECK_HEADER(tcl.h, [], [AC_MSG_ERROR([header file is required for Tcl])]) CPPFLAGS=$ac_save_CPPFLAGS fi @@ -2335,7 +2335,7 @@ fi # check for if test "$with_python" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$python_includespec $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $python_includespec" AC_CHECK_HEADER(Python.h, [], [AC_MSG_ERROR([header file is required for Python])]) CPPFLAGS=$ac_save_CPPFLAGS fi diff --git a/src/Makefile.global.in b/src/Makefile.global.in index cc4dc6de91e..ce05cc1429a 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -240,7 +240,7 @@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ PG_SYSROOT = @PG_SYSROOT@ -override CPPFLAGS := $(ICU_CFLAGS) $(CPPFLAGS) +override CPPFLAGS += $(ICU_CFLAGS) ifdef PGXS override CPPFLAGS := -I$(includedir_server) -I$(includedir_internal) $(CPPFLAGS) diff --git a/src/backend/jit/llvm/Makefile b/src/backend/jit/llvm/Makefile index 607d16754f5..6fe96e7b9c7 100644 --- a/src/backend/jit/llvm/Makefile +++ b/src/backend/jit/llvm/Makefile @@ -31,7 +31,7 @@ endif # All files in this directory use LLVM. CFLAGS += $(LLVM_CFLAGS) CXXFLAGS += $(LLVM_CXXFLAGS) -override CPPFLAGS := $(LLVM_CPPFLAGS) $(CPPFLAGS) +override CPPFLAGS += $(LLVM_CPPFLAGS) SHLIB_LINK += $(LLVM_LIBS) # Because this module includes C++ files, we need to use a C++ diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index d69bd89572a..9e74e2a25a8 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -16,7 +16,7 @@ subdir = src/bin/initdb top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(ICU_CFLAGS) $(CPPFLAGS) +override CPPFLAGS := -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(CPPFLAGS) $(ICU_CFLAGS) # Note: it's important that we link to encnames.o from libpgcommon, not # from libpq, else we have risks of version skew if we run with a libpq diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 0919d8f32f6..5cf1d6400e6 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -22,7 +22,7 @@ NAME= pq SO_MAJOR_VERSION= 5 SO_MINOR_VERSION= $(MAJORVERSION) -override CPPFLAGS := -I$(srcdir) $(CPPFLAGS) -I$(top_builddir)/src/port -I$(top_srcdir)/src/port +override CPPFLAGS := -I$(srcdir) -I$(top_builddir)/src/port -I$(top_srcdir)/src/port $(CPPFLAGS) ifneq ($(PORTNAME), win32) override CFLAGS += $(PTHREAD_CFLAGS) endif diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile index bb264266bb1..3a8955bd0be 100644 --- a/src/pl/plpython/Makefile +++ b/src/pl/plpython/Makefile @@ -11,7 +11,7 @@ ifeq ($(PORTNAME), win32) override python_libspec = endif -override CPPFLAGS := -I. -I$(srcdir) $(python_includespec) $(CPPFLAGS) +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) $(python_includespec) rpathdir = $(python_libdir) diff --git a/src/pl/tcl/Makefile b/src/pl/tcl/Makefile index 314f9b2eec9..fb9f20c3f89 100644 --- a/src/pl/tcl/Makefile +++ b/src/pl/tcl/Makefile @@ -11,7 +11,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -I. -I$(srcdir) $(TCL_INCLUDE_SPEC) $(CPPFLAGS) +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) $(TCL_INCLUDE_SPEC) # On Windows, we don't link directly with the Tcl library; see below ifneq ($(PORTNAME), win32) From c1984be23cdc3aa74d1fd7bb28a4acaaa6813687 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 30 Jul 2025 11:55:49 +0900 Subject: [PATCH 086/115] Fix ./configure checks with __cpuidex() and __cpuid() The configure checks used two incorrect functions when checking the presence of some routines in an environment: - __get_cpuidex() for the check of __cpuidex(). - __get_cpuid() for the check of __cpuid(). This means that Postgres has never been able to detect the presence of these functions, impacting environments where these exist, like Windows. Simply fixing the function name does not work. For example, using configure with MinGW on Windows causes the checks to detect all four of __get_cpuid(), __get_cpuid_count(), __cpuidex() and __cpuid() to be available, causing a compilation failure as this messes up with the MinGW headers as we would include both and . The Postgres code expects only one in { __get_cpuid() , __cpuid() } and one in { __get_cpuid_count() , __cpuidex() } to exist. This commit reshapes the configure checks to do exactly what meson is doing, which has been working well for us: check one, then the other, but never allow both to be detected in a given build. The logic is wrong since 3dc2d62d0486 and 792752af4eb5 where these checks have been introduced (the second case is most likely a copy-pasto coming from the first case), with meson documenting that the configure checks were broken. As far as I can see, they are not once applied consistently with what the code expects, but let's see if the buildfarm has different something to say. The comment in meson.build is adjusted as well, to reflect the new reality. Author: Lukas Fittl Co-authored-by: Michael Paquier Discussion: https://postgr.es/m/aIgwNYGVt5aRAqTJ@paquier.xyz Backpatch-through: 13 --- configure | 13 +++++++------ configure.ac | 25 +++++++++++++------------ 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/configure b/configure index 361c01fd523..71e4e0e93d0 100755 --- a/configure +++ b/configure @@ -17897,7 +17897,7 @@ $as_echo "#define HAVE_GCC__ATOMIC_INT64_CAS 1" >>confdefs.h fi -# Check for x86 cpuid instruction +# Check for __get_cpuid() and __cpuid() { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __get_cpuid" >&5 $as_echo_n "checking for __get_cpuid... " >&6; } if ${pgac_cv__get_cpuid+:} false; then : @@ -17930,9 +17930,9 @@ if test x"$pgac_cv__get_cpuid" = x"yes"; then $as_echo "#define HAVE__GET_CPUID 1" >>confdefs.h -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuid" >&5 +else + # __cpuid() + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuid" >&5 $as_echo_n "checking for __cpuid... " >&6; } if ${pgac_cv__cpuid+:} false; then : $as_echo_n "(cached) " >&6 @@ -17944,7 +17944,7 @@ int main () { unsigned int exx[4] = {0, 0, 0, 0}; - __get_cpuid(exx[0], 1); + __cpuid(exx, 1); ; return 0; @@ -17960,10 +17960,11 @@ rm -f core conftest.err conftest.$ac_objext \ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__cpuid" >&5 $as_echo "$pgac_cv__cpuid" >&6; } -if test x"$pgac_cv__cpuid" = x"yes"; then + if test x"$pgac_cv__cpuid" = x"yes"; then $as_echo "#define HAVE__CPUID 1" >>confdefs.h + fi fi # Check for Intel SSE 4.2 intrinsics to do CRC calculations. diff --git a/configure.ac b/configure.ac index a870f98c101..d26030f20c6 100644 --- a/configure.ac +++ b/configure.ac @@ -2081,7 +2081,7 @@ PGAC_HAVE_GCC__ATOMIC_INT32_CAS PGAC_HAVE_GCC__ATOMIC_INT64_CAS -# Check for x86 cpuid instruction +# Check for __get_cpuid() and __cpuid() AC_CACHE_CHECK([for __get_cpuid], [pgac_cv__get_cpuid], [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [[unsigned int exx[4] = {0, 0, 0, 0}; @@ -2091,17 +2091,18 @@ AC_CACHE_CHECK([for __get_cpuid], [pgac_cv__get_cpuid], [pgac_cv__get_cpuid="no"])]) if test x"$pgac_cv__get_cpuid" = x"yes"; then AC_DEFINE(HAVE__GET_CPUID, 1, [Define to 1 if you have __get_cpuid.]) -fi - -AC_CACHE_CHECK([for __cpuid], [pgac_cv__cpuid], -[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [[unsigned int exx[4] = {0, 0, 0, 0}; - __get_cpuid(exx[0], 1); - ]])], - [pgac_cv__cpuid="yes"], - [pgac_cv__cpuid="no"])]) -if test x"$pgac_cv__cpuid" = x"yes"; then - AC_DEFINE(HAVE__CPUID, 1, [Define to 1 if you have __cpuid.]) +else + # __cpuid() + AC_CACHE_CHECK([for __cpuid], [pgac_cv__cpuid], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [[unsigned int exx[4] = {0, 0, 0, 0}; + __cpuid(exx, 1); + ]])], + [pgac_cv__cpuid="yes"], + [pgac_cv__cpuid="no"])]) + if test x"$pgac_cv__cpuid" = x"yes"; then + AC_DEFINE(HAVE__CPUID, 1, [Define to 1 if you have __cpuid.]) + fi fi # Check for Intel SSE 4.2 intrinsics to do CRC calculations. From 9affed26349acafb42471de34f37dc06b1a3879e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 4 Nov 2024 13:30:30 -0500 Subject: [PATCH 087/115] pg_dump: provide a stable sort order for rules. Previously, we sorted rules by schema name and then rule name; if that wasn't unique, we sorted by rule OID. This can be problematic for comparing dumps from databases with different histories, especially since certain rule names like "_RETURN" are very common. Let's make the sort key schema name, rule name, table name, which should be unique. (This is the same behavior we've long used for triggers and RLS policies.) Andreas Karlsson This back-patches v18 commit 350e6b8ea86c22c0b95c2e32a4e8d109255b5596 to all supported branches. The next commit will assert that pg_dump provides a stable sort order for all object types. That assertion would fail without stabilizing DO_RULE order as this commit did. Discussion: https://postgr.es/m/b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se Discussion: https://postgr.es/m/20250707192654.9e.nmisch@google.com Backpatch-through: 13-17 --- src/bin/pg_dump/pg_dump_sort.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index 523a19c1557..0b21497a72e 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -291,6 +291,17 @@ DOTypeNameCompare(const void *p1, const void *p2) if (cmpval != 0) return cmpval; } + else if (obj1->objType == DO_RULE) + { + RuleInfo *robj1 = *(RuleInfo *const *) p1; + RuleInfo *robj2 = *(RuleInfo *const *) p2; + + /* Sort by table name (table namespace was considered already) */ + cmpval = strcmp(robj1->ruletable->dobj.name, + robj2->ruletable->dobj.name); + if (cmpval != 0) + return cmpval; + } else if (obj1->objType == DO_TRIGGER) { TriggerInfo *tobj1 = *(TriggerInfo *const *) p1; From 0ac1581c3f2dd02009f0bfa453854946d56e1fc4 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Thu, 31 Jul 2025 06:37:56 -0700 Subject: [PATCH 088/115] Sort dump objects independent of OIDs, for the 7 holdout object types. pg_dump sorts objects by their logical names, e.g. (nspname, relname, tgname), before dependency-driven reordering. That removes one source of logically-identical databases differing in their schema-only dumps. In other words, it helps with schema diffing. The logical name sort ignored essential sort keys for constraints, operators, PUBLICATION ... FOR TABLE, PUBLICATION ... FOR TABLES IN SCHEMA, operator classes, and operator families. pg_dump's sort then depended on object OID, yielding spurious schema diffs. After this change, OIDs affect dump order only in the event of catalog corruption. While pg_dump also wrongly ignored pg_collation.collencoding, CREATE COLLATION restrictions have been keeping that imperceptible in practical use. Use techniques like we use for object types already having full sort key coverage. Where the pertinent queries weren't fetching the ignored sort keys, this adds columns to those queries and stores those keys in memory for the long term. The ignorance of sort keys became more problematic when commit 172259afb563d35001410dc6daad78b250924038 added a schema diff test sensitive to it. Buildfarm member hippopotamus witnessed that. However, dump order stability isn't a new goal, and this might avoid other dump comparison failures. Hence, back-patch to v13 (all supported versions). Reviewed-by: Robert Haas Discussion: https://postgr.es/m/20250707192654.9e.nmisch@google.com Backpatch-through: 13 --- src/bin/pg_dump/common.c | 19 ++ src/bin/pg_dump/pg_dump.c | 62 ++++-- src/bin/pg_dump/pg_dump.h | 6 + src/bin/pg_dump/pg_dump_sort.c | 238 ++++++++++++++++++++-- src/test/regress/expected/publication.out | 21 ++ src/test/regress/sql/publication.sql | 22 ++ 6 files changed, 335 insertions(+), 33 deletions(-) diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 5d988986edc..b7670262110 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -17,6 +17,7 @@ #include +#include "catalog/pg_am_d.h" #include "catalog/pg_class_d.h" #include "catalog/pg_collation_d.h" #include "catalog/pg_extension_d.h" @@ -902,6 +903,24 @@ findOprByOid(Oid oid) return (OprInfo *) dobj; } +/* + * findAccessMethodByOid + * finds the DumpableObject for the access method with the given oid + * returns NULL if not found + */ +AccessMethodInfo * +findAccessMethodByOid(Oid oid) +{ + CatalogId catId; + DumpableObject *dobj; + + catId.tableoid = AccessMethodRelationId; + catId.oid = oid; + dobj = findObjectByCatalogId(catId); + Assert(dobj == NULL || dobj->objType == DO_ACCESS_METHOD); + return (AccessMethodInfo *) dobj; +} + /* * findCollationByOid * finds the DumpableObject for the collation with the given oid diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index aa216d71456..21fac81fa09 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1970,6 +1970,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout) static void selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout) { + /* see getAccessMethods() comment about v9.6. */ + if (fout->remoteVersion < 90600) + { + method->dobj.dump = DUMP_COMPONENT_NONE; + return; + } + if (checkExtensionMembership(&method->dobj, fout)) return; /* extension membership overrides all else */ @@ -5643,6 +5650,8 @@ getOperators(Archive *fout, int *numOprs) int i_oprnamespace; int i_oprowner; int i_oprkind; + int i_oprleft; + int i_oprright; int i_oprcode; /* @@ -5654,6 +5663,8 @@ getOperators(Archive *fout, int *numOprs) "oprnamespace, " "oprowner, " "oprkind, " + "oprleft, " + "oprright, " "oprcode::oid AS oprcode " "FROM pg_operator"); @@ -5670,6 +5681,8 @@ getOperators(Archive *fout, int *numOprs) i_oprnamespace = PQfnumber(res, "oprnamespace"); i_oprowner = PQfnumber(res, "oprowner"); i_oprkind = PQfnumber(res, "oprkind"); + i_oprleft = PQfnumber(res, "oprleft"); + i_oprright = PQfnumber(res, "oprright"); i_oprcode = PQfnumber(res, "oprcode"); for (i = 0; i < ntups; i++) @@ -5683,6 +5696,8 @@ getOperators(Archive *fout, int *numOprs) findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace))); oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner)); oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0]; + oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft)); + oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright)); oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode)); /* Decide whether we want to dump it */ @@ -5716,6 +5731,7 @@ getCollations(Archive *fout, int *numCollations) int i_collname; int i_collnamespace; int i_collowner; + int i_collencoding; query = createPQExpBuffer(); @@ -5726,7 +5742,8 @@ getCollations(Archive *fout, int *numCollations) appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, " "collnamespace, " - "collowner " + "collowner, " + "collencoding " "FROM pg_collation"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -5741,6 +5758,7 @@ getCollations(Archive *fout, int *numCollations) i_collname = PQfnumber(res, "collname"); i_collnamespace = PQfnumber(res, "collnamespace"); i_collowner = PQfnumber(res, "collowner"); + i_collencoding = PQfnumber(res, "collencoding"); for (i = 0; i < ntups; i++) { @@ -5752,6 +5770,7 @@ getCollations(Archive *fout, int *numCollations) collinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_collnamespace))); collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner)); + collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding)); /* Decide whether we want to dump it */ selectDumpableObject(&(collinfo[i].dobj), fout); @@ -5853,19 +5872,28 @@ getAccessMethods(Archive *fout, int *numAccessMethods) int i_amhandler; int i_amtype; - /* Before 9.6, there are no user-defined access methods */ - if (fout->remoteVersion < 90600) - { - *numAccessMethods = 0; - return NULL; - } - query = createPQExpBuffer(); - /* Select all access methods from pg_am table */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, " - "amhandler::pg_catalog.regproc AS amhandler " - "FROM pg_am"); + /* + * Select all access methods from pg_am table. v9.6 introduced CREATE + * ACCESS METHOD, so earlier versions usually have only built-in access + * methods. v9.6 also changed the access method API, replacing dozens of + * pg_am columns with amhandler. Even if a user created an access method + * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am + * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read + * pg_am just to facilitate findAccessMethodByOid() providing the + * OID-to-name mapping. + */ + appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, "); + if (fout->remoteVersion >= 90600) + appendPQExpBufferStr(query, + "amtype, " + "amhandler::pg_catalog.regproc AS amhandler "); + else + appendPQExpBufferStr(query, + "'i'::pg_catalog.\"char\" AS amtype, " + "'-'::pg_catalog.regproc AS amhandler "); + appendPQExpBufferStr(query, "FROM pg_am"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -5920,6 +5948,7 @@ getOpclasses(Archive *fout, int *numOpclasses) OpclassInfo *opcinfo; int i_tableoid; int i_oid; + int i_opcmethod; int i_opcname; int i_opcnamespace; int i_opcowner; @@ -5929,7 +5958,7 @@ getOpclasses(Archive *fout, int *numOpclasses) * system-defined opclasses at dump-out time. */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opcmethod, opcname, " "opcnamespace, " "opcowner " "FROM pg_opclass"); @@ -5943,6 +5972,7 @@ getOpclasses(Archive *fout, int *numOpclasses) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); + i_opcmethod = PQfnumber(res, "opcmethod"); i_opcname = PQfnumber(res, "opcname"); i_opcnamespace = PQfnumber(res, "opcnamespace"); i_opcowner = PQfnumber(res, "opcowner"); @@ -5956,6 +5986,7 @@ getOpclasses(Archive *fout, int *numOpclasses) opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname)); opcinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace))); + opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod)); opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner)); /* Decide whether we want to dump it */ @@ -5986,6 +6017,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) OpfamilyInfo *opfinfo; int i_tableoid; int i_oid; + int i_opfmethod; int i_opfname; int i_opfnamespace; int i_opfowner; @@ -5997,7 +6029,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) * system-defined opfamilies at dump-out time. */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opfmethod, opfname, " "opfnamespace, " "opfowner " "FROM pg_opfamily"); @@ -6012,6 +6044,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_opfname = PQfnumber(res, "opfname"); + i_opfmethod = PQfnumber(res, "opfmethod"); i_opfnamespace = PQfnumber(res, "opfnamespace"); i_opfowner = PQfnumber(res, "opfowner"); @@ -6024,6 +6057,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname)); opfinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace))); + opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod)); opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner)); /* Decide whether we want to dump it */ diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 6eab9b93001..68bff88774c 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -250,6 +250,8 @@ typedef struct _oprInfo DumpableObject dobj; const char *rolname; char oprkind; + Oid oprleft; + Oid oprright; Oid oprcode; } OprInfo; @@ -263,12 +265,14 @@ typedef struct _accessMethodInfo typedef struct _opclassInfo { DumpableObject dobj; + Oid opcmethod; const char *rolname; } OpclassInfo; typedef struct _opfamilyInfo { DumpableObject dobj; + Oid opfmethod; const char *rolname; } OpfamilyInfo; @@ -276,6 +280,7 @@ typedef struct _collInfo { DumpableObject dobj; const char *rolname; + int collencoding; } CollInfo; typedef struct _convInfo @@ -697,6 +702,7 @@ extern TableInfo *findTableByOid(Oid oid); extern TypeInfo *findTypeByOid(Oid oid); extern FuncInfo *findFuncByOid(Oid oid); extern OprInfo *findOprByOid(Oid oid); +extern AccessMethodInfo *findAccessMethodByOid(Oid oid); extern CollInfo *findCollationByOid(Oid oid); extern NamespaceInfo *findNamespaceByOid(Oid oid); extern ExtensionInfo *findExtensionByOid(Oid oid); diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index 0b21497a72e..e925fac4010 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -157,6 +157,8 @@ static DumpId postDataBoundId; static int DOTypeNameCompare(const void *p1, const void *p2); +static int pgTypeNameCompare(Oid typid1, Oid typid2); +static int accessMethodNameCompare(Oid am1, Oid am2); static bool TopoSort(DumpableObject **objs, int numObjs, DumpableObject **ordering, @@ -224,12 +226,39 @@ DOTypeNameCompare(const void *p1, const void *p2) else if (obj2->namespace) return 1; - /* Sort by name */ + /* + * Sort by name. With a few exceptions, names here are single catalog + * columns. To get a fuller picture, grep pg_dump.c for "dobj.name = ". + * Names here don't match "Name:" in plain format output, which is a + * _tocEntry.tag. For example, DumpableObject.name of a constraint is + * pg_constraint.conname, but _tocEntry.tag of a constraint is relname and + * conname joined with a space. + */ cmpval = strcmp(obj1->name, obj2->name); if (cmpval != 0) return cmpval; - /* To have a stable sort order, break ties for some object types */ + /* + * Sort by type. This helps types that share a type priority without + * sharing a unique name constraint, e.g. opclass and opfamily. + */ + cmpval = obj1->objType - obj2->objType; + if (cmpval != 0) + return cmpval; + + /* + * To have a stable sort order, break ties for some object types. Most + * catalogs have a natural key, e.g. pg_proc_proname_args_nsp_index. Where + * the above "namespace" and "name" comparisons don't cover all natural + * key columns, compare the rest here. + * + * The natural key usually refers to other catalogs by surrogate keys. + * Hence, this translates each of those references to the natural key of + * the referenced catalog. That may descend through multiple levels of + * catalog references. For example, to sort by pg_proc.proargtypes, + * descend to each pg_type and then further to its pg_namespace, for an + * overall sort by (nspname, typname). + */ if (obj1->objType == DO_FUNC || obj1->objType == DO_AGG) { FuncInfo *fobj1 = *(FuncInfo *const *) p1; @@ -242,22 +271,10 @@ DOTypeNameCompare(const void *p1, const void *p2) return cmpval; for (i = 0; i < fobj1->nargs; i++) { - TypeInfo *argtype1 = findTypeByOid(fobj1->argtypes[i]); - TypeInfo *argtype2 = findTypeByOid(fobj2->argtypes[i]); - - if (argtype1 && argtype2) - { - if (argtype1->dobj.namespace && argtype2->dobj.namespace) - { - cmpval = strcmp(argtype1->dobj.namespace->dobj.name, - argtype2->dobj.namespace->dobj.name); - if (cmpval != 0) - return cmpval; - } - cmpval = strcmp(argtype1->dobj.name, argtype2->dobj.name); - if (cmpval != 0) - return cmpval; - } + cmpval = pgTypeNameCompare(fobj1->argtypes[i], + fobj2->argtypes[i]); + if (cmpval != 0) + return cmpval; } } else if (obj1->objType == DO_OPERATOR) @@ -269,6 +286,57 @@ DOTypeNameCompare(const void *p1, const void *p2) cmpval = (oobj2->oprkind - oobj1->oprkind); if (cmpval != 0) return cmpval; + /* Within an oprkind, sort by argument type names */ + cmpval = pgTypeNameCompare(oobj1->oprleft, oobj2->oprleft); + if (cmpval != 0) + return cmpval; + cmpval = pgTypeNameCompare(oobj1->oprright, oobj2->oprright); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_OPCLASS) + { + OpclassInfo *opcobj1 = *(OpclassInfo *const *) p1; + OpclassInfo *opcobj2 = *(OpclassInfo *const *) p2; + + /* Sort by access method name, per pg_opclass_am_name_nsp_index */ + cmpval = accessMethodNameCompare(opcobj1->opcmethod, + opcobj2->opcmethod); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_OPFAMILY) + { + OpfamilyInfo *opfobj1 = *(OpfamilyInfo *const *) p1; + OpfamilyInfo *opfobj2 = *(OpfamilyInfo *const *) p2; + + /* Sort by access method name, per pg_opfamily_am_name_nsp_index */ + cmpval = accessMethodNameCompare(opfobj1->opfmethod, + opfobj2->opfmethod); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_COLLATION) + { + CollInfo *cobj1 = *(CollInfo *const *) p1; + CollInfo *cobj2 = *(CollInfo *const *) p2; + + /* + * Sort by encoding, per pg_collation_name_enc_nsp_index. Technically, + * this is not necessary, because wherever this changes dump order, + * restoring the dump fails anyway. CREATE COLLATION can't create a + * tie for this to break, because it imposes restrictions to make + * (nspname, collname) uniquely identify a collation within a given + * DatabaseEncoding. While pg_import_system_collations() can create a + * tie, pg_dump+restore fails after + * pg_import_system_collations('my_schema') does so. However, there's + * little to gain by ignoring one natural key column on the basis of + * those limitations elsewhere, so respect the full natural key like + * we do for other object types. + */ + cmpval = cobj1->collencoding - cobj2->collencoding; + if (cmpval != 0) + return cmpval; } else if (obj1->objType == DO_ATTRDEF) { @@ -313,11 +381,143 @@ DOTypeNameCompare(const void *p1, const void *p2) if (cmpval != 0) return cmpval; } + else if (obj1->objType == DO_CONSTRAINT) + { + ConstraintInfo *robj1 = *(ConstraintInfo *const *) p1; + ConstraintInfo *robj2 = *(ConstraintInfo *const *) p2; - /* Usually shouldn't get here, but if we do, sort by OID */ + /* + * Sort domain constraints before table constraints, for consistency + * with our decision to sort CREATE DOMAIN before CREATE TABLE. + */ + if (robj1->condomain) + { + if (robj2->condomain) + { + /* Sort by domain name (domain namespace was considered) */ + cmpval = strcmp(robj1->condomain->dobj.name, + robj2->condomain->dobj.name); + if (cmpval != 0) + return cmpval; + } + else + return PRIO_TYPE - PRIO_TABLE; + } + else if (robj2->condomain) + return PRIO_TABLE - PRIO_TYPE; + else + { + /* Sort by table name (table namespace was considered already) */ + cmpval = strcmp(robj1->contable->dobj.name, + robj2->contable->dobj.name); + if (cmpval != 0) + return cmpval; + } + } + else if (obj1->objType == DO_PUBLICATION_REL) + { + PublicationRelInfo *probj1 = *(PublicationRelInfo *const *) p1; + PublicationRelInfo *probj2 = *(PublicationRelInfo *const *) p2; + + /* Sort by publication name, since (namespace, name) match the rel */ + cmpval = strcmp(probj1->publication->dobj.name, + probj2->publication->dobj.name); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_PUBLICATION_TABLE_IN_SCHEMA) + { + PublicationSchemaInfo *psobj1 = *(PublicationSchemaInfo *const *) p1; + PublicationSchemaInfo *psobj2 = *(PublicationSchemaInfo *const *) p2; + + /* Sort by publication name, since ->name is just nspname */ + cmpval = strcmp(psobj1->publication->dobj.name, + psobj2->publication->dobj.name); + if (cmpval != 0) + return cmpval; + } + + /* + * Shouldn't get here except after catalog corruption, but if we do, sort + * by OID. This may make logically-identical databases differ in the + * order of objects in dump output. Users will get spurious schema diffs. + * Expect flaky failures of 002_pg_upgrade.pl test 'dump outputs from + * original and restored regression databases match' if the regression + * database contains objects allowing that test to reach here. That's a + * consequence of the test using "pg_restore -j", which doesn't fully + * constrain OID assignment order. + */ + Assert(false); return oidcmp(obj1->catId.oid, obj2->catId.oid); } +/* Compare two OID-identified pg_type values by nspname, then by typname. */ +static int +pgTypeNameCompare(Oid typid1, Oid typid2) +{ + TypeInfo *typobj1; + TypeInfo *typobj2; + int cmpval; + + if (typid1 == typid2) + return 0; + + typobj1 = findTypeByOid(typid1); + typobj2 = findTypeByOid(typid2); + + if (!typobj1 || !typobj2) + { + /* + * getTypes() didn't find some OID. Assume catalog corruption, e.g. + * an oprright value without the corresponding OID in a pg_type row. + * Report as "equal", so the caller uses the next available basis for + * comparison, e.g. the next function argument. + * + * Unary operators have InvalidOid in oprleft (if oprkind='r') or in + * oprright (if oprkind='l'). Caller already sorted by oprkind, + * calling us only for like-kind operators. Hence, "typid1 == typid2" + * took care of InvalidOid. (v14 removed postfix operator support. + * Hence, when dumping from v14+, only oprleft can be InvalidOid.) + */ + Assert(false); + return 0; + } + + if (!typobj1->dobj.namespace || !typobj2->dobj.namespace) + Assert(false); /* catalog corruption */ + else + { + cmpval = strcmp(typobj1->dobj.namespace->dobj.name, + typobj2->dobj.namespace->dobj.name); + if (cmpval != 0) + return cmpval; + } + return strcmp(typobj1->dobj.name, typobj2->dobj.name); +} + +/* Compare two OID-identified pg_am values by amname. */ +static int +accessMethodNameCompare(Oid am1, Oid am2) +{ + AccessMethodInfo *amobj1; + AccessMethodInfo *amobj2; + + if (am1 == am2) + return 0; + + amobj1 = findAccessMethodByOid(am1); + amobj2 = findAccessMethodByOid(am2); + + if (!amobj1 || !amobj2) + { + /* catalog corruption: handle like pgTypeNameCompare() does */ + Assert(false); + return 0; + } + + return strcmp(amobj1->dobj.name, amobj2->dobj.name); +} + /* * Sort the given objects into a safe dump order using dependency diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 69dc6cfd859..e8d907cf3ae 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -1735,3 +1735,24 @@ DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; DROP ROLE regress_publication_user_dummy; +-- stage objects for pg_dump tests +CREATE SCHEMA pubme CREATE TABLE t0 (c int, d int) CREATE TABLE t1 (c int); +CREATE SCHEMA pubme2 CREATE TABLE t0 (c int, d int); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION dump_pub_qual_1ct FOR + TABLE ONLY pubme.t0 (c, d) WHERE (c > 0); +CREATE PUBLICATION dump_pub_qual_2ct FOR + TABLE ONLY pubme.t0 (c) WHERE (c > 0), + TABLE ONLY pubme.t1 (c); +CREATE PUBLICATION dump_pub_nsp_1ct FOR + TABLES IN SCHEMA pubme; +CREATE PUBLICATION dump_pub_nsp_2ct FOR + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2; +CREATE PUBLICATION dump_pub_all FOR + TABLE ONLY pubme.t0, + TABLE ONLY pubme.t1 WHERE (c < 0), + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2 + WITH (publish_via_partition_root = true); +RESET client_min_messages; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index d5051a5e746..46e14891c87 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -1100,3 +1100,25 @@ DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; DROP ROLE regress_publication_user_dummy; + +-- stage objects for pg_dump tests +CREATE SCHEMA pubme CREATE TABLE t0 (c int, d int) CREATE TABLE t1 (c int); +CREATE SCHEMA pubme2 CREATE TABLE t0 (c int, d int); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION dump_pub_qual_1ct FOR + TABLE ONLY pubme.t0 (c, d) WHERE (c > 0); +CREATE PUBLICATION dump_pub_qual_2ct FOR + TABLE ONLY pubme.t0 (c) WHERE (c > 0), + TABLE ONLY pubme.t1 (c); +CREATE PUBLICATION dump_pub_nsp_1ct FOR + TABLES IN SCHEMA pubme; +CREATE PUBLICATION dump_pub_nsp_2ct FOR + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2; +CREATE PUBLICATION dump_pub_all FOR + TABLE ONLY pubme.t0, + TABLE ONLY pubme.t1 WHERE (c < 0), + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2 + WITH (publish_via_partition_root = true); +RESET client_min_messages; From adfd8021911a302499187483c93814d24ca5ac44 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 1 Aug 2025 06:40:06 +0000 Subject: [PATCH 089/115] Fix a deadlock during ALTER SUBSCRIPTION ... DROP PUBLICATION. A deadlock can occur when the DDL command and the apply worker acquire catalog locks in different orders while dropping replication origins. The issue is rare in PG16 and higher branches because, in most cases, the tablesync worker performs the origin drop in those branches, and its locking sequence does not conflict with DDL operations. This patch ensures consistent lock acquisition to prevent such deadlocks. As per buildfarm. Reported-by: Alexander Lakhin Author: Ajin Cherian Reviewed-by: Hayato Kuroda Reviewed-by: vignesh C Reviewed-by: Amit Kapila Backpatch-through: 14, where it was introduced Discussion: https://postgr.es/m/bab95e12-6cc5-4ebb-80a8-3e41956aa297@gmail.com --- src/backend/catalog/pg_subscription.c | 33 ++++++++++++++++++--- src/backend/replication/logical/tablesync.c | 27 +++++++++++++++-- src/include/catalog/pg_subscription_rel.h | 2 ++ 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index d07f88ce280..7a1df9509ed 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -273,8 +273,8 @@ AddSubscriptionRelState(Oid subid, Oid relid, char state, * Update the state of a subscription table. */ void -UpdateSubscriptionRelState(Oid subid, Oid relid, char state, - XLogRecPtr sublsn) +UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, + XLogRecPtr sublsn, bool already_locked) { Relation rel; HeapTuple tup; @@ -282,9 +282,24 @@ UpdateSubscriptionRelState(Oid subid, Oid relid, char state, Datum values[Natts_pg_subscription_rel]; bool replaces[Natts_pg_subscription_rel]; - LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + if (already_locked) + { +#ifdef USE_ASSERT_CHECKING + LOCKTAG tag; - rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + Assert(CheckRelationOidLockedByMe(SubscriptionRelRelationId, + RowExclusiveLock, true)); + SET_LOCKTAG_OBJECT(tag, InvalidOid, SubscriptionRelationId, subid, 0); + Assert(LockHeldByMe(&tag, AccessShareLock)); +#endif + + rel = table_open(SubscriptionRelRelationId, NoLock); + } + else + { + LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + } /* Try finding existing mapping. */ tup = SearchSysCacheCopy2(SUBSCRIPTIONRELMAP, @@ -318,6 +333,16 @@ UpdateSubscriptionRelState(Oid subid, Oid relid, char state, table_close(rel, NoLock); } +/* + * Update the state of a subscription table. + */ +void +UpdateSubscriptionRelState(Oid subid, Oid relid, char state, + XLogRecPtr sublsn) +{ + UpdateSubscriptionRelStateEx(subid, relid, state, sublsn, false); +} + /* * Get state of subscription table. * diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index ca88133ed14..55af49b3230 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -425,6 +425,7 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) ListCell *lc; bool started_tx = false; bool should_exit = false; + Relation rel = NULL; Assert(!IsTransactionState()); @@ -492,7 +493,16 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) * worker to remove the origin tracking as if there is any * error while dropping we won't restart it to drop the * origin. So passing missing_ok = true. + * + * Lock the subscription and origin in the same order as we + * are doing during DDL commands to avoid deadlocks. See + * AlterSubscription_refresh. */ + LockSharedObject(SubscriptionRelationId, MyLogicalRepWorker->subid, + 0, AccessShareLock); + if (!rel) + rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + ReplicationOriginNameForLogicalRep(MyLogicalRepWorker->subid, rstate->relid, originname, @@ -502,9 +512,9 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) /* * Update the state to READY only after the origin cleanup. */ - UpdateSubscriptionRelState(MyLogicalRepWorker->subid, - rstate->relid, rstate->state, - rstate->lsn); + UpdateSubscriptionRelStateEx(MyLogicalRepWorker->subid, + rstate->relid, rstate->state, + rstate->lsn, true); } } else @@ -555,7 +565,14 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) * This is required to avoid any undetected deadlocks * due to any existing lock as deadlock detector won't * be able to detect the waits on the latch. + * + * Also close any tables prior to the commit. */ + if (rel) + { + table_close(rel, NoLock); + rel = NULL; + } CommitTransactionCommand(); pgstat_report_stat(false); } @@ -621,6 +638,10 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) } } + /* Close table if opened */ + if (rel) + table_close(rel, NoLock); + if (started_tx) { /* diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h index 60a2bcca238..9bced6697e9 100644 --- a/src/include/catalog/pg_subscription_rel.h +++ b/src/include/catalog/pg_subscription_rel.h @@ -84,6 +84,8 @@ extern void AddSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn); extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn); +extern void UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, + XLogRecPtr sublsn, bool already_locked); extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn); extern void RemoveSubscriptionRel(Oid subid, Oid relid); From b998ce3272ab45877f760ff558906a967b6a7da6 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Fri, 1 Aug 2025 16:52:11 -0500 Subject: [PATCH 090/115] Allow resetting unknown custom GUCs with reserved prefixes. Currently, ALTER DATABASE/ROLE/SYSTEM RESET [ALL] with an unknown custom GUC with a prefix reserved by MarkGUCPrefixReserved() errors (unless a superuser runs a RESET ALL variant). This is problematic for cases such as an extension library upgrade that removes a GUC. To fix, simply make sure the relevant code paths explicitly allow it. Note that we require superuser or privileges on the parameter to reset it. This is perhaps a bit more restrictive than is necessary, but it's not clear whether further relaxing the requirements is safe. Oversight in commit 88103567cb. The ALTER SYSTEM fix is dependent on commit 2d870b4aef, which first appeared in v17. Unfortunately, back-patching that commit would introduce ABI breakage, and while that breakage seems unlikely to bother anyone, it doesn't seem worth the risk. Hence, the ALTER SYSTEM part of this commit is omitted on v15 and v16. Reported-by: Mert Alev Reviewed-by: Laurenz Albe Discussion: https://postgr.es/m/18964-ba09dea8c98fccd6%40postgresql.org Backpatch-through: 15 --- contrib/auto_explain/Makefile | 2 ++ contrib/auto_explain/expected/alter_reset.out | 17 ++++++++++++++++ contrib/auto_explain/meson.build | 5 +++++ contrib/auto_explain/sql/alter_reset.sql | 20 +++++++++++++++++++ src/backend/utils/misc/guc.c | 14 +++++++++---- 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 contrib/auto_explain/expected/alter_reset.out create mode 100644 contrib/auto_explain/sql/alter_reset.sql diff --git a/contrib/auto_explain/Makefile b/contrib/auto_explain/Makefile index efd127d3cae..94ab28e7c06 100644 --- a/contrib/auto_explain/Makefile +++ b/contrib/auto_explain/Makefile @@ -6,6 +6,8 @@ OBJS = \ auto_explain.o PGFILEDESC = "auto_explain - logging facility for execution plans" +REGRESS = alter_reset + TAP_TESTS = 1 ifdef USE_PGXS diff --git a/contrib/auto_explain/expected/alter_reset.out b/contrib/auto_explain/expected/alter_reset.out new file mode 100644 index 00000000000..49317c76561 --- /dev/null +++ b/contrib/auto_explain/expected/alter_reset.out @@ -0,0 +1,17 @@ +-- +-- This tests resetting unknown custom GUCs with reserved prefixes. There's +-- nothing specific to auto_explain; this is just a convenient place to put +-- this test. +-- +SELECT current_database() AS datname \gset +CREATE ROLE regress_ae_role; +ALTER DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role IN DATABASE :"datname" SET auto_explain.bogus = 1; +LOAD 'auto_explain'; +WARNING: invalid configuration parameter name "auto_explain.bogus", removing it +DETAIL: "auto_explain" is now a reserved prefix. +ALTER DATABASE :"datname" RESET auto_explain.bogus; +ALTER ROLE regress_ae_role RESET auto_explain.bogus; +ALTER ROLE regress_ae_role IN DATABASE :"datname" RESET auto_explain.bogus; +DROP ROLE regress_ae_role; diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build index 2d5e6aa6ae1..0280d003ad0 100644 --- a/contrib/auto_explain/meson.build +++ b/contrib/auto_explain/meson.build @@ -20,6 +20,11 @@ tests += { 'name': 'auto_explain', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'alter_reset', + ], + }, 'tap': { 'tests': [ 't/001_auto_explain.pl', diff --git a/contrib/auto_explain/sql/alter_reset.sql b/contrib/auto_explain/sql/alter_reset.sql new file mode 100644 index 00000000000..3c472755d6a --- /dev/null +++ b/contrib/auto_explain/sql/alter_reset.sql @@ -0,0 +1,20 @@ +-- +-- This tests resetting unknown custom GUCs with reserved prefixes. There's +-- nothing specific to auto_explain; this is just a convenient place to put +-- this test. +-- + +SELECT current_database() AS datname \gset +CREATE ROLE regress_ae_role; + +ALTER DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role IN DATABASE :"datname" SET auto_explain.bogus = 1; + +LOAD 'auto_explain'; + +ALTER DATABASE :"datname" RESET auto_explain.bogus; +ALTER ROLE regress_ae_role RESET auto_explain.bogus; +ALTER ROLE regress_ae_role IN DATABASE :"datname" RESET auto_explain.bogus; + +DROP ROLE regress_ae_role; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 96c8783fb32..d955397e94c 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -6561,6 +6561,7 @@ validate_option_array_item(const char *name, const char *value, { struct config_generic *gconf; + bool reset_custom; /* * There are three cases to consider: @@ -6579,16 +6580,21 @@ validate_option_array_item(const char *name, const char *value, * it's assumed to be fully validated.) * * name is not known and can't be created as a placeholder. Throw error, - * unless skipIfNoPermissions is true, in which case return false. + * unless skipIfNoPermissions or reset_custom is true. If reset_custom is + * true, this is a RESET or RESET ALL operation for an unknown custom GUC + * with a reserved prefix, in which case we want to fall through to the + * placeholder case described in the preceding paragraph (else there'd be + * no way for users to remove them). Otherwise, return false. */ - gconf = find_option(name, true, skipIfNoPermissions, ERROR); - if (!gconf) + reset_custom = (!value && valid_custom_variable_name(name)); + gconf = find_option(name, true, skipIfNoPermissions || reset_custom, ERROR); + if (!gconf && !reset_custom) { /* not known, failed to make a placeholder */ return false; } - if (gconf->flags & GUC_CUSTOM_PLACEHOLDER) + if (!gconf || gconf->flags & GUC_CUSTOM_PLACEHOLDER) { /* * We cannot do any meaningful check on the value, so only permissions From ec96e88122c88866b1143c75048f28111b4eb344 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sat, 2 Aug 2025 17:08:52 +0900 Subject: [PATCH 091/115] Fix use-after-free with INSERT ON CONFLICT changes in reorderbuffer.c In ReorderBufferProcessTXN(), used to send the data of a transaction to an output plugin, INSERT ON CONFLICT changes (INTERNAL_SPEC_INSERT) are delayed until a confirmation record arrives (INTERNAL_SPEC_CONFIRM), updating the change being processed. 8c58624df462 has added an extra step after processing a change to update the progress of the transaction, by calling the callback update_progress_txn() based on the LSN stored in a change after a threshold of CHANGES_THRESHOLD (100) is reached. This logic has missed the fact that for an INSERT ON CONFLICT change the data is freed once processed, hence update_progress_txn() could be called pointing to a LSN value that's already been freed. This could result in random crashes, depending on the workload. Per discussion, this issue is fixed by reusing in update_progress_txn() the LSN from the change processed found at the beginning of the loop, meaning that for a INTERNAL_SPEC_CONFIRM change the progress is updated using the LSN of the INTERNAL_SPEC_CONFIRM change, and not the LSN from its INTERNAL_SPEC_INSERT change. This is actually more correct, as we want to update the progress to point to the INTERNAL_SPEC_CONFIRM change. Masahiko Sawada has found a nice trick to reproduce the issue: hardcode CHANGES_THRESHOLD at 1 and run test_decoding (test "ddl" being enough) on an instance running valgrind. The bug has been analyzed by Ethan Mertz, who also originally suggested the solution used in this patch. Issue introduced by 8c58624df462, so backpatch down to v16. Author: Ethan Mertz Co-authored-by: Michael Paquier Reviewed-by: Amit Kapila Reviewed-by: Masahiko Sawada Discussion: https://postgr.es/m/aIsQqDZ7x4LAQ6u1@paquier.xyz Backpatch-through: 16 --- src/backend/replication/logical/reorderbuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 6464a926c20..08ef94728eb 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2480,7 +2480,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, if (++changes_count >= CHANGES_THRESHOLD) { - rb->update_progress_txn(rb, txn, change->lsn); + rb->update_progress_txn(rb, txn, prev_lsn); changes_count = 0; } } From cd45fef058abc412ee3595cced5b68c4957f0499 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Sat, 2 Aug 2025 18:30:02 +0900 Subject: [PATCH 092/115] Doc: clarify the restrictions of AFTER triggers with transition tables. It was not very clear that the triggers are only allowed on plain tables (not foreign tables). Also, rephrase the documentation for better readability. Follow up to commit 9e6104c66. Reported-by: Etsuro Fujita Author: Ashutosh Bapat Reviewed-by: Etsuro Fujita Discussion: https://postgr.es/m/CAPmGK16XBs9ptNr8Lk4f-tJZogf6y-Prz%3D8yhvJbb_4dpsc3mQ%40mail.gmail.com Backpatch-through: 13 --- doc/src/sgml/ref/create_trigger.sgml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml index 982ab6f3ee4..71869c996e3 100644 --- a/doc/src/sgml/ref/create_trigger.sgml +++ b/doc/src/sgml/ref/create_trigger.sgml @@ -197,9 +197,11 @@ CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name of the rows inserted, deleted, or modified by the current SQL statement. This feature lets the trigger see a global view of what the statement did, not just one row at a time. This option is only allowed for - an AFTER trigger that is not a constraint trigger; also, if - the trigger is an UPDATE trigger, it must not specify - a column_name list. + an AFTER trigger on a plain table (not a foreign table). + The trigger should not be a constraint trigger. Also, if the trigger is + an UPDATE trigger, it must not specify + a column_name list when using + this option. OLD TABLE may only be specified once, and only for a trigger that can fire on UPDATE or DELETE; it creates a transition relation containing the before-images of all rows From 1d3ded521a0be7f46dde132053d876ec1cad2784 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Sun, 3 Aug 2025 10:50:22 +0900 Subject: [PATCH 093/115] Fix assertion failure in pgbench when handling multiple pipeline sync messages. Previously, when running pgbench in pipeline mode with a custom script that triggered retriable errors (e.g., serialization errors), an assertion failure could occur: Assertion failed: (res == ((void*)0)), function discardUntilSync, file pgbench.c, line 3515. The root cause was that pgbench incorrectly assumed only a single pipeline sync message would be received at the end. In reality, multiple pipeline sync messages can be sent and must be handled properly. This commit fixes the issue by updating pgbench to correctly process multiple pipeline sync messages, preventing the assertion failure. Back-patch to v15, where the bug was introduced. Author: Fujii Masao Reviewed-by: Tatsuo Ishii Discussion: https://postgr.es/m/CAHGQGwFAX56Tfx+1ppo431OSWiLLuW72HaGzZ39NkLkop6bMzQ@mail.gmail.com Backpatch-through: 15 --- src/bin/pgbench/pgbench.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 4c3a6a44f43..34ac280c1b8 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3459,6 +3459,8 @@ doRetry(CState *st, pg_time_usec_t *now) static int discardUntilSync(CState *st) { + bool received_sync = false; + /* send a sync */ if (!PQpipelineSync(st->con)) { @@ -3473,10 +3475,16 @@ discardUntilSync(CState *st) PGresult *res = PQgetResult(st->con); if (PQresultStatus(res) == PGRES_PIPELINE_SYNC) + received_sync = true; + else if (received_sync) { - PQclear(res); - res = PQgetResult(st->con); + /* + * PGRES_PIPELINE_SYNC must be followed by another + * PGRES_PIPELINE_SYNC or NULL; otherwise, assert failure. + */ Assert(res == NULL); + + PQclear(res); break; } PQclear(res); From 479ebce12d320d23f960428b5221870c3633f1bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Mon, 4 Aug 2025 13:26:44 +0200 Subject: [PATCH 094/115] doc: mention unusability of dropped CHECK to verify NOT NULL It's possible to use a CHECK (col IS NOT NULL) constraint to skip scanning a table for nulls when adding a NOT NULL constraint on the same column. However, if the CHECK constraint is dropped on the same command that the NOT NULL is added, this fails, i.e., makes the NOT NULL addition slow. The best we can do about it at this stage is to document this so that users aren't taken by surprise. (In Postgres 18 you can directly add the NOT NULL constraint as NOT VALID instead, so there's no longer much use for the CHECK constraint, therefore no point in building mechanism to support the case better.) Reported-by: Andrew Reviewed-by: David G. Johnston Discussion: https://postgr.es/m/175385113607.786.16774570234342968908@wrigleys.postgresql.org --- doc/src/sgml/ref/alter_table.sgml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 115da7a7337..3cbf60e1b0d 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -237,9 +237,10 @@ WITH ( MODULUS numeric_literal, REM provided none of the records in the table contain a NULL value for the column. Ordinarily this is checked during the ALTER TABLE by scanning the - entire table; however, if a valid CHECK constraint is - found which proves no NULL can exist, then the - table scan is skipped. + entire table; + however, if a valid CHECK constraint exists + (and is not dropped in the same command) which proves no + NULL can exist, then the table scan is skipped. From 112945a61e2331a70470b7a5c8b68b58065ff34b Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Mon, 4 Aug 2025 16:22:29 +0100 Subject: [PATCH 095/115] Fix typo in create_index.sql. Introduced by 578b229718e. Author: Dean Rasheed Reviewed-by: Tender Wang Discussion: https://postgr.es/m/CAEZATCV_CzRSOPMf1gbHQ7xTmyrV6kE7ViCBD6B81WF7GfTAEA@mail.gmail.com Backpatch-through: 13 --- src/test/regress/expected/create_index.out | 4 ++-- src/test/regress/sql/create_index.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index acfd9d1f4f7..c90d0e40145 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -1606,8 +1606,8 @@ DROP TABLE cwi_test; -- CREATE TABLE syscol_table (a INT); -- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); -ERROR: relation "syscolcol_table" does not exist +CREATE INDEX ON syscol_table (ctid); +ERROR: index creation on system columns is not supported -- nor used in expressions CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); ERROR: index creation on system columns is not supported diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index d49ce9f3007..24241a40cec 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -629,7 +629,7 @@ DROP TABLE cwi_test; CREATE TABLE syscol_table (a INT); -- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); +CREATE INDEX ON syscol_table (ctid); -- nor used in expressions CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); From 3c2c3f2ddb0f27062b73cea500f806e42f01db33 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Mon, 4 Aug 2025 15:07:00 -0400 Subject: [PATCH 096/115] Minor test fixes in 035_standby_logical_decoding.pl Import usleep, which, due to an oversight in oversight in commit 48796a98d5ae was used but not imported. Correct the comparison string used in two logfile checks. Previously, it was incorrect and thus the test could never have failed. Also wordsmith a comment to make it clear when hot_standby_feedback is meant to be on during the test scenarios. Reported-by: Melanie Plageman Author: Bertrand Drouvot Reviewed-by: Masahiko Sawada Discussion: https://postgr.es/m/flat/CAAKRu_YO2mEm%3DZWZKPjTMU%3DgW5Y83_KMi_1cr51JwavH0ctd7w%40mail.gmail.com Backpatch-through: 16 --- src/test/recovery/t/035_standby_logical_decoding.pl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index 360ed826094..5fdc1803a9f 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -8,6 +8,7 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; +use Time::HiRes qw(usleep); use Test::More; my ($stdin, $stdout, $stderr, @@ -577,7 +578,7 @@ sub wait_until_vacuum_can_remove /ERROR: cannot copy invalidated replication slot "vacuum_full_inactiveslot"/, "invalidated slot cannot be copied"); -# Turn hot_standby_feedback back on +# Set hot_standby_feedback to on change_hot_standby_feedback_and_wait_for_xmins(1, 1); ################################################## @@ -720,12 +721,12 @@ sub wait_until_vacuum_can_remove # message should not be issued ok( !$node_standby->log_contains( - "invalidating obsolete slot \"no_conflict_inactiveslot\"", $logstart), + "invalidating obsolete replication slot \"no_conflict_inactiveslot\"", $logstart), 'inactiveslot slot invalidation is not logged with vacuum on conflict_test' ); ok( !$node_standby->log_contains( - "invalidating obsolete slot \"no_conflict_activeslot\"", $logstart), + "invalidating obsolete replication slot \"no_conflict_activeslot\"", $logstart), 'activeslot slot invalidation is not logged with vacuum on conflict_test' ); From b9279058a3ca416e42dd73a54c426c8e43f6c8ca Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 5 Aug 2025 16:51:10 -0400 Subject: [PATCH 097/115] Fix incorrect return value in brin_minmax_multi_distance_numeric(). The result of "DirectFunctionCall1(numeric_float8, d)" is already in Datum form, but the code was incorrectly applying PG_RETURN_FLOAT8() to it. On machines where float8 is pass-by-reference, this would result in complete garbage, since an unpredictable pointer value would be treated as an integer and then converted to float. It's not entirely clear how much of a problem would ensue on 64-bit hardware, but certainly interpreting a float8 bitpattern as uint64 and then converting that to float isn't the intended behavior. As luck would have it, even the complete-garbage case doesn't break BRIN indexes, since the results are only used to make choices about how to merge values into ranges: at worst, we'd make poor choices resulting in an inefficient index. Doubtless that explains the lack of field complaints. However, users with BRIN indexes that use the numeric_minmax_multi_ops opclass may wish to reindex in hopes of making their indexes more efficient. Author: Peter Eisentraut Co-authored-by: Tom Lane Discussion: https://postgr.es/m/2093712.1753983215@sss.pgh.pa.us Backpatch-through: 14 --- src/backend/access/brin/brin_minmax_multi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 17c82c7c6e3..549f5fbb072 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -2027,7 +2027,7 @@ brin_minmax_multi_distance_numeric(PG_FUNCTION_ARGS) d = DirectFunctionCall2(numeric_sub, a2, a1); /* a2 - a1 */ - PG_RETURN_FLOAT8(DirectFunctionCall1(numeric_float8, d)); + PG_RETURN_DATUM(DirectFunctionCall1(numeric_float8, d)); } /* From 05b367bea4e36a3b747b7aaf6f3ffe72bb6b825e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 7 Aug 2025 11:48:43 +0200 Subject: [PATCH 098/115] pg_upgrade: Improve message indentation Fix commit f295494d338 to use consistent four-space indentation for verbose messages. --- src/bin/pg_upgrade/check.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 0aee919c44a..73f361a1b4b 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -1177,7 +1177,7 @@ check_for_not_null_inheritance(ClusterInfo *cluster) "If the parent column(s) are NOT NULL, then the child column must\n" "also be marked NOT NULL, or the upgrade will fail.\n" "You can fix this by running\n" - " ALTER TABLE tablename ALTER column SET NOT NULL;\n" + " ALTER TABLE tablename ALTER column SET NOT NULL;\n" "on each column listed in the file:\n" " %s", output_path); } From aae9aad19d824af72640f4597a812d75ae25e385 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Thu, 7 Aug 2025 17:14:39 +0700 Subject: [PATCH 099/115] Update ICU C++ API symbols Recent ICU versions have added U_SHOW_CPLUSPLUS_HEADER_API, and we need to set this to zero as well to hide the ICU C++ APIs from pg_locale.h Per discussion, we want cpluspluscheck to work cleanly in backbranches, so backpatch both this and its predecessor commit ed26c4e25a4 to all supported versions. Reported-by: Tom Lane Discussion: https://postgr.es/m/1115793.1754414782%40sss.pgh.pa.us Backpatch-through: 13 --- .cirrus.tasks.yml | 3 --- src/include/utils/pg_locale.h | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index d12360aa356..aa01f57202c 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -773,14 +773,11 @@ task: # - Don't use ccache, the files are uncacheable, polluting ccache's # cache # - Use -fmax-errors, as particularly cpluspluscheck can be very verbose - # - XXX have to disable ICU to avoid errors: - # https://postgr.es/m/20220323002024.f2g6tivduzrktgfa%40alap3.anarazel.de ### always: headers_headerscheck_script: | time ./configure \ ${LINUX_CONFIGURE_FEATURES} \ - --without-icu \ --quiet \ CC="gcc" CXX"=g++" CLANG="clang" make -s -j${BUILD_JOBS} clean diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index e2a72435427..73d3e6e9310 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -16,6 +16,11 @@ #include #endif #ifdef USE_ICU +/* only include the C APIs, to avoid errors in cpluspluscheck */ +#undef U_SHOW_CPLUSPLUS_API +#define U_SHOW_CPLUSPLUS_API 0 +#undef U_SHOW_CPLUSPLUS_HEADER_API +#define U_SHOW_CPLUSPLUS_HEADER_API 0 #include #endif From b862465dba3386c24328c6f7d92499ea32d71a73 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 7 Aug 2025 14:11:49 +0300 Subject: [PATCH 100/115] Revert "Clarify documentation for the initcap function" This reverts commit 1fe9e3822c4e574aa526b99af723e61e03f36d4f. That commit was a documentation improvement, not a bug fix. We don't normally backpatch such changes. Discussion: https://postgr.es/m/d8eacbeb8194c578a98317b86d7eb2ef0b6eb0e0.camel%40j-davis.com --- doc/src/sgml/func.sgml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 332d9175e26..4faa7782dce 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -3049,11 +3049,8 @@ repeat('Pg', 4) PgPgPgPg Converts the first letter of each word to upper case and the - rest to lower case. When using the libc locale - provider, words are sequences of alphanumeric characters separated - by non-alphanumeric characters; when using the ICU locale provider, - words are separated according to - Unicode Standard Annex #29. + rest to lower case. Words are sequences of alphanumeric + characters separated by non-alphanumeric characters. initcap('hi THOMAS') From 2ac50f1187c2007f6ed581db6ee7240c5e5a37e6 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 7 Aug 2025 14:29:02 +0300 Subject: [PATCH 101/115] Fix checkpointer shared memory allocation Use Min(NBuffers, MAX_CHECKPOINT_REQUESTS) instead of NBuffers in CheckpointerShmemSize() to match the actual array size limit set in CheckpointerShmemInit(). This prevents wasting shared memory when NBuffers > MAX_CHECKPOINT_REQUESTS. Also, fix the comment. Reported-by: Tom Lane Discussion: https://postgr.es/m/1439188.1754506714%40sss.pgh.pa.us Author: Xuneng Zhou Co-authored-by: Alexander Korotkov --- src/backend/postmaster/checkpointer.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index e93bf38a4f6..147abe9259f 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -873,11 +873,14 @@ CheckpointerShmemSize(void) Size size; /* - * Currently, the size of the requests[] array is arbitrarily set equal to - * NBuffers. This may prove too large or small ... + * The size of the requests[] array is arbitrarily set equal to NBuffers. + * But there is a cap of MAX_CHECKPOINT_REQUESTS to prevent accumulating + * too many checkpoint requests in the ring buffer. */ size = offsetof(CheckpointerShmemStruct, requests); - size = add_size(size, mul_size(NBuffers, sizeof(CheckpointerRequest))); + size = add_size(size, mul_size(Min(NBuffers, + MAX_CHECKPOINT_REQUESTS), + sizeof(CheckpointerRequest))); return size; } From 3a3b1d7ab1809910e51ca19e116080311579d75a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 7 Aug 2025 18:04:45 -0400 Subject: [PATCH 102/115] doc: add float as an alias for double precision. Although the "Floating-Point Types" section says that "float" data type is taken to mean "double precision", this information was not reflected in the data type table that lists all data type aliases. Reported-by: alexander.kjall@hafslund.no Author: Euler Taveira Reviewed-by: Tom Lane Discussion: https://postgr.es/m/175456294638.800.12038559679827947313@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/datatype.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index d621437c414..7cb65652579 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -117,7 +117,7 @@ double precision - float8 + float, float8 double precision floating-point number (8 bytes) From 06f44481646a669b43a19a2c501a164459d194f1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 8 Aug 2025 00:27:14 +0200 Subject: [PATCH 103/115] pg_upgrade: Make format strings consistent The backport of commit f295494d338 introduced a format string using %m. This is not wrong, since those have been supported since commit d6c55de1f99a, but only commit 2c8118ee5d9 later introduced their use in this file. This use introduces a gratuitously different translatable string and also makes it inconsistent with the rest of the file. To avoid that, switch this back to the old-style strerror() route in the appropriate backbranches --- src/bin/pg_upgrade/check.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 73f361a1b4b..f3bd6a2102f 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -1152,7 +1152,7 @@ check_for_not_null_inheritance(ClusterInfo *cluster) for (int i = 0; i < ntup; i++) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %m", output_path); + pg_fatal("could not open file \"%s\": %s", output_path, strerror(errno)); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); From f770006928d0a697e0fe0463cdb3e052b86ef940 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 8 Aug 2025 09:07:54 +0900 Subject: [PATCH 104/115] Add information about "generation" when dropping twice pgstats entry Dropping twice a pgstats entry should not happen, and the error report generated was missing the "generation" counter (tracking when an entry is reused) that has been added in 818119afccd3. Like d92573adcb02, backpatch down to v15 where this information is useful to have, to gather more information from instances where the problem shows up. A report has shown that this error path has been reached on a standby based on 17.3, for a relation stats entry and an OID close to wraparound. Author: Bertrand Drouvot Discussion: https://postgr.es/m/CAN4RuQvYth942J2+FcLmJKgdpq6fE5eqyFvb_PuskxF2eL=Wzg@mail.gmail.com Backpatch-through: 15 --- src/backend/utils/activity/pgstat_shmem.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 0225c794774..84d1576e10c 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -837,10 +837,11 @@ pgstat_drop_entry_internal(PgStatShared_HashEntry *shent, */ if (shent->dropped) elog(ERROR, - "trying to drop stats entry already dropped: kind=%s dboid=%u objoid=%u refcount=%u", + "trying to drop stats entry already dropped: kind=%s dboid=%u objoid=%u refcount=%u generation=%u", pgstat_get_kind_info(shent->key.kind)->name, shent->key.dboid, shent->key.objoid, - pg_atomic_read_u32(&shent->refcount)); + pg_atomic_read_u32(&shent->refcount), + pg_atomic_read_u32(&shent->generation)); shent->dropped = true; /* release refcount marking entry as not dropped */ From 9cca445dfd2c39c1dbc031bb1596c67594b54668 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Fri, 8 Aug 2025 10:50:02 +0900 Subject: [PATCH 105/115] Disallow collecting transition tuples from child foreign tables. Commit 9e6104c66 disallowed transition tables on foreign tables, but failed to account for cases where a foreign table is a child table of a partitioned/inherited table on which transition tables exist, leading to incorrect transition tuples collected from such foreign tables for queries on the parent table triggering transition capture. This occurred not only for inherited UPDATE/DELETE but for partitioned INSERT later supported by commit 3d956d956, which should have handled it at least for the INSERT case, but didn't. To fix, modify ExecAR*Triggers to throw an error if the given relation is a foreign table requesting transition capture. Also, this commit fixes make_modifytable so that in case of an inherited UPDATE/DELETE triggering transition capture, FDWs choose normal operations to modify child foreign tables, not DirectModify; which is needed because they would otherwise skip the calls to ExecAR*Triggers at execution, causing unexpected behavior. Author: Etsuro Fujita Reviewed-by: Amit Langote Discussion: https://postgr.es/m/CAPmGK14QJYikKzBDCe3jMbpGENnQ7popFmbEgm-XTNuk55oyHg%40mail.gmail.com Backpatch-through: 13 --- .../postgres_fdw/expected/postgres_fdw.out | 113 ++++++++++++++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 78 ++++++++++++ src/backend/commands/trigger.c | 28 +++++ src/backend/optimizer/plan/createplan.c | 18 ++- src/backend/optimizer/util/plancat.c | 54 +++++++++ src/include/optimizer/plancat.h | 2 + 6 files changed, 291 insertions(+), 2 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index b534d860560..429af2b73f1 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -7723,6 +7723,119 @@ DELETE FROM rem1; -- can't be pushed down (5 rows) DROP TRIGGER trig_row_after_delete ON rem1; +-- We are allowed to create transition-table triggers on both kinds of +-- inheritance even if they contain foreign tables as children, but currently +-- collecting transition tuples from such foreign tables is not supported. +CREATE TABLE local_tbl (a text, b int); +CREATE FOREIGN TABLE foreign_tbl (a text, b int) + SERVER loopback OPTIONS (table_name 'local_tbl'); +INSERT INTO foreign_tbl VALUES ('AAA', 42); +-- Test case for partition hierarchy +CREATE TABLE parent_tbl (a text, b int) PARTITION BY LIST (a); +ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES IN ('AAA'); +CREATE TRIGGER parent_tbl_insert_trig + AFTER INSERT ON parent_tbl REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +INSERT INTO parent_tbl VALUES ('AAA', 42); +ERROR: cannot collect transition tuples from child foreign tables +COPY parent_tbl (a, b) FROM stdin; +ERROR: cannot collect transition tuples from child foreign tables +CONTEXT: COPY parent_tbl, line 1: "AAA 42" +ALTER SERVER loopback OPTIONS (ADD batch_size '10'); +INSERT INTO parent_tbl VALUES ('AAA', 42); +ERROR: cannot collect transition tuples from child foreign tables +COPY parent_tbl (a, b) FROM stdin; +ERROR: cannot collect transition tuples from child foreign tables +CONTEXT: COPY parent_tbl, line 1: "AAA 42" +ALTER SERVER loopback OPTIONS (DROP batch_size); +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Update on public.parent_tbl + Foreign Update on public.foreign_tbl parent_tbl_1 + Remote SQL: UPDATE public.local_tbl SET b = $2 WHERE ctid = $1 + -> Foreign Scan on public.foreign_tbl parent_tbl_1 + Output: (parent_tbl_1.b + 1), parent_tbl_1.tableoid, parent_tbl_1.ctid, parent_tbl_1.* + Remote SQL: SELECT a, b, ctid FROM public.local_tbl FOR UPDATE +(6 rows) + +UPDATE parent_tbl SET b = b + 1; +ERROR: cannot collect transition tuples from child foreign tables +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; + QUERY PLAN +------------------------------------------------------------------ + Delete on public.parent_tbl + Foreign Delete on public.foreign_tbl parent_tbl_1 + Remote SQL: DELETE FROM public.local_tbl WHERE ctid = $1 + -> Foreign Scan on public.foreign_tbl parent_tbl_1 + Output: parent_tbl_1.tableoid, parent_tbl_1.ctid + Remote SQL: SELECT ctid FROM public.local_tbl FOR UPDATE +(6 rows) + +DELETE FROM parent_tbl; +ERROR: cannot collect transition tuples from child foreign tables +ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl; +DROP TABLE parent_tbl; +-- Test case for non-partition hierarchy +CREATE TABLE parent_tbl (a text, b int); +ALTER FOREIGN TABLE foreign_tbl INHERIT parent_tbl; +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; + QUERY PLAN +------------------------------------------------------------------------------------------------------ + Update on public.parent_tbl + Update on public.parent_tbl parent_tbl_1 + Foreign Update on public.foreign_tbl parent_tbl_2 + Remote SQL: UPDATE public.local_tbl SET b = $2 WHERE ctid = $1 + -> Result + Output: (parent_tbl.b + 1), parent_tbl.tableoid, parent_tbl.ctid, (NULL::record) + -> Append + -> Seq Scan on public.parent_tbl parent_tbl_1 + Output: parent_tbl_1.b, parent_tbl_1.tableoid, parent_tbl_1.ctid, NULL::record + -> Foreign Scan on public.foreign_tbl parent_tbl_2 + Output: parent_tbl_2.b, parent_tbl_2.tableoid, parent_tbl_2.ctid, parent_tbl_2.* + Remote SQL: SELECT a, b, ctid FROM public.local_tbl FOR UPDATE +(12 rows) + +UPDATE parent_tbl SET b = b + 1; +ERROR: cannot collect transition tuples from child foreign tables +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; + QUERY PLAN +------------------------------------------------------------------------ + Delete on public.parent_tbl + Delete on public.parent_tbl parent_tbl_1 + Foreign Delete on public.foreign_tbl parent_tbl_2 + Remote SQL: DELETE FROM public.local_tbl WHERE ctid = $1 + -> Append + -> Seq Scan on public.parent_tbl parent_tbl_1 + Output: parent_tbl_1.tableoid, parent_tbl_1.ctid + -> Foreign Scan on public.foreign_tbl parent_tbl_2 + Output: parent_tbl_2.tableoid, parent_tbl_2.ctid + Remote SQL: SELECT ctid FROM public.local_tbl FOR UPDATE +(10 rows) + +DELETE FROM parent_tbl; +ERROR: cannot collect transition tuples from child foreign tables +ALTER FOREIGN TABLE foreign_tbl NO INHERIT parent_tbl; +DROP TABLE parent_tbl; +-- Cleanup +DROP FOREIGN TABLE foreign_tbl; +DROP TABLE local_tbl; -- =================================================================== -- test inheritance features -- =================================================================== diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 80cc3f9d8e7..c353bca0bc7 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -2088,6 +2088,84 @@ EXPLAIN (verbose, costs off) DELETE FROM rem1; -- can't be pushed down DROP TRIGGER trig_row_after_delete ON rem1; + +-- We are allowed to create transition-table triggers on both kinds of +-- inheritance even if they contain foreign tables as children, but currently +-- collecting transition tuples from such foreign tables is not supported. + +CREATE TABLE local_tbl (a text, b int); +CREATE FOREIGN TABLE foreign_tbl (a text, b int) + SERVER loopback OPTIONS (table_name 'local_tbl'); + +INSERT INTO foreign_tbl VALUES ('AAA', 42); + +-- Test case for partition hierarchy +CREATE TABLE parent_tbl (a text, b int) PARTITION BY LIST (a); +ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES IN ('AAA'); + +CREATE TRIGGER parent_tbl_insert_trig + AFTER INSERT ON parent_tbl REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); + +INSERT INTO parent_tbl VALUES ('AAA', 42); + +COPY parent_tbl (a, b) FROM stdin; +AAA 42 +\. + +ALTER SERVER loopback OPTIONS (ADD batch_size '10'); + +INSERT INTO parent_tbl VALUES ('AAA', 42); + +COPY parent_tbl (a, b) FROM stdin; +AAA 42 +\. + +ALTER SERVER loopback OPTIONS (DROP batch_size); + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; +UPDATE parent_tbl SET b = b + 1; + +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; +DELETE FROM parent_tbl; + +ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl; +DROP TABLE parent_tbl; + +-- Test case for non-partition hierarchy +CREATE TABLE parent_tbl (a text, b int); +ALTER FOREIGN TABLE foreign_tbl INHERIT parent_tbl; + +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; +UPDATE parent_tbl SET b = b + 1; + +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; +DELETE FROM parent_tbl; + +ALTER FOREIGN TABLE foreign_tbl NO INHERIT parent_tbl; +DROP TABLE parent_tbl; + +-- Cleanup +DROP FOREIGN TABLE foreign_tbl; +DROP TABLE local_tbl; + -- =================================================================== -- test inheritance features -- =================================================================== diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index d90571545e6..3e27683a49e 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -2543,6 +2543,15 @@ ExecARInsertTriggers(EState *estate, ResultRelInfo *relinfo, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + transition_capture->tcs_insert_new_table) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_insert_after_row) || (transition_capture && transition_capture->tcs_insert_new_table)) AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, @@ -2786,6 +2795,15 @@ ExecARDeleteTriggers(EState *estate, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + transition_capture->tcs_delete_old_table) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_delete_after_row) || (transition_capture && transition_capture->tcs_delete_old_table)) { @@ -3112,6 +3130,16 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + (transition_capture->tcs_update_old_table || + transition_capture->tcs_update_new_table)) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_update_after_row) || (transition_capture && (transition_capture->tcs_update_old_table || diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 1d9423abdc8..942392218cf 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -6988,6 +6988,8 @@ make_modifytable(PlannerInfo *root, Plan *subplan, List *mergeActionLists, int epqParam) { ModifyTable *node = makeNode(ModifyTable); + bool transition_tables = false; + bool transition_tables_valid = false; List *fdw_private_list; Bitmapset *direct_modify_plans; ListCell *lc; @@ -7131,7 +7133,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan, * callback functions needed for that and (2) there are no local * structures that need to be run for each modified row: row-level * triggers on the foreign table, stored generated columns, WITH CHECK - * OPTIONs from parent views. + * OPTIONs from parent views, transition tables on the named relation. */ direct_modify = false; if (fdwroutine != NULL && @@ -7142,7 +7144,19 @@ make_modifytable(PlannerInfo *root, Plan *subplan, withCheckOptionLists == NIL && !has_row_triggers(root, rti, operation) && !has_stored_generated_columns(root, rti)) - direct_modify = fdwroutine->PlanDirectModify(root, node, rti, i); + { + /* transition_tables is the same for all result relations */ + if (!transition_tables_valid) + { + transition_tables = has_transition_tables(root, + nominalRelation, + operation); + transition_tables_valid = true; + } + if (!transition_tables) + direct_modify = fdwroutine->PlanDirectModify(root, node, + rti, i); + } if (direct_modify) direct_modify_plans = bms_add_member(direct_modify_plans, i); diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 1a3045479ff..dd34881bfc3 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -2252,6 +2252,60 @@ has_row_triggers(PlannerInfo *root, Index rti, CmdType event) return result; } +/* + * has_transition_tables + * + * Detect whether the specified relation has any transition tables for event. + */ +bool +has_transition_tables(PlannerInfo *root, Index rti, CmdType event) +{ + RangeTblEntry *rte = planner_rt_fetch(rti, root); + Relation relation; + TriggerDesc *trigDesc; + bool result = false; + + Assert(rte->rtekind == RTE_RELATION); + + /* Currently foreign tables cannot have transition tables */ + if (rte->relkind == RELKIND_FOREIGN_TABLE) + return result; + + /* Assume we already have adequate lock */ + relation = table_open(rte->relid, NoLock); + + trigDesc = relation->trigdesc; + switch (event) + { + case CMD_INSERT: + if (trigDesc && + trigDesc->trig_insert_new_table) + result = true; + break; + case CMD_UPDATE: + if (trigDesc && + (trigDesc->trig_update_old_table || + trigDesc->trig_update_new_table)) + result = true; + break; + case CMD_DELETE: + if (trigDesc && + trigDesc->trig_delete_old_table) + result = true; + break; + /* There is no separate event for MERGE, only INSERT/UPDATE/DELETE */ + case CMD_MERGE: + result = false; + break; + default: + elog(ERROR, "unrecognized CmdType: %d", (int) event); + break; + } + + table_close(relation, NoLock); + return result; +} + /* * has_stored_generated_columns * diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index eb1c3ccc4bf..dbb7eb86808 100644 --- a/src/include/optimizer/plancat.h +++ b/src/include/optimizer/plancat.h @@ -72,6 +72,8 @@ extern double get_function_rows(PlannerInfo *root, Oid funcid, Node *node); extern bool has_row_triggers(PlannerInfo *root, Index rti, CmdType event); +extern bool has_transition_tables(PlannerInfo *root, Index rti, CmdType event); + extern bool has_stored_generated_columns(PlannerInfo *root, Index rti); extern Bitmapset *get_dependent_generated_columns(PlannerInfo *root, Index rti, From 3863c6fb696cf57718483a3bf0abbf05e382abe1 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Fri, 8 Aug 2025 17:35:02 +0900 Subject: [PATCH 106/115] Fix oversight in FindTriggerIncompatibleWithInheritance. This function is called from ATExecAttachPartition/ATExecAddInherit, which prevent tables with row-level triggers with transition tables from becoming partitions or inheritance children, to check if there is such a trigger on the given table, but failed to check if a found trigger is row-level, causing the caller functions to needlessly prevent a table with only a statement-level trigger with transition tables from becoming a partition or inheritance child. Repair. Oversight in commit 501ed02cf. Author: Etsuro Fujita Discussion: https://postgr.es/m/CAPmGK167mXzwzzmJ_0YZ3EZrbwiCxtM1vogH_8drqsE6PtxRYw%40mail.gmail.com Backpatch-through: 13 --- src/backend/commands/trigger.c | 2 ++ src/test/regress/expected/triggers.out | 8 ++++++++ src/test/regress/sql/triggers.sql | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 3e27683a49e..dda03a3c823 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -2285,6 +2285,8 @@ FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc) { Trigger *trigger = &trigdesc->triggers[i]; + if (!TRIGGER_FOR_ROW(trigger->tgtype)) + continue; if (trigger->tgoldtable != NULL || trigger->tgnewtable != NULL) return trigger->tgname; } diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index b7f0c3027e0..a6786e204a3 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -3016,6 +3016,10 @@ NOTICE: trigger = child3_delete_trig, old table = (42,CCC) -- copy into parent sees parent-format tuples copy parent (a, b) from stdin; NOTICE: trigger = parent_insert_trig, new table = (AAA,42), (BBB,42), (CCC,42) +-- check detach/reattach behavior; statement triggers with transition tables +-- should not prevent a table from becoming a partition again +alter table parent detach partition child1; +alter table parent attach partition child1 for values in ('AAA'); -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; @@ -3213,6 +3217,10 @@ NOTICE: trigger = parent_insert_trig, new table = (AAA,42), (BBB,42), (CCC,42) create index on parent(b); copy parent (a, b) from stdin; NOTICE: trigger = parent_insert_trig, new table = (DDD,42) +-- check disinherit/reinherit behavior; statement triggers with transition +-- tables should not prevent a table from becoming an inheritance child again +alter table child1 no inherit parent; +alter table child1 inherit parent; -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index a3c3115a6e7..5a0fa012f1f 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -2110,6 +2110,11 @@ BBB 42 CCC 42 \. +-- check detach/reattach behavior; statement triggers with transition tables +-- should not prevent a table from becoming a partition again +alter table parent detach partition child1; +alter table parent attach partition child1 for values in ('AAA'); + -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; @@ -2329,6 +2334,11 @@ copy parent (a, b) from stdin; DDD 42 \. +-- check disinherit/reinherit behavior; statement triggers with transition +-- tables should not prevent a table from becoming an inheritance child again +alter table child1 no inherit parent; +alter table child1 inherit parent; + -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; From a3906b44c5b920cd7beb569a097660f487adf883 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 8 Aug 2025 12:06:06 +0200 Subject: [PATCH 107/115] Fix incorrect lack of Datum conversion in _int_matchsel() The code used return (Selectivity) 0.0; where PG_RETURN_FLOAT8(0.0); would be correct. On 64-bit systems, these are pretty much equivalent, but on 32-bit systems, PG_RETURN_FLOAT8() correctly produces a pointer, but the old wrong code would return a null pointer, possibly leading to a crash elsewhere. We think this code is actually not reachable because bqarr_in won't accept an empty query, and there is no other function that will create query_int values. But better be safe and not let such incorrect code lie around. Reviewed-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/8246d7ff-f4b7-4363-913e-827dadfeb145%40eisentraut.org --- contrib/intarray/_int_selfuncs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c index 01d6fe14a70..17dc6768ea5 100644 --- a/contrib/intarray/_int_selfuncs.c +++ b/contrib/intarray/_int_selfuncs.c @@ -178,7 +178,7 @@ _int_matchsel(PG_FUNCTION_ARGS) if (query->size == 0) { ReleaseVariableStats(vardata); - return (Selectivity) 0.0; + PG_RETURN_FLOAT8(0.0); } /* From 216683296101895f32d73908caa863cead7a54ac Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sun, 10 Aug 2025 13:05:13 -0700 Subject: [PATCH 108/115] Remove, from stable branches, the new assertion of no pg_dump OID sort. Commit 0decd5e89db9f5edb9b27351082f0d74aae7a9b6 recently added the assertion to confirm dump order remains independent of OID values. The assertion remained reachable via DO_DEFAULT_ACL. Given the release wrap tomorrow, make the assertion master-only. Reported-by: Alexander Lakhin Reviewed-by: Robert Haas Reviewed-by: Tom Lane Discussion: https://postgr.es/m/d32aaa8d-df7c-4f94-bcb3-4c85f02bea21@gmail.com Backpatch-through: 13-18 --- src/bin/pg_dump/pg_dump_sort.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index e925fac4010..3d3b91fa79f 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -447,7 +447,6 @@ DOTypeNameCompare(const void *p1, const void *p2) * consequence of the test using "pg_restore -j", which doesn't fully * constrain OID assignment order. */ - Assert(false); return oidcmp(obj1->catId.oid, obj2->catId.oid); } From 94c067376d5395fff7bf3e7980d11fcd2482b2be Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 10 Aug 2025 16:31:53 -0400 Subject: [PATCH 109/115] Release notes for 17.6, 16.10, 15.14, 14.19, 13.22. --- doc/src/sgml/release-16.sgml | 1434 ++++++++++++++++++++++++++++++++++ 1 file changed, 1434 insertions(+) diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml index 3a2b60a9279..d2dc1dab648 100644 --- a/doc/src/sgml/release-16.sgml +++ b/doc/src/sgml/release-16.sgml @@ -1,6 +1,1440 @@ + + Release 16.10 + + + Release date: + 2025-08-14 + + + + This release contains a variety of fixes from 16.9. + For information about new features in major release 16, see + . + + + + Migration to Version 16.10 + + + A dump/restore is not required for those running 16.X. + + + + However, if you have any + BRIN numeric_minmax_multi_ops indexes, it is + advisable to reindex them after updating. See the first changelog + entry below. + + + + Also, if you are upgrading from a version earlier than 16.9, + see . + + + + + Changes + + + + + + + Fix incorrect distance calculation in + BRIN numeric_minmax_multi_ops support function + (Peter Eisentraut, Tom Lane) + § + + + + The results were sometimes wrong on 64-bit platforms, and wildly + wrong on 32-bit platforms. This did not produce obvious failures + because the logic is only used to choose how to merge values into + ranges; at worst the index would become inefficient and bloated. + Nonetheless it's recommended to reindex any BRIN indexes that use + the numeric_minmax_multi_ops operator class. + + + + + + + Avoid regression in the size of XML input that we will accept + (Michael Paquier, Erik Wienhold) + § + § + + + + Our workaround for a bug in early 2.13.x releases + of libxml2 made use of a code path that + rejects text chunks exceeding 10MB, whereas the previous coding did + not. Those early releases are presumably extinct in the wild by + now, so revert to the previous coding. + + + + + + + Fix MERGE into a plain-inheritance parent table + (Dean Rasheed) + § + + + + Insertions into such a target table could crash or produce incorrect + query results due to failing to handle WITH CHECK + OPTION and RETURNING actions. + + + + + + + Allow tables with statement-level triggers to become partitions or + inheritance children (Etsuro Fujita) + § + + + + We do not allow partitions or inheritance child tables to have + row-level triggers with transition tables, because an operation on + the whole inheritance tree would need to maintain a separate + transition table for each such child table. But that problem does + not apply for statement-level triggers, because only the parent's + statement-level triggers will be fired. The code that checks + whether an existing table can become a partition or inheritance + child nonetheless rejected both kinds of trigger. + + + + + + + Disallow collecting transition tuples from child foreign tables + (Etsuro Fujita) + § + + + + We do not support triggers with transition tables on foreign tables. + However, the case of a partition or inheritance child that is a + foreign table was overlooked. If the parent has such a trigger, + incorrect transition tuples were collected from the foreign child. + Instead throw an error, reporting that the case is not supported. + + + + + + + Allow resetting unknown custom parameters with reserved prefixes + (Nathan Bossart) + § + + + + Previously, if a parameter setting had been stored + using ALTER DATABASE/ROLE/SYSTEM, the stored + setting could not be removed if the parameter was unknown but had a + reserved prefix. This case could arise if an extension used to have + a parameter, but that parameter had been removed in an upgrade. + + + + + + + Fix a potential deadlock during ALTER SUBSCRIPTION ... DROP + PUBLICATION (Ajin Cherian) + § + + + + Ensure that server processes acquire catalog locks in a consistent + order during replication origin drops. + + + + + + + Shorten the race condition window for creating indexes with + conflicting names (Tom Lane) + § + + + + When choosing an auto-generated name for an index, avoid conflicting + with not-yet-committed pg_class rows as + well as fully-valid ones. This avoids possibly choosing the same + name as some concurrent CREATE INDEX did, + when that command is still in process of filling its index, or is + done but is part of a not-yet-committed transaction. There's still + a window for trouble, but it's only as long as the time needed to + validate a new index's parameters and insert + its pg_class row. + + + + + + + Prevent usage of incorrect VACUUM options in some + cases where multiple tables are vacuumed in a single command (Nathan + Bossart, Michael Paquier) + § + + + + The TRUNCATE and INDEX_CLEANUP + options of one table could be applied to others. + + + + + + + Fix processing of character classes within SIMILAR + TO regular expressions (Laurenz Albe) + § + § + + + + The code that translates SIMILAR TO pattern + matching expressions to POSIX-style regular expressions did not + consider that square brackets can be nested. For example, in a + pattern like [[:alpha:]%_], the code treated + the % and _ characters as + metacharacters when they should be literals. + + + + + + + When deparsing queries, always add parentheses around the expression + in FETCH FIRST expression ROWS + WITH TIES clauses (Heikki Linnakangas) + § + § + + + + This avoids some cases where the deparsed result wasn't + syntactically valid. + + + + + + + Limit the checkpointer process's fsync request queue size (Alexander + Korotkov, Xuneng Zhou) + § + § + + + + With very large shared_buffers settings, it was + possible for the checkpointer to attempt to allocate more than 1GB + for fsync requests, leading to failure and an infinite loop. Clamp + the queue size to prevent this scenario. + + + + + + + Avoid infinite wait in logical decoding when reading a + partially-written WAL record (Vignesh C) + § + + + + If the server crashes after writing the first part of a WAL record + that would span multiple pages, subsequent logical decoding of the + WAL stream would wait for data to arrive on the next WAL page. + That might never happen if the server is now idle. + + + + + + + Fix inconsistent quoting of role names in ACL strings (Tom Lane) + § + + + + The previous quoting rule was locale-sensitive, which could lead to + portability problems when transferring aclitem values + across installations. (pg_dump does not + do that, but other tools might.) To ensure consistency, always quote + non-ASCII characters in aclitem output; but to preserve + backward compatibility, never require that they be quoted + during aclitem input. + + + + + + + Reject equal signs (=) in the names of relation + options and foreign-data options (Tom Lane) + § + + + + There's no evident use-case for option names like this, and allowing + them creates ambiguity in the stored representation. + + + + + + + Fix potentially-incorrect decompression of LZ4-compressed archive + data (Mikhail Gribkov) + § + + + + This error seems to manifest only with not-very-compressible input + data, which may explain why it escaped detection. + + + + + + + Avoid a rare scenario where a btree index scan could mark the wrong + index entries as dead (Peter Geoghegan) + § + + + + + + + Avoid re-distributing cache invalidation messages from other + transactions during logical replication (vignesh C) + § + + + + Our previous round of minor releases included a bug fix to ensure + that replication receiver processes would respond to cross-process + cache invalidation messages, preventing them from using stale + catalog data while performing replication updates. However, the fix + unintentionally made them also redistribute those messages again, + leading to an exponential increase in the number of invalidation + messages, which would often end in a memory allocation failure. + Fix by not redistributing received messages. + + + + + + + Avoid premature removal of old WAL during checkpoints (Vitaly Davydov) + § + + + + If a replication slot's restart point is advanced while a checkpoint + is in progress, no-longer-needed WAL segments could get removed too + soon, leading to recovery failure if the database crashes + immediately afterwards. Fix by keeping them for one additional + checkpoint cycle. + + + + + + + Never move a replication slot's confirmed-flush position backwards + (Shveta Malik) + § + + + + In some cases a replication client could acknowledge an LSN that's + past what it has stored persistently, and then perhaps send an older + LSN after a restart. We consider this not-a-bug so long as the + client did not have anything it needed to do for the WAL between the + two points. However, we should not re-send that WAL for fear of + data duplication, so make sure we always believe the latest + confirmed LSN for a given slot. + + + + + + + Prevent excessive delays before launching new logical replication + workers (Tom Lane) + § + + + + In some cases the logical replication launcher could sleep + considerably longer than the + configured wal_retrieve_retry_interval before + launching a new worker. + + + + + + + Fix use-after-free during logical replication of INSERT + ... ON CONFLICT (Ethan Mertz, Michael Paquier) + § + + + + This could result in incorrect progress reporting, or with very bad + luck it could result in a crash of the WAL sender process. + + + + + + + Allow waiting for a transaction on a standby server to be + interrupted (Kevin K Biju) + § + + + + Creation of a replication slot on a standby server may require waiting + for some active transaction(s) to finish on the primary and then be + replayed on the standby. Since that could be an indefinite wait, + it's desirable to allow the operation to be cancelled, but there was + no check for query cancel in the loop. + + + + + + + Do not let cascading logical WAL senders try to send data that's + beyond what has been replayed on their standby server (Alexey + Makhmutov) + § + + + + This avoids a situation where such WAL senders could get stuck at + standby server shutdown, waiting for replay work that will not + happen because the server's startup process is already shut down. + + + + + + + Fix per-relation memory leakage in autovacuum (Tom Lane) + § + + + + + + + Fix session-lifespan memory leaks + in XMLSERIALIZE(... INDENT) + (Dmitry Kovalenko, Tom Lane) + § + § + + + + + + + Fix some places that might try to fetch toasted fields of system + catalogs without any snapshot (Nathan Bossart) + § + + + + This could result in an assertion failure or cannot fetch + toast data without an active snapshot error. + + + + + + + Avoid assertion failure during cross-table constraint updates + (Tom Lane, Jian He) + § + § + + + + + + + Remove faulty assertion that a command tag must have been determined + by the end of PortalRunMulti() (Álvaro Herrera) + § + + + + This failed in edge cases such as an empty prepared statement. + + + + + + + Fix assertion failure in XMLTABLE parsing + (Richard Guo) + § + + + + + + + Restore the ability to run PL/pgSQL expressions in parallel + (Dipesh Dhameliya) + § + + + + PL/pgSQL's notion of an expression is very broad, + encompassing any SQL SELECT query that returns a + single column and no more than one row. So there are cases, for + example evaluation of an aggregate function, where the query + involves significant work and it'd be useful to run it with parallel + workers. This used to be possible, but a previous bug fix + unintentionally disabled it. + + + + + + + Fix edge-case resource leaks in PL/Python error reporting (Tom Lane) + § + § + + + + An out-of-memory failure while reporting an error from Python could + result in failure to drop reference counts on Python objects, + leading to session-lifespan memory leakage. + + + + + + + Fix libpq's PQport() + function to never return NULL unless the passed connection is NULL + (Daniele Varrazzo) + § + + + + This is the documented behavior, but + recent libpq versions would return NULL + in some cases where the user had not provided a port specification. + Revert to our historical behavior of returning an empty string in + such cases. (v18 and later will return the compiled-in default port + number, typically "5432", instead.) + + + + + + + Avoid failure when GSSAPI authentication requires packets larger + than 16kB (Jacob Champion, Tom Lane) + § + + + + Larger authentication packets are needed for Active Directory users + who belong to many AD groups. This limitation manifested in + connection failures with unintelligible error messages, + typically GSSAPI context establishment error: The routine + must be called again to complete its function: Unknown + error. + + + + + + + Fix timing-dependent failures in SSL and GSSAPI data transmission + (Tom Lane) + § + + + + When using SSL or GSSAPI encryption in non-blocking + mode, libpq sometimes failed + with SSL error: bad length or GSSAPI caller + failed to retransmit all data needing to be retried. + + + + + + + Avoid null-pointer dereference during connection lookup + in ecpg applications (Aleksander + Alekseev) + § + + + + The case could occur only if the application has some connections + that are named and some that are not. + + + + + + + Improve psql's tab completion + for COPY and \copy options + (Atsushi Torikoshi) + § + + + + The same completions were offered for both COPY + FROM and COPY TO, although some options + are only valid for one case or the other. Distinguish these cases + to provide more accurate suggestions. + + + + + + + Avoid assertion failure in pgbench when + multiple pipeline sync messages are received (Fujii Masao) + § + + + + + + + Ensure that pg_dump dumps comments on + domain constraints in a valid order (Jian He) + § + + + + In some cases the comment command could appear before creation of + the constraint. + + + + + + + Ensure stable sort ordering in pg_dump + for all types of database objects (Noah Misch, Andreas Karlsson) + § + § + § + + + + pg_dump sorts objects by their logical + names before performing dependency-driven reordering. This sort did + not account for the full unique key identifying certain object types + such as rules and constraints, and thus it could produce dissimilar + sort orders for logically-identical databases. That made it + difficult to compare databases by + diff'ing pg_dump output, so improve the + logic to ensure stable sort ordering in all cases. + + + + + + + In pg_upgrade, check for inconsistent + inherited not-null constraints (Ali Akbar) + § + § + § + § + + + + PostgreSQL versions before 18 allow an + inherited column not-null constraint to be dropped. However, this + results in a schema that cannot be restored, leading to failure + in pg_upgrade. Detect such cases + during pg_upgrade's preflight checks to + allow users to fix them before initiating the upgrade. + + + + + + + Avoid assertion failure if track_commit_timestamp + is enabled during initdb (Hayato Kuroda, + Andy Fan) + § + + + + + + + Fix pg_waldump to show information about + dropped statistics in PREPARE TRANSACTION WAL + records (Daniil Davydov) + § + + + + + + + Avoid possible leak of the open connection + during contrib/dblink connection establishment + (Tom Lane) + § + + + + In the rare scenario where we hit out-of-memory while inserting the + new connection object into dblink's hashtable, the open connection + would be leaked until end of session, leaving an idle session + sitting on the remote server. + + + + + + + Make contrib/pg_prewarm cope with very + large shared_buffers settings (Daria Shanina) + § + + + + Autoprewarm failed with a memory allocation error + if shared_buffers was larger than about 50 + million buffers (400GB). + + + + + + + In contrib/pg_stat_statements, avoid leaving + gaps in the set of parameter numbers used in a normalized query + (Sami Imseih) + § + + + + + + + Fix memory leakage in contrib/postgres_fdw's + DirectModify methods (Tom Lane) + § + + + + The PGresult holding the results of the + remote modify command would be leaked for the rest of the session if + the query fails between invocations of the DirectModify methods, + which could happen when there's RETURNING data to + process. + + + + + + + Ensure that directories listed + in configure's + + and options are searched before + system-supplied directories (Tom Lane) + § + + + + A common reason for using these options is to allow a user-built + version of some library to override the system-supplied version. + However, that failed to work in some environments because of + careless ordering of switches in the commands issued by the makefiles. + + + + + + + Fix configure's checks + for __cpuid() + and __cpuidex() (Lukas Fittl, Michael Paquier) + § + + + + configure failed to detect these + Windows-specific functions, so that they would not be used, + leading to slower-than-necessary CRC computations since the + availability of hardware instructions could not be verified. + The practical impact of this error was limited, because production + builds for Windows typically do not use the Autoconf toolchain. + + + + + + + Fix build failure with option on + Solaris-based platforms (Tom Lane) + § + + + + Solaris is inconsistent with other Unix platforms about the API for + PAM authentication. This manifested as an inconsistent + pointer compiler warning, which we never did anything about. + But as of GCC 14 it's an error not warning by default, so fix it. + + + + + + + Make our code portable to GNU Hurd (Michael Banck, Christoph Berg, + Samuel Thibault) + § + § + + + + Fix assumptions about IOV_MAX + and O_RDONLY that don't hold on Hurd. + + + + + + + Make our usage of memset_s() conform strictly + to the C11 standard (Tom Lane) + § + § + + + + This avoids compile failures on some platforms. + + + + + + + Silence compatibility warning when using Meson to build with MSVC + (Peter Eisentraut) + § + + + + + + + Prevent uninitialized-value compiler warnings in JSONB comparison + code (Tom Lane) + § + + + + + + + Avoid deprecation warnings when building + with libxml2 2.14 and later + (Michael Paquier) + § + + + + + + + Avoid problems when compiling pg_locale.h under + C++ (John Naylor) + § + + + + PostgreSQL header files generally need to + be wrapped in extern "C" { ... } in order to be + included in extensions written in C++. This failed + for pg_locale.h because of its use + of libicu headers, but we can work around + that by suppressing C++-only declarations in those headers. C++ + extensions that want to use libicu's C++ + APIs can do so by including the libicu + headers ahead of pg_locale.h. + + + + + + + + Release 16.9 From 7e86da539d18bc29377a3882b9945dfbeb375f9c Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Mon, 11 Aug 2025 09:10:17 +0100 Subject: [PATCH 110/115] Fix security checks in selectivity estimation functions. Commit e2d4ef8de86 (the fix for CVE-2017-7484) added security checks to the selectivity estimation functions to prevent them from running user-supplied operators on data obtained from pg_statistic if the user lacks privileges to select from the underlying table. In cases involving inheritance/partitioning, those checks were originally performed against the child RTE (which for plain inheritance might actually refer to the parent table). Commit 553d2ec2710 then extended that to also check the parent RTE, allowing access if the user had permissions on either the parent or the child. It turns out, however, that doing any checks using the child RTE is incorrect, since securityQuals is set to NULL when creating an RTE for an inheritance child (whether it refers to the parent table or the child table), and therefore such checks do not correctly account for any RLS policies or security barrier views. Therefore, do the security checks using only the parent RTE. This is consistent with how RLS policies are applied, and the executor's ACL checks, both of which use only the parent table's permissions/policies. Similar checks are performed in the extended stats code, so update that in the same way, centralizing all the checks in a new function. In addition, note that these checks by themselves are insufficient to ensure that the user has access to the table's data because, in a query that goes via a view, they only check that the view owner has permissions on the underlying table, not that the current user has permissions on the view itself. In the selectivity estimation functions, there is no easy way to navigate from underlying tables to views, so add permissions checks for all views mentioned in the query to the planner startup code. If the user lacks permissions on a view, a permissions error will now be reported at planner-startup, and the selectivity estimation functions will not be run. Checking view permissions at planner-startup in this way is a little ugly, since the same checks will be repeated at executor-startup. Longer-term, it might be better to move all the permissions checks from the executor to the planner so that permissions errors can be reported sooner, instead of creating a plan that won't ever be run. However, such a change seems too far-reaching to be back-patched. Back-patch to all supported versions. In v13, there is the added complication that UPDATEs and DELETEs on inherited target tables are planned using inheritance_planner(), which plans each inheritance child table separately, so that the selectivity estimation functions do not know that they are dealing with a child table accessed via its parent. Handle that by checking access permissions on the top parent table at planner-startup, in the same way as we do for views. Any securityQuals on the top parent table are moved down to the child tables by inheritance_planner(), so they continue to be checked by the selectivity estimation functions. Author: Dean Rasheed Reviewed-by: Tom Lane Reviewed-by: Noah Misch Backpatch-through: 13 Security: CVE-2025-8713 --- src/backend/executor/execMain.c | 3 +- src/backend/optimizer/plan/planner.c | 33 ++ src/backend/statistics/extended_stats.c | 108 +++-- src/backend/utils/adt/selfuncs.c | 460 ++++++++++++---------- src/include/executor/executor.h | 1 + src/include/utils/selfuncs.h | 4 +- src/test/regress/expected/privileges.out | 13 +- src/test/regress/expected/rowsecurity.out | 73 +++- src/test/regress/expected/stats_ext.out | 60 ++- src/test/regress/sql/privileges.sql | 12 +- src/test/regress/sql/rowsecurity.sql | 51 ++- src/test/regress/sql/stats_ext.sql | 39 ++ 12 files changed, 569 insertions(+), 288 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index e09705b9a07..fe92a418477 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -89,7 +89,6 @@ static void ExecutePlan(QueryDesc *queryDesc, uint64 numberTuples, ScanDirection direction, DestReceiver *dest); -static bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); static bool ExecCheckPermissionsModified(Oid relOid, Oid userid, Bitmapset *modifiedCols, AclMode requiredPerms); @@ -635,7 +634,7 @@ ExecCheckPermissions(List *rangeTable, List *rteperminfos, * ExecCheckOneRelPerms * Check access permissions for a single relation. */ -static bool +bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo) { AclMode requiredPerms; diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 11c2f33e302..d7801a13091 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -63,6 +63,7 @@ #include "partitioning/partdesc.h" #include "rewrite/rewriteManip.h" #include "storage/dsm_impl.h" +#include "utils/acl.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/selfuncs.h" @@ -788,6 +789,38 @@ subquery_planner(PlannerGlobal *glob, Query *parse, bms_make_singleton(parse->resultRelation); } + /* + * This would be a convenient time to check access permissions for all + * relations mentioned in the query, since it would be better to fail now, + * before doing any detailed planning. However, for historical reasons, + * we leave this to be done at executor startup. + * + * Note, however, that we do need to check access permissions for any view + * relations mentioned in the query, in order to prevent information being + * leaked by selectivity estimation functions, which only check view owner + * permissions on underlying tables (see all_rows_selectable() and its + * callers). This is a little ugly, because it means that access + * permissions for views will be checked twice, which is another reason + * why it would be better to do all the ACL checks here. + */ + foreach(l, parse->rtable) + { + RangeTblEntry *rte = lfirst_node(RangeTblEntry, l); + + if (rte->perminfoindex != 0 && + rte->relkind == RELKIND_VIEW) + { + RTEPermissionInfo *perminfo; + bool result; + + perminfo = getRTEPermissionInfo(parse->rteperminfos, rte); + result = ExecCheckOneRelPerms(perminfo); + if (!result) + aclcheck_error(ACLCHECK_NO_PRIV, OBJECT_VIEW, + get_rel_name(perminfo->relid)); + } + } + /* * Preprocess RowMark information. We need to do this after subquery * pullup, so that all base relations are present. diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 547d4b77be8..1e4ba8d6e16 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -1344,6 +1344,9 @@ choose_best_statistics(List *stats, char requiredkind, bool inh, * so we can't cope with system columns. * *exprs: input/output parameter collecting primitive subclauses within * the clause tree + * *leakproof: input/output parameter recording the leakproofness of the + * clause tree. This should be true initially, and will be set to false + * if any operator function used in an OpExpr is not leakproof. * * Returns false if there is something we definitively can't handle. * On true return, we can proceed to match the *exprs against statistics. @@ -1351,7 +1354,7 @@ choose_best_statistics(List *stats, char requiredkind, bool inh, static bool statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, Index relid, Bitmapset **attnums, - List **exprs) + List **exprs, bool *leakproof) { /* Look inside any binary-compatible relabeling (as in examine_variable) */ if (IsA(clause, RelabelType)) @@ -1386,7 +1389,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* (Var/Expr op Const) or (Const op Var/Expr) */ if (is_opclause(clause)) { - RangeTblEntry *rte = root->simple_rte_array[relid]; OpExpr *expr = (OpExpr *) clause; Node *clause_expr; @@ -1421,24 +1423,15 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, return false; } - /* - * If there are any securityQuals on the RTE from security barrier - * views or RLS policies, then the user may not have access to all the - * table's data, and we must check that the operator is leak-proof. - * - * If the operator is leaky, then we must ignore this clause for the - * purposes of estimating with MCV lists, otherwise the operator might - * reveal values from the MCV list that the user doesn't have - * permission to see. - */ - if (rte->securityQuals != NIL && - !get_func_leakproof(get_opcode(expr->opno))) - return false; + /* Check if the operator is leakproof */ + if (*leakproof) + *leakproof = get_func_leakproof(get_opcode(expr->opno)); /* Check (Var op Const) or (Const op Var) clauses by recursing. */ if (IsA(clause_expr, Var)) return statext_is_compatible_clause_internal(root, clause_expr, - relid, attnums, exprs); + relid, attnums, + exprs, leakproof); /* Otherwise we have (Expr op Const) or (Const op Expr). */ *exprs = lappend(*exprs, clause_expr); @@ -1448,7 +1441,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* Var/Expr IN Array */ if (IsA(clause, ScalarArrayOpExpr)) { - RangeTblEntry *rte = root->simple_rte_array[relid]; ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause; Node *clause_expr; bool expronleft; @@ -1488,24 +1480,15 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, return false; } - /* - * If there are any securityQuals on the RTE from security barrier - * views or RLS policies, then the user may not have access to all the - * table's data, and we must check that the operator is leak-proof. - * - * If the operator is leaky, then we must ignore this clause for the - * purposes of estimating with MCV lists, otherwise the operator might - * reveal values from the MCV list that the user doesn't have - * permission to see. - */ - if (rte->securityQuals != NIL && - !get_func_leakproof(get_opcode(expr->opno))) - return false; + /* Check if the operator is leakproof */ + if (*leakproof) + *leakproof = get_func_leakproof(get_opcode(expr->opno)); /* Check Var IN Array clauses by recursing. */ if (IsA(clause_expr, Var)) return statext_is_compatible_clause_internal(root, clause_expr, - relid, attnums, exprs); + relid, attnums, + exprs, leakproof); /* Otherwise we have Expr IN Array. */ *exprs = lappend(*exprs, clause_expr); @@ -1542,7 +1525,8 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, */ if (!statext_is_compatible_clause_internal(root, (Node *) lfirst(lc), - relid, attnums, exprs)) + relid, attnums, exprs, + leakproof)) return false; } @@ -1556,8 +1540,10 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* Check Var IS NULL clauses by recursing. */ if (IsA(nt->arg, Var)) - return statext_is_compatible_clause_internal(root, (Node *) (nt->arg), - relid, attnums, exprs); + return statext_is_compatible_clause_internal(root, + (Node *) (nt->arg), + relid, attnums, + exprs, leakproof); /* Otherwise we have Expr IS NULL. */ *exprs = lappend(*exprs, nt->arg); @@ -1596,11 +1582,9 @@ static bool statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, Bitmapset **attnums, List **exprs) { - RangeTblEntry *rte = root->simple_rte_array[relid]; - RelOptInfo *rel = root->simple_rel_array[relid]; RestrictInfo *rinfo; int clause_relid; - Oid userid; + bool leakproof; /* * Special-case handling for bare BoolExpr AND clauses, because the @@ -1640,18 +1624,31 @@ statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, clause_relid != relid) return false; - /* Check the clause and determine what attributes it references. */ + /* + * Check the clause, determine what attributes it references, and whether + * it includes any non-leakproof operators. + */ + leakproof = true; if (!statext_is_compatible_clause_internal(root, (Node *) rinfo->clause, - relid, attnums, exprs)) + relid, attnums, exprs, + &leakproof)) return false; /* - * Check that the user has permission to read all required attributes. + * If the clause includes any non-leakproof operators, check that the user + * has permission to read all required attributes, otherwise the operators + * might reveal values from the MCV list that the user doesn't have + * permission to see. We require all rows to be selectable --- there must + * be no securityQuals from security barrier views or RLS policies. See + * similar code in examine_variable(), examine_simple_variable(), and + * statistic_proc_security_check(). + * + * Note that for an inheritance child, the permission checks are performed + * on the inheritance root parent, and whole-table select privilege on the + * parent doesn't guarantee that the user could read all columns of the + * child. Therefore we must check all referenced columns. */ - userid = OidIsValid(rel->userid) ? rel->userid : GetUserId(); - - /* Table-level SELECT privilege is sufficient for all columns */ - if (pg_class_aclcheck(rte->relid, userid, ACL_SELECT) != ACLCHECK_OK) + if (!leakproof) { Bitmapset *clause_attnums = NULL; int attnum = -1; @@ -1676,26 +1673,9 @@ statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, if (*exprs != NIL) pull_varattnos((Node *) *exprs, relid, &clause_attnums); - attnum = -1; - while ((attnum = bms_next_member(clause_attnums, attnum)) >= 0) - { - /* Undo the offset */ - AttrNumber attno = attnum + FirstLowInvalidHeapAttributeNumber; - - if (attno == InvalidAttrNumber) - { - /* Whole-row reference, so must have access to all columns */ - if (pg_attribute_aclcheck_all(rte->relid, userid, ACL_SELECT, - ACLMASK_ALL) != ACLCHECK_OK) - return false; - } - else - { - if (pg_attribute_aclcheck(rte->relid, attno, userid, - ACL_SELECT) != ACLCHECK_OK) - return false; - } - } + /* Must have permission to read all rows from these columns */ + if (!all_rows_selectable(root, relid, clause_attnums)) + return false; } /* If we reach here, the clause is OK */ diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 771781e28ca..8f59631a5cf 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4978,8 +4978,8 @@ ReleaseDummy(HeapTuple tuple) * this query. (Caution: this should be trusted for statistical * purposes only, since we do not check indimmediate nor verify that * the exact same definition of equality applies.) - * acl_ok: true if current user has permission to read the column(s) - * underlying the pg_statistic entry. This is consulted by + * acl_ok: true if current user has permission to read all table rows from + * the column(s) underlying the pg_statistic entry. This is consulted by * statistic_proc_security_check(). * * Caller is responsible for doing ReleaseVariableStats() before exiting. @@ -5092,7 +5092,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, */ ListCell *ilist; ListCell *slist; - Oid userid; /* * The nullingrels bits within the expression could prevent us from @@ -5102,17 +5101,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, if (bms_overlap(varnos, root->outer_join_rels)) node = remove_nulling_relids(node, root->outer_join_rels, NULL); - /* - * Determine the user ID to use for privilege checks: either - * onerel->userid if it's set (e.g., in case we're accessing the table - * via a view), or the current user otherwise. - * - * If we drill down to child relations, we keep using the same userid: - * it's going to be the same anyway, due to how we set up the relation - * tree (q.v. build_simple_rel). - */ - userid = OidIsValid(onerel->userid) ? onerel->userid : GetUserId(); - foreach(ilist, onerel->indexlist) { IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist); @@ -5180,69 +5168,32 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, if (HeapTupleIsValid(vardata->statsTuple)) { - /* Get index's table for permission check */ - RangeTblEntry *rte; - - rte = planner_rt_fetch(index->rel->relid, root); - Assert(rte->rtekind == RTE_RELATION); - /* + * Test if user has permission to access all + * rows from the index's table. + * * For simplicity, we insist on the whole * table being selectable, rather than trying * to identify which column(s) the index - * depends on. Also require all rows to be - * selectable --- there must be no - * securityQuals from security barrier views - * or RLS policies. + * depends on. + * + * Note that for an inheritance child, + * permissions are checked on the inheritance + * root parent, and whole-table select + * privilege on the parent doesn't quite + * guarantee that the user could read all + * columns of the child. But in practice it's + * unlikely that any interesting security + * violation could result from allowing access + * to the expression index's stats, so we + * allow it anyway. See similar code in + * examine_simple_variable() for additional + * comments. */ vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK); - - /* - * If the user doesn't have permissions to - * access an inheritance child relation, check - * the permissions of the table actually - * mentioned in the query, since most likely - * the user does have that permission. Note - * that whole-table select privilege on the - * parent doesn't quite guarantee that the - * user could read all columns of the child. - * But in practice it's unlikely that any - * interesting security violation could result - * from allowing access to the expression - * index's stats, so we allow it anyway. See - * similar code in examine_simple_variable() - * for additional comments. - */ - if (!vardata->acl_ok && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = index->rel->relid; - - appinfo = root->append_rel_array[varno]; - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - varno = appinfo->parent_relid; - appinfo = root->append_rel_array[varno]; - } - if (varno != index->rel->relid) - { - /* Repeat access check on this rel */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, - userid, - ACL_SELECT) == ACLCHECK_OK); - } - } + all_rows_selectable(root, + index->rel->relid, + NULL); } else { @@ -5312,58 +5263,26 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, vardata->freefunc = ReleaseDummy; /* + * Test if user has permission to access all rows from the + * table. + * * For simplicity, we insist on the whole table being * selectable, rather than trying to identify which - * column(s) the statistics object depends on. Also - * require all rows to be selectable --- there must be no - * securityQuals from security barrier views or RLS - * policies. - */ - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK); - - /* - * If the user doesn't have permissions to access an - * inheritance child relation, check the permissions of - * the table actually mentioned in the query, since most - * likely the user does have that permission. Note that - * whole-table select privilege on the parent doesn't - * quite guarantee that the user could read all columns of - * the child. But in practice it's unlikely that any - * interesting security violation could result from - * allowing access to the expression stats, so we allow it - * anyway. See similar code in examine_simple_variable() - * for additional comments. + * column(s) the statistics object depends on. + * + * Note that for an inheritance child, permissions are + * checked on the inheritance root parent, and whole-table + * select privilege on the parent doesn't quite guarantee + * that the user could read all columns of the child. But + * in practice it's unlikely that any interesting security + * violation could result from allowing access to the + * expression stats, so we allow it anyway. See similar + * code in examine_simple_variable() for additional + * comments. */ - if (!vardata->acl_ok && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = onerel->relid; - - appinfo = root->append_rel_array[varno]; - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - varno = appinfo->parent_relid; - appinfo = root->append_rel_array[varno]; - } - if (varno != onerel->relid) - { - /* Repeat access check on this rel */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, - userid, - ACL_SELECT) == ACLCHECK_OK); - } - } + vardata->acl_ok = all_rows_selectable(root, + onerel->relid, + NULL); break; } @@ -5418,96 +5337,20 @@ examine_simple_variable(PlannerInfo *root, Var *var, if (HeapTupleIsValid(vardata->statsTuple)) { - RelOptInfo *onerel = find_base_rel(root, var->varno); - Oid userid; - /* - * Check if user has permission to read this column. We require - * all rows to be accessible, so there must be no securityQuals - * from security barrier views or RLS policies. Use - * onerel->userid if it's set, in case we're accessing the table - * via a view. + * Test if user has permission to read all rows from this column. + * + * This requires that the user has the appropriate SELECT + * privileges and that there are no securityQuals from security + * barrier views or RLS policies. If that's not the case, then we + * only permit leakproof functions to be passed pg_statistic data + * in vardata, otherwise the functions might reveal data that the + * user doesn't have permission to see --- see + * statistic_proc_security_check(). */ - userid = OidIsValid(onerel->userid) ? onerel->userid : GetUserId(); - vardata->acl_ok = - rte->securityQuals == NIL && - ((pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK) || - (pg_attribute_aclcheck(rte->relid, var->varattno, userid, - ACL_SELECT) == ACLCHECK_OK)); - - /* - * If the user doesn't have permissions to access an inheritance - * child relation or specifically this attribute, check the - * permissions of the table/column actually mentioned in the - * query, since most likely the user does have that permission - * (else the query will fail at runtime), and if the user can read - * the column there then he can get the values of the child table - * too. To do that, we must find out which of the root parent's - * attributes the child relation's attribute corresponds to. - */ - if (!vardata->acl_ok && var->varattno > 0 && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = var->varno; - int varattno = var->varattno; - bool found = false; - - appinfo = root->append_rel_array[varno]; - - /* - * Partitions are mapped to their immediate parent, not the - * root parent, so must be ready to walk up multiple - * AppendRelInfos. But stop if we hit a parent that is not - * RTE_RELATION --- that's a flattened UNION ALL subquery, not - * an inheritance parent. - */ - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - int parent_varattno; - - found = false; - if (varattno <= 0 || varattno > appinfo->num_child_cols) - break; /* safety check */ - parent_varattno = appinfo->parent_colnos[varattno - 1]; - if (parent_varattno == 0) - break; /* Var is local to child */ - - varno = appinfo->parent_relid; - varattno = parent_varattno; - found = true; - - /* If the parent is itself a child, continue up. */ - appinfo = root->append_rel_array[varno]; - } - - /* - * In rare cases, the Var may be local to the child table, in - * which case, we've got to live with having no access to this - * column's stats. - */ - if (!found) - return; - - /* Repeat the access check on this parent rel & column */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - /* - * Fine to use the same userid as it's the same in all - * relations of a given inheritance tree. - */ - vardata->acl_ok = - rte->securityQuals == NIL && - ((pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK) || - (pg_attribute_aclcheck(rte->relid, varattno, userid, - ACL_SELECT) == ACLCHECK_OK)); - } + all_rows_selectable(root, var->varno, + bms_make_singleton(var->varattno - FirstLowInvalidHeapAttributeNumber)); } else { @@ -5631,17 +5474,212 @@ examine_simple_variable(PlannerInfo *root, Var *var, } } +/* + * all_rows_selectable + * Test whether the user has permission to select all rows from a given + * relation. + * + * Inputs: + * root: the planner info + * varno: the index of the relation (assumed to be an RTE_RELATION) + * varattnos: the attributes for which permission is required, or NULL if + * whole-table access is required + * + * Returns true if the user has the required select permissions, and there are + * no securityQuals from security barrier views or RLS policies. + * + * Note that if the relation is an inheritance child relation, securityQuals + * and access permissions are checked against the inheritance root parent (the + * relation actually mentioned in the query) --- see the comments in + * expand_single_inheritance_child() for an explanation of why it has to be + * done this way. + * + * If varattnos is non-NULL, its attribute numbers should be offset by + * FirstLowInvalidHeapAttributeNumber so that system attributes can be + * checked. If varattnos is NULL, only table-level SELECT privileges are + * checked, not any column-level privileges. + * + * Note: if the relation is accessed via a view, this function actually tests + * whether the view owner has permission to select from the relation. To + * ensure that the current user has permission, it is also necessary to check + * that the current user has permission to select from the view, which we do + * at planner-startup --- see subquery_planner(). + * + * This is exported so that other estimation functions can use it. + */ +bool +all_rows_selectable(PlannerInfo *root, Index varno, Bitmapset *varattnos) +{ + RelOptInfo *rel = find_base_rel(root, varno); + RangeTblEntry *rte = planner_rt_fetch(varno, root); + Oid userid; + int varattno; + + Assert(rte->rtekind == RTE_RELATION); + + /* + * User ID to use for privilege checks (either the current user or the + * view owner, if we're accessing the table via a view). + * + * If we navigate up to a parent relation, we keep using the same userid, + * since it's the same in all relations of a given inheritance tree. + */ + userid = OidIsValid(rel->userid) ? rel->userid : GetUserId(); + + /* + * Permissions and securityQuals must be checked on the table actually + * mentioned in the query, so if this is an inheritance child, navigate up + * to the inheritance root parent. If the user can read the whole table + * or the required columns there, then they can read from the child table + * too. For per-column checks, we must find out which of the root + * parent's attributes the child relation's attributes correspond to. + */ + if (root->append_rel_array != NULL) + { + AppendRelInfo *appinfo; + + appinfo = root->append_rel_array[varno]; + + /* + * Partitions are mapped to their immediate parent, not the root + * parent, so must be ready to walk up multiple AppendRelInfos. But + * stop if we hit a parent that is not RTE_RELATION --- that's a + * flattened UNION ALL subquery, not an inheritance parent. + */ + while (appinfo && + planner_rt_fetch(appinfo->parent_relid, + root)->rtekind == RTE_RELATION) + { + Bitmapset *parent_varattnos = NULL; + + /* + * For each child attribute, find the corresponding parent + * attribute. In rare cases, the attribute may be local to the + * child table, in which case, we've got to live with having no + * access to this column. + */ + varattno = -1; + while ((varattno = bms_next_member(varattnos, varattno)) >= 0) + { + AttrNumber attno; + AttrNumber parent_attno; + + attno = varattno + FirstLowInvalidHeapAttributeNumber; + + if (attno == InvalidAttrNumber) + { + /* + * Whole-row reference, so must map each column of the + * child to the parent table. + */ + for (attno = 1; attno <= appinfo->num_child_cols; attno++) + { + parent_attno = appinfo->parent_colnos[attno - 1]; + if (parent_attno == 0) + return false; /* attr is local to child */ + parent_varattnos = + bms_add_member(parent_varattnos, + parent_attno - FirstLowInvalidHeapAttributeNumber); + } + } + else + { + if (attno < 0) + { + /* System attnos are the same in all tables */ + parent_attno = attno; + } + else + { + if (attno > appinfo->num_child_cols) + return false; /* safety check */ + parent_attno = appinfo->parent_colnos[attno - 1]; + if (parent_attno == 0) + return false; /* attr is local to child */ + } + parent_varattnos = + bms_add_member(parent_varattnos, + parent_attno - FirstLowInvalidHeapAttributeNumber); + } + } + + /* If the parent is itself a child, continue up */ + varno = appinfo->parent_relid; + varattnos = parent_varattnos; + appinfo = root->append_rel_array[varno]; + } + + /* Perform the access check on this parent rel */ + rte = planner_rt_fetch(varno, root); + Assert(rte->rtekind == RTE_RELATION); + } + + /* + * For all rows to be accessible, there must be no securityQuals from + * security barrier views or RLS policies. + */ + if (rte->securityQuals != NIL) + return false; + + /* + * Test for table-level SELECT privilege. + * + * If varattnos is non-NULL, this is sufficient to give access to all + * requested attributes, even for a child table, since we have verified + * that all required child columns have matching parent columns. + * + * If varattnos is NULL (whole-table access requested), this doesn't + * necessarily guarantee that the user can read all columns of a child + * table, but we allow it anyway (see comments in examine_variable()) and + * don't bother checking any column privileges. + */ + if (pg_class_aclcheck(rte->relid, userid, ACL_SELECT) == ACLCHECK_OK) + return true; + + if (varattnos == NULL) + return false; /* whole-table access requested */ + + /* + * Don't have table-level SELECT privilege, so check per-column + * privileges. + */ + varattno = -1; + while ((varattno = bms_next_member(varattnos, varattno)) >= 0) + { + AttrNumber attno = varattno + FirstLowInvalidHeapAttributeNumber; + + if (attno == InvalidAttrNumber) + { + /* Whole-row reference, so must have access to all columns */ + if (pg_attribute_aclcheck_all(rte->relid, userid, ACL_SELECT, + ACLMASK_ALL) != ACLCHECK_OK) + return false; + } + else + { + if (pg_attribute_aclcheck(rte->relid, attno, userid, + ACL_SELECT) != ACLCHECK_OK) + return false; + } + } + + /* If we reach here, have all required column privileges */ + return true; +} + /* * Check whether it is permitted to call func_oid passing some of the - * pg_statistic data in vardata. We allow this either if the user has SELECT - * privileges on the table or column underlying the pg_statistic data or if - * the function is marked leak-proof. + * pg_statistic data in vardata. We allow this if either of the following + * conditions is met: (1) the user has SELECT privileges on the table or + * column underlying the pg_statistic data and there are no securityQuals from + * security barrier views or RLS policies, or (2) the function is marked + * leakproof. */ bool statistic_proc_security_check(VariableStatData *vardata, Oid func_oid) { if (vardata->acl_ok) - return true; + return true; /* have SELECT privs and no securityQuals */ if (!OidIsValid(func_oid)) return false; diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index ac02247947e..091c5711a23 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -210,6 +210,7 @@ extern void standard_ExecutorEnd(QueryDesc *queryDesc); extern void ExecutorRewind(QueryDesc *queryDesc); extern bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation); +extern bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); extern void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation); extern void InitResultRelInfo(ResultRelInfo *resultRelInfo, Relation resultRelationDesc, diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h index 2f76c473db4..28d6be59061 100644 --- a/src/include/utils/selfuncs.h +++ b/src/include/utils/selfuncs.h @@ -95,7 +95,8 @@ typedef struct VariableStatData Oid atttype; /* actual type (after stripping relabel) */ int32 atttypmod; /* actual typmod (after stripping relabel) */ bool isunique; /* matches unique index or DISTINCT clause */ - bool acl_ok; /* result of ACL check on table or column */ + bool acl_ok; /* true if user has SELECT privilege on all + * rows from the table or column */ } VariableStatData; #define ReleaseVariableStats(vardata) \ @@ -149,6 +150,7 @@ extern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook; extern void examine_variable(PlannerInfo *root, Node *node, int varRelid, VariableStatData *vardata); +extern bool all_rows_selectable(PlannerInfo *root, Index varno, Bitmapset *varattnos); extern bool statistic_proc_security_check(VariableStatData *vardata, Oid func_oid); extern bool get_restriction_variable(PlannerInfo *root, List *args, int varRelid, diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 99daf089e30..c62765420d8 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -454,8 +454,6 @@ CREATE VIEW atest12v AS SELECT * FROM atest12 WHERE b <<< 5; CREATE VIEW atest12sbv WITH (security_barrier=true) AS SELECT * FROM atest12 WHERE b <<< 5; -GRANT SELECT ON atest12v TO PUBLIC; -GRANT SELECT ON atest12sbv TO PUBLIC; -- This plan should use nestloop, knowing that few rows will be selected. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; QUERY PLAN @@ -501,9 +499,18 @@ CREATE FUNCTION leak2(integer,integer) RETURNS boolean LANGUAGE plpgsql immutable; CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, restrict = scalargtsel); --- This should not show any "leak" notices before failing. +-- These should not show any "leak" notices before failing. EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; ERROR: permission denied for table atest12 +EXPLAIN (COSTS OFF) SELECT * FROM atest12v WHERE a >>> 0; +ERROR: permission denied for view atest12v +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv WHERE a >>> 0; +ERROR: permission denied for view atest12sbv +-- Now regress_priv_user1 grants access to regress_priv_user2 via the views. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; -- These plans should continue to use a nestloop, since they execute with the -- privileges of the view owner. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out index 218c0c28632..39528627f3c 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -4404,7 +4404,7 @@ RESET SESSION AUTHORIZATION; DROP VIEW rls_view; DROP TABLE rls_tbl; DROP TABLE ref_tbl; --- Leaky operator test +-- Leaky operator tests CREATE TABLE rls_tbl (a int); INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; ANALYZE rls_tbl; @@ -4421,9 +4421,80 @@ SELECT * FROM rls_tbl WHERE a <<< 1000; --- (0 rows) +RESET SESSION AUTHORIZATION; +CREATE TABLE rls_child_tbl () INHERITS (rls_tbl); +INSERT INTO rls_child_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_child_tbl; +CREATE TABLE rls_ptbl (a int) PARTITION BY RANGE (a); +CREATE TABLE rls_part PARTITION OF rls_ptbl FOR VALUES FROM (-100) TO (100); +INSERT INTO rls_ptbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_ptbl, rls_part; +ALTER TABLE rls_ptbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_part ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_ptbl TO regress_rls_alice; +GRANT SELECT ON rls_part TO regress_rls_alice; +CREATE POLICY p1 ON rls_tbl USING (a < 0); +CREATE POLICY p2 ON rls_ptbl USING (a < 0); +CREATE POLICY p3 ON rls_part USING (a < 0); +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +ERROR: permission denied for table rls_child_tbl +SELECT * FROM rls_ptbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM rls_part WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; +ERROR: permission denied for table rls_child_tbl +RESET SESSION AUTHORIZATION; +REVOKE SELECT ON rls_tbl FROM regress_rls_alice; +CREATE VIEW rls_tbl_view AS SELECT * FROM rls_tbl; +ALTER TABLE rls_child_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_child_tbl TO regress_rls_alice; +CREATE POLICY p4 ON rls_child_tbl USING (a < 0); +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +ERROR: permission denied for table rls_tbl +SELECT * FROM rls_tbl_view WHERE a <<< 1000; +ERROR: permission denied for view rls_tbl_view +SELECT * FROM rls_child_tbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +ERROR: permission denied for table rls_tbl +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; + a +--- +(0 rows) + DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE rls_part; +DROP TABLE rls_ptbl; +DROP TABLE rls_child_tbl; +DROP VIEW rls_tbl_view; DROP TABLE rls_tbl; -- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects SET SESSION AUTHORIZATION regress_rls_alice; diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index b4c85613de5..e69e0069658 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -3252,8 +3252,16 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool LANGUAGE plpgsql; CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); +CREATE FUNCTION op_leak(record, record) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = record, rightarg = record, + restrict = scalarltsel); SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied ERROR: permission denied for table priv_test_tbl +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +ERROR: permission denied for table priv_test_tbl DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied ERROR: permission denied for table priv_test_tbl -- Grant access via a security barrier view, but hide all data @@ -3268,10 +3276,17 @@ SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not l ---+--- (0 rows) +SELECT * FROM tststats.priv_test_view t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak -- Grant table access, but hide all data with RLS RESET SESSION AUTHORIZATION; ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_tbl_pol ON tststats.priv_test_tbl USING (2 * a < 0); GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; -- Should now have direct table access, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; @@ -3280,7 +3295,45 @@ SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not le ---+--- (0 rows) +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Create plain inheritance parent table with no access permissions +RESET SESSION AUTHORIZATION; +CREATE TABLE tststats.priv_test_parent_tbl (a int, b int); +ALTER TABLE tststats.priv_test_tbl INHERIT tststats.priv_test_parent_tbl; +-- Should not have access to parent, and should leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +-- Grant table access to parent, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_parent_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_parent_tbl_pol ON tststats.priv_test_parent_tbl USING (2 * a < 0); +GRANT SELECT, DELETE ON tststats.priv_test_parent_tbl TO regress_stats_user1; +-- Should now have direct table access to parent, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak + a | b +---+--- +(0 rows) + +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak -- privilege checks for pg_stats_ext and pg_stats_ext_exprs RESET SESSION AUTHORIZATION; CREATE TABLE stats_ext_tbl (id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, col TEXT); @@ -3326,10 +3379,13 @@ SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); +DROP OPERATOR <<< (record, record); +DROP FUNCTION op_leak(record, record); RESET SESSION AUTHORIZATION; DROP TABLE stats_ext_tbl; DROP SCHEMA tststats CASCADE; -NOTICE: drop cascades to 2 other objects -DETAIL: drop cascades to table tststats.priv_test_tbl +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table tststats.priv_test_parent_tbl +drop cascades to table tststats.priv_test_tbl drop cascades to view tststats.priv_test_view DROP USER regress_stats_user1; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index d84b4041e8b..3bbe82b0cf1 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -325,8 +325,6 @@ CREATE VIEW atest12v AS SELECT * FROM atest12 WHERE b <<< 5; CREATE VIEW atest12sbv WITH (security_barrier=true) AS SELECT * FROM atest12 WHERE b <<< 5; -GRANT SELECT ON atest12v TO PUBLIC; -GRANT SELECT ON atest12sbv TO PUBLIC; -- This plan should use nestloop, knowing that few rows will be selected. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; @@ -348,8 +346,16 @@ CREATE FUNCTION leak2(integer,integer) RETURNS boolean CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, restrict = scalargtsel); --- This should not show any "leak" notices before failing. +-- These should not show any "leak" notices before failing. EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; +EXPLAIN (COSTS OFF) SELECT * FROM atest12v WHERE a >>> 0; +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv WHERE a >>> 0; + +-- Now regress_priv_user1 grants access to regress_priv_user2 via the views. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; -- These plans should continue to use a nestloop, since they execute with the -- privileges of the view owner. diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index d3bfd53e237..4f5ca1626cf 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -2122,7 +2122,7 @@ DROP VIEW rls_view; DROP TABLE rls_tbl; DROP TABLE ref_tbl; --- Leaky operator test +-- Leaky operator tests CREATE TABLE rls_tbl (a int); INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; ANALYZE rls_tbl; @@ -2137,9 +2137,58 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); SELECT * FROM rls_tbl WHERE a <<< 1000; +RESET SESSION AUTHORIZATION; + +CREATE TABLE rls_child_tbl () INHERITS (rls_tbl); +INSERT INTO rls_child_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_child_tbl; + +CREATE TABLE rls_ptbl (a int) PARTITION BY RANGE (a); +CREATE TABLE rls_part PARTITION OF rls_ptbl FOR VALUES FROM (-100) TO (100); +INSERT INTO rls_ptbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_ptbl, rls_part; + +ALTER TABLE rls_ptbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_part ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_ptbl TO regress_rls_alice; +GRANT SELECT ON rls_part TO regress_rls_alice; +CREATE POLICY p1 ON rls_tbl USING (a < 0); +CREATE POLICY p2 ON rls_ptbl USING (a < 0); +CREATE POLICY p3 ON rls_part USING (a < 0); + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +SELECT * FROM rls_ptbl WHERE a <<< 1000; +SELECT * FROM rls_part WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; +RESET SESSION AUTHORIZATION; + +REVOKE SELECT ON rls_tbl FROM regress_rls_alice; +CREATE VIEW rls_tbl_view AS SELECT * FROM rls_tbl; + +ALTER TABLE rls_child_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_child_tbl TO regress_rls_alice; +CREATE POLICY p4 ON rls_child_tbl USING (a < 0); + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +SELECT * FROM rls_tbl_view WHERE a <<< 1000; +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE rls_part; +DROP TABLE rls_ptbl; +DROP TABLE rls_child_tbl; +DROP VIEW rls_tbl_view; DROP TABLE rls_tbl; -- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects diff --git a/src/test/regress/sql/stats_ext.sql b/src/test/regress/sql/stats_ext.sql index 1b80d3687b4..aa7e8e7cb33 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -1633,7 +1633,14 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool LANGUAGE plpgsql; CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); +CREATE FUNCTION op_leak(record, record) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = record, rightarg = record, + restrict = scalarltsel); SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied -- Grant access via a security barrier view, but hide all data @@ -1645,18 +1652,48 @@ GRANT SELECT, DELETE ON tststats.priv_test_view TO regress_stats_user1; -- Should now have access via the view, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_view t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak -- Grant table access, but hide all data with RLS RESET SESSION AUTHORIZATION; ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_tbl_pol ON tststats.priv_test_tbl USING (2 * a < 0); GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; -- Should now have direct table access, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Create plain inheritance parent table with no access permissions +RESET SESSION AUTHORIZATION; +CREATE TABLE tststats.priv_test_parent_tbl (a int, b int); +ALTER TABLE tststats.priv_test_tbl INHERIT tststats.priv_test_parent_tbl; + +-- Should not have access to parent, and should leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied + +-- Grant table access to parent, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_parent_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_parent_tbl_pol ON tststats.priv_test_parent_tbl USING (2 * a < 0); +GRANT SELECT, DELETE ON tststats.priv_test_parent_tbl TO regress_stats_user1; + +-- Should now have direct table access to parent, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak + -- privilege checks for pg_stats_ext and pg_stats_ext_exprs RESET SESSION AUTHORIZATION; CREATE TABLE stats_ext_tbl (id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, col TEXT); @@ -1686,6 +1723,8 @@ SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); +DROP OPERATOR <<< (record, record); +DROP FUNCTION op_leak(record, record); RESET SESSION AUTHORIZATION; DROP TABLE stats_ext_tbl; DROP SCHEMA tststats CASCADE; From 192634292384ea385abd2c320c0810fc7621b325 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 11 Aug 2025 14:42:47 +0200 Subject: [PATCH 111/115] Translation updates Source-Git-URL: https://git.postgresql.org/git/pgtranslation/messages.git Source-Git-Hash: 5c10cbbbe3a047d729d23c3d254897f686a10eb9 --- src/backend/po/de.po | 1836 +++++++++---------- src/backend/po/ja.po | 1092 +++++------ src/backend/po/ru.po | 1749 +++++++++--------- src/backend/po/sv.po | 2518 +++++++++++++------------- src/bin/pg_dump/po/ru.po | 270 +-- src/bin/pg_dump/po/sv.po | 635 +++---- src/bin/pg_rewind/po/ru.po | 60 +- src/bin/pg_upgrade/po/de.po | 176 +- src/bin/pg_upgrade/po/fr.po | 182 +- src/bin/pg_upgrade/po/ja.po | 180 +- src/bin/pg_upgrade/po/ru.po | 153 +- src/bin/pg_upgrade/po/sv.po | 181 +- src/bin/pg_verifybackup/po/ru.po | 38 +- src/bin/pg_waldump/po/ru.po | 60 +- src/bin/psql/po/ru.po | 4 +- src/interfaces/ecpg/ecpglib/po/ru.po | 6 +- src/interfaces/libpq/po/ru.po | 56 +- src/pl/plpgsql/src/po/ru.po | 28 +- src/pl/plpython/po/ru.po | 4 +- 19 files changed, 4697 insertions(+), 4531 deletions(-) diff --git a/src/backend/po/de.po b/src/backend/po/de.po index c96b98de720..46ee1edde6d 100644 --- a/src/backend/po/de.po +++ b/src/backend/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-01 11:16+0000\n" +"POT-Creation-Date: 2025-08-08 02:17+0000\n" "PO-Revision-Date: 2025-03-11 10:56+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -82,13 +82,13 @@ msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" #: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1347 access/transam/xlog.c:3196 -#: access/transam/xlog.c:3999 access/transam/xlogrecovery.c:1225 +#: access/transam/twophase.c:1347 access/transam/xlog.c:3197 +#: access/transam/xlog.c:4000 access/transam/xlogrecovery.c:1225 #: access/transam/xlogrecovery.c:1317 access/transam/xlogrecovery.c:1354 #: access/transam/xlogrecovery.c:1414 backup/basebackup.c:1846 #: commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5055 -#: replication/logical/snapbuild.c:2079 replication/slot.c:1980 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5184 +#: replication/logical/snapbuild.c:2087 replication/slot.c:1980 #: replication/slot.c:2021 replication/walsender.c:646 #: storage/file/buffile.c:470 storage/file/copydir.c:185 #: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:830 @@ -97,9 +97,9 @@ msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" #: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 -#: access/transam/xlog.c:3201 access/transam/xlog.c:4004 +#: access/transam/xlog.c:3202 access/transam/xlog.c:4005 #: backup/basebackup.c:1850 replication/logical/origin.c:750 -#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2084 +#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2092 #: replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:651 #: utils/cache/relmapper.c:834 #, c-format @@ -111,17 +111,17 @@ msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 #: access/transam/timeline.c:392 access/transam/timeline.c:438 #: access/transam/timeline.c:512 access/transam/twophase.c:1359 -#: access/transam/twophase.c:1778 access/transam/xlog.c:3042 -#: access/transam/xlog.c:3236 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3377 access/transam/xlog.c:3969 -#: access/transam/xlog.c:4888 commands/copyfrom.c:1747 commands/copyto.c:332 +#: access/transam/twophase.c:1778 access/transam/xlog.c:3043 +#: access/transam/xlog.c:3237 access/transam/xlog.c:3242 +#: access/transam/xlog.c:3378 access/transam/xlog.c:3970 +#: access/transam/xlog.c:4889 commands/copyfrom.c:1747 commands/copyto.c:332 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5107 -#: replication/logical/snapbuild.c:1846 replication/logical/snapbuild.c:1970 +#: replication/logical/reorderbuffer.c:5236 +#: replication/logical/snapbuild.c:1854 replication/logical/snapbuild.c:1978 #: replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:661 -#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 -#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:842 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:779 +#: storage/file/fd.c:3697 storage/file/fd.c:3803 utils/cache/relmapper.c:842 #: utils/cache/relmapper.c:957 #, c-format msgid "could not close file \"%s\": %m" @@ -150,20 +150,20 @@ msgstr "" #: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 #: access/transam/timeline.c:111 access/transam/timeline.c:251 #: access/transam/timeline.c:348 access/transam/twophase.c:1303 -#: access/transam/xlog.c:2949 access/transam/xlog.c:3112 -#: access/transam/xlog.c:3151 access/transam/xlog.c:3344 -#: access/transam/xlog.c:3989 access/transam/xlogrecovery.c:4214 +#: access/transam/xlog.c:2950 access/transam/xlog.c:3113 +#: access/transam/xlog.c:3152 access/transam/xlog.c:3345 +#: access/transam/xlog.c:3990 access/transam/xlogrecovery.c:4214 #: access/transam/xlogrecovery.c:4317 access/transam/xlogutils.c:838 #: backup/basebackup.c:538 backup/basebackup.c:1516 libpq/hba.c:629 #: postmaster/syslogger.c:1560 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3711 -#: replication/logical/reorderbuffer.c:4262 -#: replication/logical/reorderbuffer.c:5035 -#: replication/logical/snapbuild.c:1801 replication/logical/snapbuild.c:1911 +#: replication/logical/reorderbuffer.c:3840 +#: replication/logical/reorderbuffer.c:4391 +#: replication/logical/reorderbuffer.c:5164 +#: replication/logical/snapbuild.c:1809 replication/logical/snapbuild.c:1919 #: replication/slot.c:1952 replication/walsender.c:619 -#: replication/walsender.c:2760 storage/file/copydir.c:151 -#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 -#: storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:819 +#: replication/walsender.c:2764 storage/file/copydir.c:151 +#: storage/file/fd.c:754 storage/file/fd.c:3454 storage/file/fd.c:3684 +#: storage/file/fd.c:3774 storage/smgr/md.c:663 utils/cache/relmapper.c:819 #: utils/cache/relmapper.c:936 utils/error/elog.c:2119 #: utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 #: utils/init/miscinit.c:1792 utils/misc/guc.c:4656 utils/misc/guc.c:4706 @@ -173,7 +173,7 @@ msgstr "konnte Datei »%s« nicht öffnen: %m" #: ../common/controldata_utils.c:232 ../common/controldata_utils.c:235 #: access/transam/twophase.c:1751 access/transam/twophase.c:1760 -#: access/transam/xlog.c:8791 access/transam/xlogfuncs.c:708 +#: access/transam/xlog.c:8830 access/transam/xlogfuncs.c:708 #: backup/basebackup_server.c:175 backup/basebackup_server.c:268 #: postmaster/postmaster.c:5575 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 @@ -187,12 +187,12 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" #: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 #: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 #: access/transam/timeline.c:506 access/transam/twophase.c:1772 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3230 -#: access/transam/xlog.c:3962 access/transam/xlog.c:8181 -#: access/transam/xlog.c:8226 backup/basebackup_server.c:209 -#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1839 -#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:774 -#: storage/file/fd.c:3798 storage/smgr/md.c:1137 storage/smgr/md.c:1182 +#: access/transam/xlog.c:3036 access/transam/xlog.c:3231 +#: access/transam/xlog.c:3963 access/transam/xlog.c:8220 +#: access/transam/xlog.c:8265 backup/basebackup_server.c:209 +#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1847 +#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:771 +#: storage/file/fd.c:3795 storage/smgr/md.c:1137 storage/smgr/md.c:1182 #: storage/sync/sync.c:451 utils/misc/guc.c:4426 #, c-format msgid "could not fsync file \"%s\": %m" @@ -205,15 +205,16 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../common/md5_common.c:155 ../common/psprintf.c:143 #: ../common/scram-common.c:268 ../common/stringinfo.c:305 ../port/path.c:828 #: ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1412 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 -#: libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:524 -#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 -#: postmaster/postmaster.c:2539 postmaster/postmaster.c:4131 -#: postmaster/postmaster.c:5500 postmaster/postmaster.c:5871 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1351 +#: libpq/auth.c:1395 libpq/auth.c:1952 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:352 +#: postmaster/bgworker.c:934 postmaster/postmaster.c:2539 +#: postmaster/postmaster.c:4131 postmaster/postmaster.c:5500 +#: postmaster/postmaster.c:5871 #: replication/libpqwalreceiver/libpqwalreceiver.c:361 #: replication/logical/logical.c:209 replication/walsender.c:689 -#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 -#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1461 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:863 storage/file/fd.c:1394 +#: storage/file/fd.c:1555 storage/file/fd.c:2475 storage/ipc/procarray.c:1461 #: storage/ipc/procarray.c:2243 storage/ipc/procarray.c:2250 #: storage/ipc/procarray.c:2749 storage/ipc/procarray.c:3385 #: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 @@ -295,8 +296,8 @@ msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" #: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 #: commands/copyfrom.c:1697 commands/copyto.c:706 commands/extension.c:3469 #: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 -#: replication/logical/snapbuild.c:1697 storage/file/fd.c:1922 -#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 +#: replication/logical/snapbuild.c:1705 storage/file/fd.c:1919 +#: storage/file/fd.c:2005 storage/file/fd.c:3508 utils/adt/dbsize.c:106 #: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 #: utils/adt/genfile.c:658 utils/adt/misc.c:340 #, c-format @@ -305,22 +306,22 @@ msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" #: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 #: commands/tablespace.c:734 commands/tablespace.c:744 -#: postmaster/postmaster.c:1566 storage/file/fd.c:2880 +#: postmaster/postmaster.c:1566 storage/file/fd.c:2877 #: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" #: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 -#: storage/file/fd.c:2892 +#: storage/file/fd.c:2889 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" #: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 #: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 -#: replication/logical/snapbuild.c:1858 replication/slot.c:723 -#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:792 +#: replication/logical/snapbuild.c:1866 replication/slot.c:723 +#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:789 #: utils/time/snapmgr.c:1284 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -330,89 +331,89 @@ msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" msgid "internal error" msgstr "interner Fehler" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:1147 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-Sequenz »\\%s« ist nicht gültig." -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:1150 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:1153 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:1156 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:1159 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "»,« oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:1162 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "»:« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:1165 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON-Wert erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:1168 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:1170 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:1173 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "»,« oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:1176 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Zeichenkette erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:1179 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token »%s« ist ungültig." -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:1182 jsonpath_scan.l:597 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:1184 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:1187 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:1190 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden." -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:1193 jsonpath_scan.l:630 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 +#: ../common/jsonapi.c:1195 jsonpath_scan.l:641 jsonpath_scan.l:651 #: jsonpath_scan.l:702 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -441,8 +442,8 @@ msgstr "Tipp: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 #: postmaster/postmaster.c:2213 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6779 -#: utils/misc/guc.c:6820 +#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6785 +#: utils/misc/guc.c:6826 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" @@ -506,10 +507,10 @@ msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" #: access/transam/twophase.c:1711 access/transam/xlogarchive.c:120 #: access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 #: postmaster/syslogger.c:1537 replication/logical/origin.c:591 -#: replication/logical/reorderbuffer.c:4531 -#: replication/logical/snapbuild.c:1739 replication/logical/snapbuild.c:2173 -#: replication/slot.c:1936 storage/file/fd.c:832 storage/file/fd.c:3325 -#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 +#: replication/logical/reorderbuffer.c:4660 +#: replication/logical/snapbuild.c:1747 replication/logical/snapbuild.c:2181 +#: replication/slot.c:1936 storage/file/fd.c:829 storage/file/fd.c:3322 +#: storage/file/fd.c:3384 storage/file/reinit.c:262 storage/ipc/dsm.c:316 #: storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 #: utils/time/snapmgr.c:1608 #, c-format @@ -517,8 +518,8 @@ msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" #: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 -#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 -#: storage/file/fd.c:3726 +#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3314 +#: storage/file/fd.c:3723 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" @@ -556,7 +557,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" -#: ../common/username.c:45 libpq/auth.c:1879 +#: ../common/username.c:45 libpq/auth.c:1887 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -873,67 +874,72 @@ msgstr "Wertebereich des Typs für benutzerdefinierte Relationsparameter übersc msgid "RESET must not include values for parameters" msgstr "RESET darf keinen Parameterwert enthalten" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1302 commands/variable.c:1214 +#: access/common/reloptions.c:1296 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "ungültiger Optionsname »%s«: darf nicht »=« enthalten" + +#: access/common/reloptions.c:1311 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "Tabellen mit WITH OIDS werden nicht unterstützt" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1479 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "unbekannter Parameter »%s«" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1591 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "Parameter »%s« mehrmals angegeben" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1607 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ungültiger Wert für Boole’sche Option »%s«: »%s«" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1619 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ungültiger Wert für ganzzahlige Option »%s«: »%s«" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1625 access/common/reloptions.c:1645 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "Wert %s ist außerhalb des gültigen Bereichs für Option »%s«" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1627 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Gültige Werte sind zwischen »%d« und »%d«." -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1639 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ungültiger Wert für Gleitkommaoption »%s«: »%s«" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1647 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Gültige Werte sind zwischen »%f« und »%f«." -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1669 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ungültiger Wert für Enum-Option »%s«: »%s«" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:2000 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "für eine partitionierte Tabelle können keine Storage-Parameter angegeben werden" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:2001 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Geben Sie Storage-Parameter stattdessen für ihre Blattpartitionen an." @@ -949,7 +955,7 @@ msgid "This functionality requires the server to be built with lz4 support." msgstr "Diese Funktionalität verlangt, dass der Server mit lz4-Unterstützung gebaut wird." #: access/common/tupdesc.c:837 commands/tablecmds.c:7025 -#: commands/tablecmds.c:13257 +#: commands/tablecmds.c:13244 #, c-format msgid "too many array dimensions" msgstr "zu viele Array-Dimensionen" @@ -1088,7 +1094,7 @@ msgstr "konnte die für das Zeichenketten-Hashing zu verwendende Sortierfolge ni #: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:672 #: catalog/heap.c:678 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2022 commands/tablecmds.c:17765 commands/view.c:86 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17775 commands/view.c:86 #: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 #: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 #: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 @@ -1143,39 +1149,39 @@ msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlen typübergreifende Operatoren" -#: access/heap/heapam.c:2049 +#: access/heap/heapam.c:2084 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "in einem parallelen Arbeitsprozess können keine Tupel eingefügt werden" -#: access/heap/heapam.c:2568 +#: access/heap/heapam.c:2607 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel gelöscht werden" -#: access/heap/heapam.c:2615 +#: access/heap/heapam.c:2654 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 +#: access/heap/heapam.c:3104 access/heap/heapam.c:6380 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel aktualisiert werden" -#: access/heap/heapam.c:3239 +#: access/heap/heapam.c:3280 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4791 access/heap/heapam.c:4829 +#: access/heap/heapam.c:5094 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "konnte Sperre für Zeile in Relation »%s« nicht setzen" -#: access/heap/heapam.c:6152 commands/trigger.c:3347 -#: executor/nodeModifyTable.c:2401 executor/nodeModifyTable.c:2492 +#: access/heap/heapam.c:6193 commands/trigger.c:3375 +#: executor/nodeModifyTable.c:2402 executor/nodeModifyTable.c:2493 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" @@ -1197,8 +1203,8 @@ msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" #: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:2974 access/transam/xlog.c:3165 -#: access/transam/xlog.c:3941 access/transam/xlog.c:8780 +#: access/transam/xlog.c:2975 access/transam/xlog.c:3166 +#: access/transam/xlog.c:3942 access/transam/xlog.c:8819 #: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 #: backup/basebackup_server.c:244 commands/dbcommands.c:495 #: postmaster/postmaster.c:4558 postmaster/postmaster.c:5562 @@ -1215,11 +1221,11 @@ msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" #: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3024 access/transam/xlog.c:3221 -#: access/transam/xlog.c:3953 commands/dbcommands.c:507 +#: access/transam/xlog.c:3025 access/transam/xlog.c:3222 +#: access/transam/xlog.c:3954 commands/dbcommands.c:507 #: postmaster/postmaster.c:4568 postmaster/postmaster.c:4578 #: replication/logical/origin.c:615 replication/logical/origin.c:657 -#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1815 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1823 #: replication/slot.c:1839 storage/file/buffile.c:545 #: storage/file/copydir.c:197 utils/init/miscinit.c:1656 #: utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4387 @@ -1465,8 +1471,8 @@ msgid "cannot access index \"%s\" while it is being reindexed" msgstr "auf Index »%s« kann nicht zugegriffen werden, während er reindiziert wird" #: access/index/indexam.c:208 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17460 commands/tablecmds.c:19329 +#: commands/indexcmds.c:2884 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17470 commands/tablecmds.c:19347 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1512,17 +1518,17 @@ msgstr "Index »%s« enthält eine halbtote interne Seite" msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Die Ursache kann ein unterbrochenes VACUUM in Version 9.3 oder älter vor dem Upgrade sein. Bitte REINDEX durchführen." -#: access/nbtree/nbtutils.c:2677 +#: access/nbtree/nbtutils.c:2683 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "Größe %zu der Indexzeile überschreitet btree-Version %u Maximum %zu für Index »%s«" -#: access/nbtree/nbtutils.c:2683 +#: access/nbtree/nbtutils.c:2689 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexzeile verweist auf Tupel (%u,%u) in Relation »%s«." -#: access/nbtree/nbtutils.c:2687 +#: access/nbtree/nbtutils.c:2693 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -2233,443 +2239,443 @@ msgstr "während einer parallelen Operation können keine Subtransaktionen commi msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "kann nicht mehr als 2^32-1 Subtransaktionen in einer Transaktion haben" -#: access/transam/xlog.c:1469 +#: access/transam/xlog.c:1470 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "Flush hinter das Ende des erzeugten WAL angefordert; Anforderung %X/%X, aktuelle Position %X/%X" -#: access/transam/xlog.c:2231 +#: access/transam/xlog.c:2232 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "konnte nicht in Logdatei %s bei Position %u, Länge %zu schreiben: %m" -#: access/transam/xlog.c:3458 access/transam/xlogutils.c:833 -#: replication/walsender.c:2754 +#: access/transam/xlog.c:3459 access/transam/xlogutils.c:833 +#: replication/walsender.c:2758 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" -#: access/transam/xlog.c:3742 +#: access/transam/xlog.c:3743 #, c-format msgid "could not rename file \"%s\": %m" msgstr "konnte Datei »%s« nicht umbenennen: %m" -#: access/transam/xlog.c:3784 access/transam/xlog.c:3794 +#: access/transam/xlog.c:3785 access/transam/xlog.c:3795 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "benötigtes WAL-Verzeichnis »%s« existiert nicht" -#: access/transam/xlog.c:3800 +#: access/transam/xlog.c:3801 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "erzeuge fehlendes WAL-Verzeichnis »%s«" -#: access/transam/xlog.c:3803 commands/dbcommands.c:3192 +#: access/transam/xlog.c:3804 commands/dbcommands.c:3192 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "konnte fehlendes Verzeichnis »%s« nicht erzeugen: %m" -#: access/transam/xlog.c:3870 +#: access/transam/xlog.c:3871 #, c-format msgid "could not generate secret authorization token" msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" -#: access/transam/xlog.c:4020 access/transam/xlog.c:4029 -#: access/transam/xlog.c:4053 access/transam/xlog.c:4060 -#: access/transam/xlog.c:4067 access/transam/xlog.c:4072 -#: access/transam/xlog.c:4079 access/transam/xlog.c:4086 -#: access/transam/xlog.c:4093 access/transam/xlog.c:4100 -#: access/transam/xlog.c:4107 access/transam/xlog.c:4114 -#: access/transam/xlog.c:4123 access/transam/xlog.c:4130 +#: access/transam/xlog.c:4021 access/transam/xlog.c:4030 +#: access/transam/xlog.c:4054 access/transam/xlog.c:4061 +#: access/transam/xlog.c:4068 access/transam/xlog.c:4073 +#: access/transam/xlog.c:4080 access/transam/xlog.c:4087 +#: access/transam/xlog.c:4094 access/transam/xlog.c:4101 +#: access/transam/xlog.c:4108 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4124 access/transam/xlog.c:4131 #: utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "Datenbankdateien sind inkompatibel mit Server" -#: access/transam/xlog.c:4021 +#: access/transam/xlog.c:4022 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d (0x%08x) initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d (0x%08x) kompiliert." -#: access/transam/xlog.c:4025 +#: access/transam/xlog.c:4026 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Das Problem könnte eine falsche Byte-Reihenfolge sein. Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4030 +#: access/transam/xlog.c:4031 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d kompiliert." -#: access/transam/xlog.c:4033 access/transam/xlog.c:4057 -#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 +#: access/transam/xlog.c:4034 access/transam/xlog.c:4058 +#: access/transam/xlog.c:4065 access/transam/xlog.c:4070 #, c-format msgid "It looks like you need to initdb." msgstr "Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4045 #, c-format msgid "incorrect checksum in control file" msgstr "falsche Prüfsumme in Kontrolldatei" -#: access/transam/xlog.c:4054 +#: access/transam/xlog.c:4055 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Der Datenbank-Cluster wurde mit CATALOG_VERSION_NO %d initialisiert, aber der Server wurde mit CATALOG_VERSION_NO %d kompiliert." -#: access/transam/xlog.c:4061 +#: access/transam/xlog.c:4062 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Der Datenbank-Cluster wurde mit MAXALIGN %d initialisiert, aber der Server wurde mit MAXALIGN %d kompiliert." -#: access/transam/xlog.c:4068 +#: access/transam/xlog.c:4069 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Der Datenbank-Cluster verwendet anscheinend ein anderes Fließkommazahlenformat als das Serverprogramm." -#: access/transam/xlog.c:4073 +#: access/transam/xlog.c:4074 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit BLCKSZ %d initialisiert, aber der Server wurde mit BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 -#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 -#: access/transam/xlog.c:4118 access/transam/xlog.c:4126 -#: access/transam/xlog.c:4133 +#: access/transam/xlog.c:4077 access/transam/xlog.c:4084 +#: access/transam/xlog.c:4091 access/transam/xlog.c:4098 +#: access/transam/xlog.c:4105 access/transam/xlog.c:4112 +#: access/transam/xlog.c:4119 access/transam/xlog.c:4127 +#: access/transam/xlog.c:4134 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Es sieht so aus, dass Sie neu kompilieren oder initdb ausführen müssen." -#: access/transam/xlog.c:4080 +#: access/transam/xlog.c:4081 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit RELSEG_SIZE %d initialisiert, aber der Server wurde mit RELSEGSIZE %d kompiliert." -#: access/transam/xlog.c:4087 +#: access/transam/xlog.c:4088 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit XLOG_BLCKSZ %d initialisiert, aber der Server wurde mit XLOG_BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4094 +#: access/transam/xlog.c:4095 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Der Datenbank-Cluster wurde mit NAMEDATALEN %d initialisiert, aber der Server wurde mit NAMEDATALEN %d kompiliert." -#: access/transam/xlog.c:4101 +#: access/transam/xlog.c:4102 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Der Datenbank-Cluster wurde mit INDEX_MAX_KEYS %d initialisiert, aber der Server wurde mit INDEX_MAX_KEYS %d kompiliert." -#: access/transam/xlog.c:4108 +#: access/transam/xlog.c:4109 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit TOAST_MAX_CHUNK_SIZE %d initialisiert, aber der Server wurde mit TOAST_MAX_CHUNK_SIZE %d kompiliert." -#: access/transam/xlog.c:4115 +#: access/transam/xlog.c:4116 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Der Datenbank-Cluster wurde mit LOBLKSIZE %d initialisiert, aber der Server wurde mit LOBLKSIZE %d kompiliert." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4125 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde ohne USE_FLOAT8_BYVAL initialisiert, aber der Server wurde mit USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4132 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde mit USE_FLOAT8_BYVAL initialisiert, aber der Server wurde ohne USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4140 +#: access/transam/xlog.c:4141 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an" msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an" -#: access/transam/xlog.c:4152 +#: access/transam/xlog.c:4153 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»min_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4157 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»max_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:4311 catalog/namespace.c:4335 +#: access/transam/xlog.c:4312 catalog/namespace.c:4335 #: commands/tablespace.c:1216 commands/user.c:2530 commands/variable.c:72 #: tcop/postgres.c:3676 utils/error/elog.c:2242 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." -#: access/transam/xlog.c:4357 commands/user.c:2546 commands/variable.c:173 +#: access/transam/xlog.c:4358 commands/user.c:2546 commands/variable.c:173 #: tcop/postgres.c:3692 utils/error/elog.c:2268 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Unbekanntes Schlüsselwort: »%s«." -#: access/transam/xlog.c:4771 +#: access/transam/xlog.c:4772 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schreiben: %m" -#: access/transam/xlog.c:4779 +#: access/transam/xlog.c:4780 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht fsyncen: %m" -#: access/transam/xlog.c:4785 +#: access/transam/xlog.c:4786 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schließen: %m" -#: access/transam/xlog.c:5002 +#: access/transam/xlog.c:5003 #, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "WAL wurde mit wal_level=minimal erzeugt, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:5003 +#: access/transam/xlog.c:5004 #, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." msgstr "Das passiert, wenn auf dem Server vorübergehend wal_level=minimal gesetzt wurde." -#: access/transam/xlog.c:5004 +#: access/transam/xlog.c:5005 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "Verwenden Sie ein Backup, das durchgeführt wurde, nachdem wal_level auf höher als minimal gesetzt wurde." -#: access/transam/xlog.c:5068 +#: access/transam/xlog.c:5069 #, c-format msgid "control file contains invalid checkpoint location" msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" -#: access/transam/xlog.c:5079 +#: access/transam/xlog.c:5080 #, c-format msgid "database system was shut down at %s" msgstr "Datenbanksystem wurde am %s heruntergefahren" -#: access/transam/xlog.c:5085 +#: access/transam/xlog.c:5086 #, c-format msgid "database system was shut down in recovery at %s" msgstr "Datenbanksystem wurde während der Wiederherstellung am %s heruntergefahren" -#: access/transam/xlog.c:5091 +#: access/transam/xlog.c:5092 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "Datenbanksystem wurde beim Herunterfahren unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5097 +#: access/transam/xlog.c:5098 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "Datenbanksystem wurde während der Wiederherstellung am %s unterbrochen" -#: access/transam/xlog.c:5099 +#: access/transam/xlog.c:5100 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Das bedeutet wahrscheinlich, dass einige Daten verfälscht sind und Sie die letzte Datensicherung zur Wiederherstellung verwenden müssen." -#: access/transam/xlog.c:5105 +#: access/transam/xlog.c:5106 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "Datenbanksystem wurde während der Wiederherstellung bei Logzeit %s unterbrochen" -#: access/transam/xlog.c:5107 +#: access/transam/xlog.c:5108 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Wenn dies mehr als einmal vorgekommen ist, dann sind einige Daten möglicherweise verfälscht und Sie müssen ein früheres Wiederherstellungsziel wählen." -#: access/transam/xlog.c:5113 +#: access/transam/xlog.c:5114 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "Datenbanksystem wurde unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5119 +#: access/transam/xlog.c:5120 #, c-format msgid "control file contains invalid database cluster state" msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5505 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL endet vor dem Ende der Online-Sicherung" -#: access/transam/xlog.c:5505 +#: access/transam/xlog.c:5506 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Der komplette WAL, der während der Online-Sicherung erzeugt wurde, muss bei der Wiederherstellung verfügbar sein." -#: access/transam/xlog.c:5508 +#: access/transam/xlog.c:5509 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" -#: access/transam/xlog.c:5554 +#: access/transam/xlog.c:5555 #, c-format msgid "selected new timeline ID: %u" msgstr "gewählte neue Zeitleisten-ID: %u" -#: access/transam/xlog.c:5587 +#: access/transam/xlog.c:5588 #, c-format msgid "archive recovery complete" msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6217 +#: access/transam/xlog.c:6218 #, c-format msgid "shutting down" msgstr "fahre herunter" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6256 +#: access/transam/xlog.c:6257 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "Restart-Punkt beginnt:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6268 +#: access/transam/xlog.c:6269 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "Checkpoint beginnt:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6333 +#: access/transam/xlog.c:6334 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Restart-Punkt komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:6356 +#: access/transam/xlog.c:6357 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Checkpoint komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:6801 +#: access/transam/xlog.c:6812 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "gleichzeitige Write-Ahead-Log-Aktivität während das Datenbanksystem herunterfährt" -#: access/transam/xlog.c:7362 +#: access/transam/xlog.c:7399 #, c-format msgid "recovery restart point at %X/%X" msgstr "Recovery-Restart-Punkt bei %X/%X" -#: access/transam/xlog.c:7364 +#: access/transam/xlog.c:7401 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." -#: access/transam/xlog.c:7612 +#: access/transam/xlog.c:7651 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" -#: access/transam/xlog.c:7819 +#: access/transam/xlog.c:7858 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:7877 +#: access/transam/xlog.c:7916 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Shutdown-Checkpoint-Datensatz" -#: access/transam/xlog.c:7935 +#: access/transam/xlog.c:7974 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Online-Checkpoint-Datensatz" -#: access/transam/xlog.c:7964 +#: access/transam/xlog.c:8003 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im End-of-Recovery-Datensatz" -#: access/transam/xlog.c:8231 +#: access/transam/xlog.c:8270 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" -#: access/transam/xlog.c:8236 +#: access/transam/xlog.c:8275 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fdatasyncen: %m" -#: access/transam/xlog.c:8321 access/transam/xlog.c:8644 +#: access/transam/xlog.c:8360 access/transam/xlog.c:8683 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" -#: access/transam/xlog.c:8322 access/transam/xlog.c:8645 +#: access/transam/xlog.c:8361 access/transam/xlog.c:8684 #: access/transam/xlogfuncs.c:254 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "wal_level muss beim Serverstart auf »replica« oder »logical« gesetzt werden." -#: access/transam/xlog.c:8327 +#: access/transam/xlog.c:8366 #, c-format msgid "backup label too long (max %d bytes)" msgstr "Backup-Label zu lang (maximal %d Bytes)" -#: access/transam/xlog.c:8448 +#: access/transam/xlog.c:8487 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "mit full_page_writes=off erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" -#: access/transam/xlog.c:8450 access/transam/xlog.c:8733 +#: access/transam/xlog.c:8489 access/transam/xlog.c:8772 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver full_page_writes ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." -#: access/transam/xlog.c:8517 backup/basebackup.c:1355 utils/adt/misc.c:354 +#: access/transam/xlog.c:8556 backup/basebackup.c:1355 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: access/transam/xlog.c:8524 backup/basebackup.c:1360 utils/adt/misc.c:359 +#: access/transam/xlog.c:8563 backup/basebackup.c:1360 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: access/transam/xlog.c:8683 backup/basebackup.c:1221 +#: access/transam/xlog.c:8722 backup/basebackup.c:1221 #, c-format msgid "the standby was promoted during online backup" msgstr "der Standby-Server wurde während der Online-Sicherung zum Primärserver befördert" -#: access/transam/xlog.c:8684 backup/basebackup.c:1222 +#: access/transam/xlog.c:8723 backup/basebackup.c:1222 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Das bedeutet, dass die aktuelle Online-Sicherung verfälscht ist und nicht verwendet werden sollte. Versuchen Sie, eine neue Online-Sicherung durchzuführen." -#: access/transam/xlog.c:8731 +#: access/transam/xlog.c:8770 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "mit full_page_writes=off erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" -#: access/transam/xlog.c:8847 +#: access/transam/xlog.c:8886 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "Basissicherung beendet, warte bis die benötigten WAL-Segmente archiviert sind" -#: access/transam/xlog.c:8861 +#: access/transam/xlog.c:8900 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "warte immer noch, bis alle benötigten WAL-Segmente archiviert sind (%d Sekunden abgelaufen)" -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8902 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Prüfen Sie, ob das archive_command korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." -#: access/transam/xlog.c:8870 +#: access/transam/xlog.c:8909 #, c-format msgid "all required WAL segments have been archived" msgstr "alle benötigten WAL-Segmente wurden archiviert" -#: access/transam/xlog.c:8874 +#: access/transam/xlog.c:8913 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL-Archivierung ist nicht eingeschaltet; Sie müssen dafür sorgen, dass alle benötigten WAL-Segmente auf andere Art kopiert werden, um die Sicherung abzuschließen" -#: access/transam/xlog.c:8913 +#: access/transam/xlog.c:8952 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "Backup wird abgebrochen, weil Backend-Prozess beendete, bevor pg_backup_stop aufgerufen wurde" @@ -2816,147 +2822,147 @@ msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhal msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1136 +#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1146 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: access/transam/xlogreader.c:760 +#: access/transam/xlogreader.c:761 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: access/transam/xlogreader.c:773 +#: access/transam/xlogreader.c:774 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: access/transam/xlogreader.c:1144 +#: access/transam/xlogreader.c:1154 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: access/transam/xlogreader.c:1157 access/transam/xlogreader.c:1173 +#: access/transam/xlogreader.c:1167 access/transam/xlogreader.c:1183 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: access/transam/xlogreader.c:1211 +#: access/transam/xlogreader.c:1221 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: access/transam/xlogreader.c:1245 +#: access/transam/xlogreader.c:1255 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1302 +#: access/transam/xlogreader.c:1270 access/transam/xlogreader.c:1312 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1276 +#: access/transam/xlogreader.c:1286 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: access/transam/xlogreader.c:1284 +#: access/transam/xlogreader.c:1294 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: access/transam/xlogreader.c:1290 +#: access/transam/xlogreader.c:1300 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: access/transam/xlogreader.c:1322 +#: access/transam/xlogreader.c:1332 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1348 +#: access/transam/xlogreader.c:1358 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1754 +#: access/transam/xlogreader.c:1764 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: access/transam/xlogreader.c:1778 +#: access/transam/xlogreader.c:1788 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: access/transam/xlogreader.c:1785 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1821 +#: access/transam/xlogreader.c:1831 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1837 +#: access/transam/xlogreader.c:1847 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1876 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1882 +#: access/transam/xlogreader.c:1892 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: access/transam/xlogreader.c:1894 +#: access/transam/xlogreader.c:1904 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: access/transam/xlogreader.c:1961 +#: access/transam/xlogreader.c:1971 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlogreader.c:1987 +#: access/transam/xlogreader.c:1997 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: access/transam/xlogreader.c:2071 +#: access/transam/xlogreader.c:2081 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: access/transam/xlogreader.c:2078 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: access/transam/xlogreader.c:2105 access/transam/xlogreader.c:2122 +#: access/transam/xlogreader.c:2115 access/transam/xlogreader.c:2132 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: access/transam/xlogreader.c:2131 +#: access/transam/xlogreader.c:2141 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: access/transam/xlogreader.c:2139 +#: access/transam/xlogreader.c:2149 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" @@ -3893,12 +3899,12 @@ msgstr "Klausel IN SCHEMA kann nicht verwendet werden, wenn GRANT/REVOKE ON SCHE #: commands/tablecmds.c:8152 commands/tablecmds.c:8182 #: commands/tablecmds.c:8310 commands/tablecmds.c:8392 #: commands/tablecmds.c:8526 commands/tablecmds.c:8638 -#: commands/tablecmds.c:12480 commands/tablecmds.c:12672 -#: commands/tablecmds.c:12833 commands/tablecmds.c:14028 -#: commands/tablecmds.c:16560 commands/trigger.c:949 parser/analyze.c:2529 +#: commands/tablecmds.c:12467 commands/tablecmds.c:12659 +#: commands/tablecmds.c:12820 commands/tablecmds.c:14038 +#: commands/tablecmds.c:16570 commands/trigger.c:949 parser/analyze.c:2529 #: parser/parse_relation.c:737 parser/parse_target.c:1068 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3443 -#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2876 +#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2893 #: utils/adt/ruleutils.c:2793 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -3909,15 +3915,15 @@ msgstr "Spalte »%s« von Relation »%s« existiert nicht" msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" -#: catalog/aclchk.c:1848 commands/tablecmds.c:14185 commands/tablecmds.c:17469 +#: catalog/aclchk.c:1848 commands/tablecmds.c:14195 commands/tablecmds.c:17479 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" #: catalog/aclchk.c:1856 catalog/objectaddress.c:1401 commands/sequence.c:1178 -#: commands/tablecmds.c:254 commands/tablecmds.c:17433 utils/adt/acl.c:2084 -#: utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 -#: utils/adt/acl.c:2206 utils/adt/acl.c:2236 +#: commands/tablecmds.c:254 commands/tablecmds.c:17443 utils/adt/acl.c:2101 +#: utils/adt/acl.c:2131 utils/adt/acl.c:2163 utils/adt/acl.c:2195 +#: utils/adt/acl.c:2223 utils/adt/acl.c:2253 #, c-format msgid "\"%s\" is not a sequence" msgstr "»%s« ist keine Sequenz" @@ -4431,13 +4437,13 @@ msgstr "kann %s nicht löschen, weil andere Objekte davon abhängen" #: catalog/dependency.c:1209 catalog/dependency.c:1216 #: catalog/dependency.c:1227 commands/tablecmds.c:1349 -#: commands/tablecmds.c:14672 commands/tablespace.c:466 commands/user.c:1303 -#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 +#: commands/tablecmds.c:14682 commands/tablespace.c:466 commands/user.c:1303 +#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:334 #: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1084 #: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 -#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6673 -#: utils/misc/guc.c:6707 utils/misc/guc.c:6741 utils/misc/guc.c:6784 -#: utils/misc/guc.c:6826 +#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6679 +#: utils/misc/guc.c:6713 utils/misc/guc.c:6747 utils/misc/guc.c:6790 +#: utils/misc/guc.c:6832 #, c-format msgid "%s" msgstr "%s" @@ -4595,7 +4601,7 @@ msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" #: catalog/heap.c:2683 catalog/pg_constraint.c:812 commands/tablecmds.c:2686 #: commands/tablecmds.c:3213 commands/tablecmds.c:6926 -#: commands/tablecmds.c:15495 commands/tablecmds.c:15636 +#: commands/tablecmds.c:15505 commands/tablecmds.c:15646 #, c-format msgid "too many inheritance parents" msgstr "zu viele Elterntabellen" @@ -4738,12 +4744,12 @@ msgstr "DROP INDEX CONCURRENTLY muss die erste Aktion in einer Transaktion sein" msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3685 commands/indexcmds.c:3614 +#: catalog/index.c:3685 commands/indexcmds.c:3648 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 +#: catalog/index.c:3701 commands/indexcmds.c:3528 commands/indexcmds.c:3672 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -4760,7 +4766,7 @@ msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "ungültiger Index »%s.%s« einer TOAST-Tabelle kann nicht reindizert werden, wird übersprungen" #: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5736 +#: commands/trigger.c:5764 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" @@ -4843,7 +4849,7 @@ msgstr "Textsuchekonfiguration »%s« existiert nicht" msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: catalog/namespace.c:2886 gram.y:18576 gram.y:18616 parser/parse_expr.c:839 +#: catalog/namespace.c:2886 gram.y:18583 gram.y:18623 parser/parse_expr.c:839 #: parser/parse_target.c:1267 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -4897,25 +4903,25 @@ msgstr "während einer parallelen Operation können keine temporären Tabellen e #: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 #: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2220 -#: commands/tablecmds.c:12608 +#: commands/tablecmds.c:12595 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" #: catalog/objectaddress.c:1416 commands/tablecmds.c:260 -#: commands/tablecmds.c:17438 commands/view.c:119 +#: commands/tablecmds.c:17448 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" #: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 -#: commands/tablecmds.c:17443 +#: commands/tablecmds.c:17453 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" #: catalog/objectaddress.c:1430 commands/tablecmds.c:284 -#: commands/tablecmds.c:17448 +#: commands/tablecmds.c:17458 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" @@ -4938,7 +4944,7 @@ msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" #: catalog/objectaddress.c:1656 commands/functioncmds.c:138 #: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3691 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 -#: utils/adt/acl.c:4441 +#: utils/adt/acl.c:4458 #, c-format msgid "type \"%s\" does not exist" msgstr "Typ »%s« existiert nicht" @@ -4958,8 +4964,9 @@ msgstr "Funktion %d (%s, %s) von %s existiert nicht" msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "Benutzerabbildung für Benutzer »%s« auf Server »%s« existiert nicht" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:710 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:710 #, c-format msgid "server \"%s\" does not exist" msgstr "Server »%s« existiert nicht" @@ -5692,7 +5699,7 @@ msgid "The partition is being detached concurrently or has an unfinished detach. msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." #: catalog/pg_inherits.c:596 commands/tablecmds.c:4646 -#: commands/tablecmds.c:15751 +#: commands/tablecmds.c:15761 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Verwendet Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die unerledigte Abtrennoperation abzuschließen." @@ -6003,12 +6010,12 @@ msgstr "kann Objekte, die %s gehören, nicht löschen, weil sie vom Datenbanksys msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "kann den Eigentümer von den Objekten, die %s gehören, nicht ändern, weil die Objekte vom Datenbanksystem benötigt werden" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:449 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "konnte Relation-Mapping für Subskription »%s« nicht löschen" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:451 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status »%c«." @@ -6016,7 +6023,7 @@ msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:458 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Verwenden Sie %s um die Subskription zu aktivieren, falls noch nicht aktiviert, oder %s um die Subskription zu löschen." @@ -6162,12 +6169,12 @@ msgstr "Parameter »%s« muss READ_ONLY, SHAREABLE oder READ_WRITE sein" msgid "event trigger \"%s\" already exists" msgstr "Ereignistrigger »%s« existiert bereits" -#: commands/alter.c:90 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "Fremddaten-Wrapper »%s« existiert bereits" -#: commands/alter.c:93 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" @@ -6268,7 +6275,7 @@ msgid "handler function is not specified" msgstr "keine Handler-Funktion angegeben" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 +#: commands/foreigncmds.c:500 commands/proclang.c:80 commands/trigger.c:709 #: parser/parse_clause.c:941 #, c-format msgid "function %s must return type %s" @@ -6374,7 +6381,7 @@ msgstr "kann temporäre Tabellen anderer Sitzungen nicht clustern" msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:192 commands/tablecmds.c:14486 commands/tablecmds.c:16330 +#: commands/cluster.c:192 commands/tablecmds.c:14496 commands/tablecmds.c:16340 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" @@ -6389,7 +6396,7 @@ msgstr "globaler Katalog kann nicht geclustert werden" msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:513 commands/tablecmds.c:16340 +#: commands/cluster.c:513 commands/tablecmds.c:16350 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" @@ -6524,8 +6531,8 @@ msgstr "Version der Standardsortierfolge kann nicht aufgefrischt werden" #. translator: %s is an SQL ALTER command #: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 #: commands/tablecmds.c:7810 commands/tablecmds.c:7820 -#: commands/tablecmds.c:14188 commands/tablecmds.c:17471 -#: commands/tablecmds.c:17492 commands/typecmds.c:3637 commands/typecmds.c:3720 +#: commands/tablecmds.c:14198 commands/tablecmds.c:17481 +#: commands/tablecmds.c:17502 commands/typecmds.c:3637 commands/typecmds.c:3720 #: commands/typecmds.c:4013 #, c-format msgid "Use %s instead." @@ -7665,7 +7672,7 @@ msgstr "Verwenden Sie DROP AGGREGATE, um Aggregatfunktionen zu löschen." #: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3739 #: commands/tablecmds.c:3897 commands/tablecmds.c:3949 -#: commands/tablecmds.c:16755 tcop/utility.c:1336 +#: commands/tablecmds.c:16765 tcop/utility.c:1336 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" @@ -7790,7 +7797,7 @@ msgstr "Regel »%s« für Relation »%s« existiert nicht, wird übersprungen" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "Fremddaten-Wrapper »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Server »%s« existiert nicht, wird übersprungen" @@ -8185,112 +8192,112 @@ msgstr "kann Schema »%s« nicht zu Erweiterung »%s« hinzufügen, weil das Sch msgid "file \"%s\" is too large" msgstr "Datei »%s« ist zu groß" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "Option »%s« nicht gefunden" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "Option »%s« mehrmals angegeben" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Eigentümer des Fremddaten-Wrappers »%s« zu ändern" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "Nur Superuser können den Eigentümer eines Fremddaten-Wrappers ändern." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Der Eigentümer eines Fremddaten-Wrappers muss ein Superuser sein." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:688 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:688 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "Fremddaten-Wrapper »%s« existiert nicht" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "Fremddaten-Wrapper mit OID %u existiert nicht" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "Fremdserver mit OID %u existiert nicht" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu erzeugen" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper anlegen." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu ändern" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper ändern." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "das Ändern des Handlers des Fremddaten-Wrappers kann das Verhalten von bestehenden Fremdtabellen verändern" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "durch Ändern des Validators des Fremddaten-Wrappers können die Optionen von abhängigen Objekten ungültig werden" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "Server »%s« existiert bereits, wird übersprungen" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1507 foreign/foreign.c:401 +#: commands/foreigncmds.c:1518 foreign/foreign.c:401 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "Fremddaten-Wrapper »%s« hat keinen Handler" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "Fremddaten-Wrapper »%s« unterstützt IMPORT FOREIGN SCHEMA nicht" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "importiere Fremdtabelle »%s«" @@ -8809,7 +8816,7 @@ msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" msgid "could not determine which collation to use for index expression" msgstr "konnte die für den Indexausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/indexcmds.c:2029 commands/tablecmds.c:17772 commands/typecmds.c:807 +#: commands/indexcmds.c:2029 commands/tablecmds.c:17782 commands/typecmds.c:807 #: parser/parse_expr.c:2730 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 #: utils/adt/misc.c:586 #, c-format @@ -8846,8 +8853,8 @@ msgstr "Zugriffsmethode »%s« unterstützt die Optionen ASC/DESC nicht" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2211 commands/tablecmds.c:17797 -#: commands/tablecmds.c:17803 commands/typecmds.c:2301 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17807 +#: commands/tablecmds.c:17813 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "Datentyp %s hat keine Standardoperatorklasse für Zugriffsmethode »%s«" @@ -8873,83 +8880,83 @@ msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" msgid "there are multiple default operator classes for data type %s" msgstr "es gibt mehrere Standardoperatorklassen für Datentyp %s" -#: commands/indexcmds.c:2682 +#: commands/indexcmds.c:2716 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" -#: commands/indexcmds.c:2906 +#: commands/indexcmds.c:2940 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "Tabelle »%s« hat keine Indexe, die nebenläufig reindiziert werden können" -#: commands/indexcmds.c:2920 +#: commands/indexcmds.c:2954 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 -#: commands/indexcmds.c:3603 +#: commands/indexcmds.c:2999 commands/indexcmds.c:3509 +#: commands/indexcmds.c:3637 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2988 +#: commands/indexcmds.c:3022 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:3082 +#: commands/indexcmds.c:3116 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden, werden alle übersprungen" -#: commands/indexcmds.c:3115 +#: commands/indexcmds.c:3149 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:3161 +#: commands/indexcmds.c:3195 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:3164 +#: commands/indexcmds.c:3198 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 +#: commands/indexcmds.c:3389 commands/indexcmds.c:4253 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 +#: commands/indexcmds.c:3541 commands/indexcmds.c:3593 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "ungültiger Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" -#: commands/indexcmds.c:3513 +#: commands/indexcmds.c:3547 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "Exclusion-Constraint-Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" -#: commands/indexcmds.c:3668 +#: commands/indexcmds.c:3702 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3689 +#: commands/indexcmds.c:3723 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "nicht geteilte Relation kann nicht nach Tablespace »%s« verschoben werden" -#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 +#: commands/indexcmds.c:4234 commands/indexcmds.c:4246 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 +#: commands/indexcmds.c:4236 commands/indexcmds.c:4255 #, c-format msgid "%s." msgstr "%s." @@ -8964,7 +8971,7 @@ msgstr "kann Relation »%s« nicht sperren" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY kann nicht verwendet werden, wenn die materialisierte Sicht nicht befüllt ist" -#: commands/matview.c:199 gram.y:18313 +#: commands/matview.c:199 gram.y:18320 #, c-format msgid "%s and %s options cannot be used together" msgstr "Optionen %s und %s können nicht zusammen verwendet werden" @@ -9264,8 +9271,8 @@ msgstr "Operator-Attribut »%s« kann nicht geändert werden" #: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 #: commands/tablecmds.c:1630 commands/tablecmds.c:2233 #: commands/tablecmds.c:3549 commands/tablecmds.c:6434 -#: commands/tablecmds.c:9294 commands/tablecmds.c:17359 -#: commands/tablecmds.c:17394 commands/trigger.c:323 commands/trigger.c:1339 +#: commands/tablecmds.c:9294 commands/tablecmds.c:17369 +#: commands/tablecmds.c:17404 commands/trigger.c:323 commands/trigger.c:1339 #: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 #: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format @@ -9318,7 +9325,7 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "kann WITH-HOLD-Cursor nicht in einer sicherheitsbeschränkten Operation erzeugen" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2917 utils/adt/xml.c:3087 +#: executor/execCurrent.c:70 utils/adt/xml.c:2919 utils/adt/xml.c:3089 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" @@ -9364,7 +9371,7 @@ msgid "must be superuser to create custom procedural language" msgstr "nur Superuser können maßgeschneiderte prozedurale Sprachen erzeugen" #: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 -#: postmaster/postmaster.c:1306 storage/file/fd.c:3911 +#: postmaster/postmaster.c:1306 storage/file/fd.c:3908 #: utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" @@ -9716,8 +9723,8 @@ msgstr "Sequenz muss im selben Schema wie die verknüpfte Tabelle sein" msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1689 commands/tablecmds.c:14175 -#: commands/tablecmds.c:16775 +#: commands/sequence.c:1689 commands/tablecmds.c:14185 +#: commands/tablecmds.c:16785 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." @@ -9854,7 +9861,7 @@ msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können Subskriptionen erzeugen." #: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 -#: replication/logical/tablesync.c:1334 replication/logical/worker.c:4650 +#: replication/logical/tablesync.c:1360 replication/logical/worker.c:4650 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" @@ -9978,7 +9985,7 @@ msgstr[1] "Die zu erzeugende Subskription hat Publikationen (%s) abonniert, die msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "Überprüfen Sie, dass die von den publizierten Tabellen kopierten initialen Daten nicht von anderen Origins kamen." -#: commands/subscriptioncmds.c:2145 replication/logical/tablesync.c:893 +#: commands/subscriptioncmds.c:2145 replication/logical/tablesync.c:919 #: replication/pgoutput/pgoutput.c:1138 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" @@ -10076,7 +10083,7 @@ msgstr "materialisierte Sicht »%s« existiert nicht, wird übersprungen" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Verwenden Sie DROP MATERIALIZED VIEW, um eine materialisierte Sicht zu löschen." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19372 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19390 #: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" @@ -10100,8 +10107,8 @@ msgstr "»%s« ist kein Typ" msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:282 commands/tablecmds.c:14014 -#: commands/tablecmds.c:16480 +#: commands/tablecmds.c:282 commands/tablecmds.c:14024 +#: commands/tablecmds.c:16490 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" @@ -10125,7 +10132,7 @@ msgstr "ON COMMIT kann nur mit temporären Tabellen verwendet werden" msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:785 commands/tablecmds.c:15325 +#: commands/tablecmds.c:785 commands/tablecmds.c:15335 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" @@ -10195,7 +10202,7 @@ msgstr "kann Fremdtabelle »%s« nicht leeren" msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2502 commands/tablecmds.c:15222 +#: commands/tablecmds.c:2502 commands/tablecmds.c:15232 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" @@ -10216,12 +10223,12 @@ msgstr "geerbte Relation »%s« ist keine Tabelle oder Fremdtabelle" msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition der permanenten Relation »%s« erzeugt werden" -#: commands/tablecmds.c:2536 commands/tablecmds.c:15201 +#: commands/tablecmds.c:2536 commands/tablecmds.c:15211 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2546 commands/tablecmds.c:15209 +#: commands/tablecmds.c:2546 commands/tablecmds.c:15219 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "von temporärer Relation einer anderen Sitzung kann nicht geerbt werden" @@ -10276,7 +10283,7 @@ msgid "inherited column \"%s\" has a generation conflict" msgstr "geerbte Spalte »%s« hat einen Generierungskonflikt" #: commands/tablecmds.c:2781 commands/tablecmds.c:2836 -#: commands/tablecmds.c:12707 parser/parse_utilcmd.c:1293 +#: commands/tablecmds.c:12694 parser/parse_utilcmd.c:1293 #: parser/parse_utilcmd.c:1336 parser/parse_utilcmd.c:1773 #: parser/parse_utilcmd.c:1881 #, c-format @@ -10526,12 +10533,12 @@ msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6909 commands/tablecmds.c:15452 +#: commands/tablecmds.c:6909 commands/tablecmds.c:15462 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:6915 commands/tablecmds.c:15459 +#: commands/tablecmds.c:6915 commands/tablecmds.c:15469 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" @@ -10561,13 +10568,13 @@ msgstr "Spalte »%s« von Relation »%s« existiert bereits, wird übersprungen" msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:7415 commands/tablecmds.c:12334 +#: commands/tablecmds.c:7415 commands/tablecmds.c:12321 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "Constraint kann nicht nur von der partitionierten Tabelle entfernt werden, wenn Partitionen existieren" #: commands/tablecmds.c:7416 commands/tablecmds.c:7733 -#: commands/tablecmds.c:8706 commands/tablecmds.c:12335 +#: commands/tablecmds.c:8706 commands/tablecmds.c:12322 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." @@ -10577,8 +10584,8 @@ msgstr "Lassen Sie das Schlüsselwort ONLY weg." #: commands/tablecmds.c:8013 commands/tablecmds.c:8072 #: commands/tablecmds.c:8191 commands/tablecmds.c:8330 #: commands/tablecmds.c:8400 commands/tablecmds.c:8534 -#: commands/tablecmds.c:12489 commands/tablecmds.c:14037 -#: commands/tablecmds.c:16569 +#: commands/tablecmds.c:12476 commands/tablecmds.c:14047 +#: commands/tablecmds.c:16579 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" @@ -10793,686 +10800,686 @@ msgstr "Schlüsselspalten »%s« und »%s« haben inkompatible Typen: %s und %s. msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "Spalte »%s«, auf die in der ON-DELETE-SET-Aktion verwiesen wird, muss Teil des Fremdschlüssels sein" -#: commands/tablecmds.c:10070 commands/tablecmds.c:10510 +#: commands/tablecmds.c:10070 commands/tablecmds.c:10497 #: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:951 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Fremdschlüssel-Constraints auf Fremdtabellen werden nicht unterstützt" -#: commands/tablecmds.c:10493 +#: commands/tablecmds.c:10480 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "kann Tabelle »%s« nicht als Partition anfügen, weil auf sie von Fremdschlüssel »%s« verwiesen wird" -#: commands/tablecmds.c:11094 commands/tablecmds.c:11375 -#: commands/tablecmds.c:12291 commands/tablecmds.c:12366 +#: commands/tablecmds.c:11081 commands/tablecmds.c:11362 +#: commands/tablecmds.c:12278 commands/tablecmds.c:12353 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:11101 +#: commands/tablecmds.c:11088 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel-Constraint" -#: commands/tablecmds.c:11139 +#: commands/tablecmds.c:11126 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:11142 +#: commands/tablecmds.c:11129 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Constraint »%s« ist von Constraint »%s« von Relation »%s« abgeleitet." -#: commands/tablecmds.c:11144 +#: commands/tablecmds.c:11131 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Sie können stattdessen den Constraint, von dem er abgeleitet ist, ändern." -#: commands/tablecmds.c:11383 +#: commands/tablecmds.c:11370 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel- oder Check-Constraint" -#: commands/tablecmds.c:11460 +#: commands/tablecmds.c:11447 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:11547 +#: commands/tablecmds.c:11534 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Spalte »%s«, die im Fremdschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:11553 +#: commands/tablecmds.c:11540 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:11557 +#: commands/tablecmds.c:11544 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "Fremdschlüssel kann nicht mehr als %d Schlüssel haben" -#: commands/tablecmds.c:11622 +#: commands/tablecmds.c:11609 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "aufschiebbarer Primärschlüssel kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:11639 +#: commands/tablecmds.c:11626 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Primärschlüssel" -#: commands/tablecmds.c:11707 +#: commands/tablecmds.c:11694 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "die Liste der Spalten, auf die ein Fremdschlüssel verweist, darf keine doppelten Einträge enthalten" -#: commands/tablecmds.c:11799 +#: commands/tablecmds.c:11786 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "aufschiebbarer Unique-Constraint kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:11804 +#: commands/tablecmds.c:11791 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Unique-Constraint, der auf die angegebenen Schlüssel passt" -#: commands/tablecmds.c:12247 +#: commands/tablecmds.c:12234 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "geerbter Constraint »%s« von Relation »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:12297 +#: commands/tablecmds.c:12284 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:12473 +#: commands/tablecmds.c:12460 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:12499 +#: commands/tablecmds.c:12486 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "USING kann nicht angegeben werden, wenn der Typ einer generierten Spalte geändert wird" -#: commands/tablecmds.c:12500 commands/tablecmds.c:17615 -#: commands/tablecmds.c:17705 commands/trigger.c:663 +#: commands/tablecmds.c:12487 commands/tablecmds.c:17625 +#: commands/tablecmds.c:17715 commands/trigger.c:663 #: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Spalte »%s« ist eine generierte Spalte." -#: commands/tablecmds.c:12510 +#: commands/tablecmds.c:12497 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:12519 +#: commands/tablecmds.c:12506 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht geändert werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:12569 +#: commands/tablecmds.c:12556 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "Ergebnis der USING-Klausel für Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12572 +#: commands/tablecmds.c:12559 #, c-format msgid "You might need to add an explicit cast." msgstr "Sie müssen möglicherweise eine ausdrückliche Typumwandlung hinzufügen." -#: commands/tablecmds.c:12576 +#: commands/tablecmds.c:12563 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12580 +#: commands/tablecmds.c:12567 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:12679 +#: commands/tablecmds.c:12666 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:12708 +#: commands/tablecmds.c:12695 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-Ausdruck enthält einen Verweis auf die ganze Zeile der Tabelle." -#: commands/tablecmds.c:12719 +#: commands/tablecmds.c:12706 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "Typ der vererbten Spalte »%s« muss ebenso in den abgeleiteten Tabellen geändert werden" -#: commands/tablecmds.c:12844 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:12882 +#: commands/tablecmds.c:12869 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "Generierungsausdruck der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12887 +#: commands/tablecmds.c:12874 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "Vorgabewert der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12975 +#: commands/tablecmds.c:12962 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "Typ einer Spalte, die von einer Funktion oder Prozedur verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12976 commands/tablecmds.c:12990 -#: commands/tablecmds.c:13009 commands/tablecmds.c:13027 -#: commands/tablecmds.c:13085 +#: commands/tablecmds.c:12963 commands/tablecmds.c:12977 +#: commands/tablecmds.c:12996 commands/tablecmds.c:13014 +#: commands/tablecmds.c:13072 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:12989 +#: commands/tablecmds.c:12976 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "Typ einer Spalte, die von einer Sicht oder Regel verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:13008 +#: commands/tablecmds.c:12995 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "Typ einer Spalte, die in einer Trigger-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:13026 +#: commands/tablecmds.c:13013 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "Typ einer Spalte, die in einer Policy-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:13057 +#: commands/tablecmds.c:13044 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "Typ einer Spalte, die von einer generierten Spalte verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:13058 +#: commands/tablecmds.c:13045 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:13084 +#: commands/tablecmds.c:13071 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "Typ einer Spalte, die in der WHERE-Klausel einer Publikation verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:14145 commands/tablecmds.c:14157 +#: commands/tablecmds.c:14155 commands/tablecmds.c:14167 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:14147 commands/tablecmds.c:14159 +#: commands/tablecmds.c:14157 commands/tablecmds.c:14169 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." -#: commands/tablecmds.c:14173 +#: commands/tablecmds.c:14183 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:14198 +#: commands/tablecmds.c:14208 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:14560 +#: commands/tablecmds.c:14570 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:14637 +#: commands/tablecmds.c:14647 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:14671 commands/view.c:445 +#: commands/tablecmds.c:14681 commands/view.c:445 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION wird nur für automatisch aktualisierbare Sichten unterstützt" -#: commands/tablecmds.c:14922 +#: commands/tablecmds.c:14932 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "nur Tabellen, Indexe und materialisierte Sichten existieren in Tablespaces" -#: commands/tablecmds.c:14934 +#: commands/tablecmds.c:14944 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "Relationen können nicht in den oder aus dem Tablespace »pg_global« verschoben werden" -#: commands/tablecmds.c:15026 +#: commands/tablecmds.c:15036 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "Abbruch weil Sperre für Relation »%s.%s« nicht verfügbar ist" -#: commands/tablecmds.c:15042 +#: commands/tablecmds.c:15052 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:15160 +#: commands/tablecmds.c:15170 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15165 commands/tablecmds.c:15683 +#: commands/tablecmds.c:15175 commands/tablecmds.c:15693 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:15170 +#: commands/tablecmds.c:15180 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15216 +#: commands/tablecmds.c:15226 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "an temporäre Relation einer anderen Sitzung kann nicht vererbt werden" -#: commands/tablecmds.c:15229 +#: commands/tablecmds.c:15239 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:15251 commands/tablecmds.c:18116 +#: commands/tablecmds.c:15261 commands/tablecmds.c:18126 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:15252 commands/tablecmds.c:18117 +#: commands/tablecmds.c:15262 commands/tablecmds.c:18127 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:15265 +#: commands/tablecmds.c:15275 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« ein Vererbungskind werden kann" -#: commands/tablecmds.c:15267 +#: commands/tablecmds.c:15277 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-Trigger mit Übergangstabellen werden in Vererbungshierarchien nicht unterstützt." -#: commands/tablecmds.c:15470 +#: commands/tablecmds.c:15480 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Spalte »%s« in abgeleiteter Tabelle muss als NOT NULL markiert sein" -#: commands/tablecmds.c:15479 +#: commands/tablecmds.c:15489 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle muss eine generierte Spalte sein" -#: commands/tablecmds.c:15484 +#: commands/tablecmds.c:15494 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle darf keine generierte Spalte sein" -#: commands/tablecmds.c:15515 +#: commands/tablecmds.c:15525 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:15603 +#: commands/tablecmds.c:15613 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Definition für Check-Constraint »%s«" -#: commands/tablecmds.c:15611 +#: commands/tablecmds.c:15621 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:15622 +#: commands/tablecmds.c:15632 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:15661 +#: commands/tablecmds.c:15671 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:15747 +#: commands/tablecmds.c:15757 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "Partition »%s« hat schon eine unerledigte Abtrennoperation in der partitionierten Tabelle »%s.%s«" -#: commands/tablecmds.c:15776 commands/tablecmds.c:15824 +#: commands/tablecmds.c:15786 commands/tablecmds.c:15834 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:15830 +#: commands/tablecmds.c:15840 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:16058 +#: commands/tablecmds.c:16068 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:16088 +#: commands/tablecmds.c:16098 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:16099 +#: commands/tablecmds.c:16109 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:16108 +#: commands/tablecmds.c:16118 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:16122 +#: commands/tablecmds.c:16132 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:16174 +#: commands/tablecmds.c:16184 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:16348 +#: commands/tablecmds.c:16358 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "nicht eindeutiger Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16354 +#: commands/tablecmds.c:16364 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil er nicht IMMEDIATE ist" -#: commands/tablecmds.c:16360 +#: commands/tablecmds.c:16370 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "Ausdrucksindex »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16366 +#: commands/tablecmds.c:16376 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "partieller Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16383 +#: commands/tablecmds.c:16393 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte %d eine Systemspalte ist" -#: commands/tablecmds.c:16390 +#: commands/tablecmds.c:16400 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte »%s« NULL-Werte akzeptiert" -#: commands/tablecmds.c:16635 +#: commands/tablecmds.c:16645 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kann den geloggten Status der Tabelle »%s« nicht ändern, weil sie temporär ist" -#: commands/tablecmds.c:16659 +#: commands/tablecmds.c:16669 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kann Tabelle »%s« nicht in ungeloggt ändern, weil sie Teil einer Publikation ist" -#: commands/tablecmds.c:16661 +#: commands/tablecmds.c:16671 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:16706 +#: commands/tablecmds.c:16716 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in geloggt ändern, weil sie auf die ungeloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:16716 +#: commands/tablecmds.c:16726 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in ungeloggt ändern, weil sie auf die geloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:16774 +#: commands/tablecmds.c:16784 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "einer Tabelle zugeordnete Sequenz kann nicht in ein anderes Schema verschoben werden" -#: commands/tablecmds.c:16879 +#: commands/tablecmds.c:16889 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:17303 +#: commands/tablecmds.c:17313 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" -#: commands/tablecmds.c:17453 +#: commands/tablecmds.c:17463 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:17483 +#: commands/tablecmds.c:17493 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kann Schema des Index »%s« nicht ändern" -#: commands/tablecmds.c:17485 commands/tablecmds.c:17499 +#: commands/tablecmds.c:17495 commands/tablecmds.c:17509 #, c-format msgid "Change the schema of the table instead." msgstr "Ändern Sie stattdessen das Schema der Tabelle." -#: commands/tablecmds.c:17489 +#: commands/tablecmds.c:17499 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" -#: commands/tablecmds.c:17497 +#: commands/tablecmds.c:17507 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:17529 +#: commands/tablecmds.c:17539 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "Partitionierungsstrategie »list« kann nicht mit mehr als einer Spalte verwendet werden" -#: commands/tablecmds.c:17595 +#: commands/tablecmds.c:17605 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Spalte »%s«, die im Partitionierungsschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:17603 +#: commands/tablecmds.c:17613 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:17614 commands/tablecmds.c:17704 +#: commands/tablecmds.c:17624 commands/tablecmds.c:17714 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:17687 +#: commands/tablecmds.c:17697 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:17734 +#: commands/tablecmds.c:17744 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "Funktionen im Partitionierungsschlüsselausdruck müssen als IMMUTABLE markiert sein" -#: commands/tablecmds.c:17743 +#: commands/tablecmds.c:17753 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:17764 +#: commands/tablecmds.c:17774 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "konnte die für den Partitionierungsausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/tablecmds.c:17799 +#: commands/tablecmds.c:17809 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Sie müssen eine hash-Operatorklasse angeben oder eine hash-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:17805 +#: commands/tablecmds.c:17815 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Sie müssen eine btree-Operatorklasse angeben oder eine btree-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:18056 +#: commands/tablecmds.c:18066 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:18062 +#: commands/tablecmds.c:18072 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18078 +#: commands/tablecmds.c:18088 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18092 +#: commands/tablecmds.c:18102 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "eine Tabelle mit abgeleiteten Tabellen kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18126 +#: commands/tablecmds.c:18136 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition an permanente Relation »%s« angefügt werden" -#: commands/tablecmds.c:18134 +#: commands/tablecmds.c:18144 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "eine permanente Relation kann nicht als Partition an temporäre Relation »%s« angefügt werden" -#: commands/tablecmds.c:18142 +#: commands/tablecmds.c:18152 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kann nicht als Partition an temporäre Relation einer anderen Sitzung anfügen" -#: commands/tablecmds.c:18149 +#: commands/tablecmds.c:18159 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "temporäre Relation einer anderen Sitzung kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18169 +#: commands/tablecmds.c:18179 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "Tabelle »%s« enthält Spalte »%s«, die nicht in der Elterntabelle »%s« gefunden wurde" -#: commands/tablecmds.c:18172 +#: commands/tablecmds.c:18182 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Die neue Partition darf nur Spalten enthalten, die auch die Elterntabelle hat." -#: commands/tablecmds.c:18184 +#: commands/tablecmds.c:18194 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« eine Partition werden kann" -#: commands/tablecmds.c:18186 +#: commands/tablecmds.c:18196 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "ROW-Trigger mit Übergangstabellen werden für Partitionen nicht unterstützt." -#: commands/tablecmds.c:18365 +#: commands/tablecmds.c:18375 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht als Partition an partitionierte Tabelle »%s« anfügen" -#: commands/tablecmds.c:18368 +#: commands/tablecmds.c:18378 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:18685 +#: commands/tablecmds.c:18695 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "nebenläufiges Abtrennen einer Partition ist nicht möglich, wenn eine Standardpartition existiert" -#: commands/tablecmds.c:18794 +#: commands/tablecmds.c:18804 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:18800 +#: commands/tablecmds.c:18810 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19406 commands/tablecmds.c:19426 -#: commands/tablecmds.c:19447 commands/tablecmds.c:19466 -#: commands/tablecmds.c:19508 +#: commands/tablecmds.c:19424 commands/tablecmds.c:19444 +#: commands/tablecmds.c:19465 commands/tablecmds.c:19484 +#: commands/tablecmds.c:19526 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "kann Index »%s« nicht als Partition an Index »%s« anfügen" -#: commands/tablecmds.c:19409 +#: commands/tablecmds.c:19427 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Index »%s« ist bereits an einen anderen Index angefügt." -#: commands/tablecmds.c:19429 +#: commands/tablecmds.c:19447 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Index »%s« ist kein Index irgendeiner Partition von Tabelle »%s«." -#: commands/tablecmds.c:19450 +#: commands/tablecmds.c:19468 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:19469 +#: commands/tablecmds.c:19487 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Der Index »%s« gehört zu einem Constraint in Tabelle »%s«, aber kein Constraint existiert für Index »%s«." -#: commands/tablecmds.c:19511 +#: commands/tablecmds.c:19529 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Ein anderer Index ist bereits für Partition »%s« angefügt." -#: commands/tablecmds.c:19747 +#: commands/tablecmds.c:19765 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:19754 +#: commands/tablecmds.c:19772 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:19780 +#: commands/tablecmds.c:19798 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:19790 +#: commands/tablecmds.c:19808 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" @@ -11824,8 +11831,8 @@ msgstr "keine Berechtigung: »%s« ist ein Systemtrigger" msgid "trigger function %u returned null value" msgstr "Triggerfunktion %u gab NULL-Wert zurück" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 -#: commands/trigger.c:3270 +#: commands/trigger.c:2446 commands/trigger.c:2673 commands/trigger.c:2935 +#: commands/trigger.c:3298 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Trigger für BEFORE STATEMENT kann keinen Wert zurückgeben" @@ -11840,40 +11847,45 @@ msgstr "Verschieben einer Zeile in eine andere Partition durch einen BEFORE-FOR- msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Vor der Ausführung von Trigger »%s« gehörte die Zeile in Partition »%s.%s«." -#: commands/trigger.c:3348 executor/nodeModifyTable.c:1563 -#: executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2402 -#: executor/nodeModifyTable.c:2493 executor/nodeModifyTable.c:3054 -#: executor/nodeModifyTable.c:3193 +#: commands/trigger.c:2552 commands/trigger.c:2804 commands/trigger.c:3140 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "aus abgeleiteten Fremdtabellen können keine Übergangstupel gesammelt werden" + +#: commands/trigger.c:3376 executor/nodeModifyTable.c:1564 +#: executor/nodeModifyTable.c:1638 executor/nodeModifyTable.c:2403 +#: executor/nodeModifyTable.c:2494 executor/nodeModifyTable.c:3055 +#: executor/nodeModifyTable.c:3194 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Verwenden Sie einen AFTER-Trigger anstelle eines BEFORE-Triggers, um Änderungen an andere Zeilen zu propagieren." -#: commands/trigger.c:3389 executor/nodeLockRows.c:228 -#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:336 -#: executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2419 -#: executor/nodeModifyTable.c:2643 +#: commands/trigger.c:3417 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:337 +#: executor/nodeModifyTable.c:1580 executor/nodeModifyTable.c:2420 +#: executor/nodeModifyTable.c:2644 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" -#: commands/trigger.c:3397 executor/nodeModifyTable.c:1669 -#: executor/nodeModifyTable.c:2510 executor/nodeModifyTable.c:2667 -#: executor/nodeModifyTable.c:3072 +#: commands/trigger.c:3425 executor/nodeModifyTable.c:1670 +#: executor/nodeModifyTable.c:2511 executor/nodeModifyTable.c:2668 +#: executor/nodeModifyTable.c:3073 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4606 +#: commands/trigger.c:4634 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "aufgeschobener Trigger kann nicht in einer sicherheitsbeschränkten Operation ausgelöst werden" -#: commands/trigger.c:5787 +#: commands/trigger.c:5815 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5810 +#: commands/trigger.c:5838 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" @@ -12331,8 +12343,8 @@ msgstr "Nur Rollen mit dem %s-Attribut können Rollen erzeugen." msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut erzeugen." -#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16733 -#: gram.y:16779 utils/adt/acl.c:5401 utils/adt/acl.c:5407 +#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16740 +#: gram.y:16786 utils/adt/acl.c:5418 utils/adt/acl.c:5424 #, c-format msgid "role name \"%s\" is reserved" msgstr "Rollenname »%s« ist reserviert" @@ -12427,8 +12439,8 @@ msgstr "in DROP ROLE kann kein Rollenplatzhalter verwendet werden" #: commands/user.c:1136 commands/user.c:1358 commands/variable.c:851 #: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 -#: utils/adt/acl.c:356 utils/adt/acl.c:376 utils/adt/acl.c:5256 -#: utils/adt/acl.c:5304 utils/adt/acl.c:5332 utils/adt/acl.c:5351 +#: utils/adt/acl.c:373 utils/adt/acl.c:393 utils/adt/acl.c:5273 +#: utils/adt/acl.c:5321 utils/adt/acl.c:5349 utils/adt/acl.c:5368 #: utils/adt/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" @@ -12619,12 +12631,12 @@ msgstr "keine Berechtigung, um von Rolle »%s« gewährte Privilegien zu entzieh msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können von dieser Rolle gewährte Privilegien entziehen." -#: commands/user.c:2492 utils/adt/acl.c:1309 +#: commands/user.c:2492 utils/adt/acl.c:1326 #, c-format msgid "dependent privileges exist" msgstr "abhängige Privilegien existieren" -#: commands/user.c:2493 utils/adt/acl.c:1310 +#: commands/user.c:2493 utils/adt/acl.c:1327 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Verwenden Sie CASCADE, um diese auch zu entziehen." @@ -12699,42 +12711,42 @@ msgstr "ONLY_DATABASE_STATS kann nicht mit anderen VACUUM-Optionen angegeben wer msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kann nicht aus VACUUM oder ANALYZE ausgeführt werden" -#: commands/vacuum.c:735 +#: commands/vacuum.c:743 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "keine Berechtigung für Vacuum von »%s«, wird übersprungen" -#: commands/vacuum.c:748 +#: commands/vacuum.c:756 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "keine Berechtigung für Analyze von »%s«, wird übersprungen" -#: commands/vacuum.c:826 commands/vacuum.c:923 +#: commands/vacuum.c:834 commands/vacuum.c:931 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "überspringe Vacuum von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:831 +#: commands/vacuum.c:839 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "überspringe Vacuum von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:847 commands/vacuum.c:928 +#: commands/vacuum.c:855 commands/vacuum.c:936 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "überspringe Analyze von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:852 +#: commands/vacuum.c:860 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "überspringe Analyze von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:1163 +#: commands/vacuum.c:1171 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "Obergrenze für das Entfernen und Einfrieren von Tuples ist weit in der Vergangenheit" -#: commands/vacuum.c:1164 commands/vacuum.c:1169 +#: commands/vacuum.c:1172 commands/vacuum.c:1177 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12743,37 +12755,37 @@ msgstr "" "Schließen Sie bald alle offenen Transaktionen, um Überlaufprobleme zu vermeiden.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: commands/vacuum.c:1168 +#: commands/vacuum.c:1176 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "Obergrenze für das Einfrieren von Multixacts ist weit in der Vergangenheit" -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1932 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "einige Datenbanken sind seit über 2 Milliarden Transaktionen nicht gevacuumt worden" -#: commands/vacuum.c:1925 +#: commands/vacuum.c:1933 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Sie haben möglicherweise bereits Daten wegen Transaktionsnummernüberlauf verloren." -#: commands/vacuum.c:2094 +#: commands/vacuum.c:2109 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "überspringe »%s« --- kann Nicht-Tabellen oder besondere Systemtabellen nicht vacuumen" -#: commands/vacuum.c:2519 +#: commands/vacuum.c:2531 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" -#: commands/vacuum.c:2538 +#: commands/vacuum.c:2550 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "Index »%s« enthält %.0f Zeilenversionen in %u Seiten" -#: commands/vacuum.c:2542 +#: commands/vacuum.c:2554 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -13026,25 +13038,25 @@ msgstr "kein Wert für Parameter %d gefunden" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 #: executor/execExprInterp.c:4246 executor/execExprInterp.c:4263 -#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:205 -#: executor/nodeModifyTable.c:224 executor/nodeModifyTable.c:241 -#: executor/nodeModifyTable.c:251 executor/nodeModifyTable.c:261 +#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:206 +#: executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:252 executor/nodeModifyTable.c:262 #, c-format msgid "table row type and query-specified row type do not match" msgstr "Zeilentyp der Tabelle und der von der Anfrage angegebene Zeilentyp stimmen nicht überein" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:206 +#: executor/execExpr.c:638 executor/nodeModifyTable.c:207 #, c-format msgid "Query has too many columns." msgstr "Anfrage hat zu viele Spalten." -#: executor/execExpr.c:645 executor/nodeModifyTable.c:225 +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Anfrage liefert einen Wert für eine gelöschte Spalte auf Position %d." #: executor/execExpr.c:651 executor/execExprInterp.c:4264 -#: executor/nodeModifyTable.c:252 +#: executor/nodeModifyTable.c:253 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Tabelle hat Typ %s auf Position %d, aber Anfrage erwartet %s." @@ -13650,69 +13662,69 @@ msgstr "RIGHT JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unters msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unterstützt" -#: executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:243 #, c-format msgid "Query provides a value for a generated column at ordinal position %d." msgstr "Anfrage liefert einen Wert für eine generierte Spalte auf Position %d." -#: executor/nodeModifyTable.c:262 +#: executor/nodeModifyTable.c:263 #, c-format msgid "Query has too few columns." msgstr "Anfrage hat zu wenige Spalten." -#: executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 +#: executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "das zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:1791 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "invalid ON UPDATE specification" msgstr "ungültige ON-UPDATE-Angabe" -#: executor/nodeModifyTable.c:1792 +#: executor/nodeModifyTable.c:1793 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Das Ergebnistupel würde in einer anderen Partition erscheinen als das ursprüngliche Tupel." -#: executor/nodeModifyTable.c:2251 +#: executor/nodeModifyTable.c:2252 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "Tupel kann nicht zwischen Partitionen bewegt werden, wenn ein Fremdschlüssel direkt auf einen Vorgänger (außer der Wurzel) der Quellpartition verweist" -#: executor/nodeModifyTable.c:2252 +#: executor/nodeModifyTable.c:2253 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "Ein Fremdschlüssel verweist auf den Vorgänger »%s«, aber nicht auf den Wurzelvorgänger »%s«." -#: executor/nodeModifyTable.c:2255 +#: executor/nodeModifyTable.c:2256 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Definieren Sie den Fremdschlüssel eventuell für Tabelle »%s«." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2621 executor/nodeModifyTable.c:3060 -#: executor/nodeModifyTable.c:3199 +#: executor/nodeModifyTable.c:2622 executor/nodeModifyTable.c:3061 +#: executor/nodeModifyTable.c:3200 #, c-format msgid "%s command cannot affect row a second time" msgstr "Befehl in %s kann eine Zeile nicht ein zweites Mal ändern" -#: executor/nodeModifyTable.c:2623 +#: executor/nodeModifyTable.c:2624 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Stellen Sie sicher, dass keine im selben Befehl fürs Einfügen vorgesehene Zeilen doppelte Werte haben, die einen Constraint verletzen würden." -#: executor/nodeModifyTable.c:3053 executor/nodeModifyTable.c:3192 +#: executor/nodeModifyTable.c:3054 executor/nodeModifyTable.c:3193 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "das zu aktualisierende oder zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:3062 executor/nodeModifyTable.c:3201 +#: executor/nodeModifyTable.c:3063 executor/nodeModifyTable.c:3202 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "Stellen Sie sicher, dass nicht mehr als eine Quellzeile auf jede Zielzeile passt." -#: executor/nodeModifyTable.c:3151 +#: executor/nodeModifyTable.c:3152 #, c-format msgid "tuple to be deleted was already moved to another partition due to concurrent update" msgstr "das zu löschende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" @@ -13875,13 +13887,13 @@ msgstr "konnte Tupel nicht an Shared-Memory-Queue senden" msgid "user mapping not found for \"%s\"" msgstr "Benutzerabbildung für »%s« nicht gefunden" -#: foreign/foreign.c:333 optimizer/plan/createplan.c:7102 +#: foreign/foreign.c:333 optimizer/plan/createplan.c:7104 #: optimizer/util/plancat.c:512 #, c-format msgid "access to non-system foreign table is restricted" msgstr "Zugriff auf Nicht-System-Fremdtabelle ist beschränkt" -#: foreign/foreign.c:657 storage/file/fd.c:3931 +#: foreign/foreign.c:657 storage/file/fd.c:3928 #, c-format msgid "invalid option \"%s\"" msgstr "ungültige Option »%s«" @@ -14085,190 +14097,195 @@ msgstr "widersprüchliche oder überflüssige NULL/NOT NULL-Deklarationen für S msgid "unrecognized column option \"%s\"" msgstr "unbekannte Spaltenoption »%s«" -#: gram.y:14109 +#: gram.y:13888 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "Optionsname »%s« kann nicht in XMLTABLE verwendet werden" + +#: gram.y:14116 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "Präzision von Typ float muss mindestens 1 Bit sein" -#: gram.y:14118 +#: gram.y:14125 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "Präzision von Typ float muss weniger als 54 Bits sein" -#: gram.y:14621 +#: gram.y:14628 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf linker Seite von OVERLAPS-Ausdruck" -#: gram.y:14626 +#: gram.y:14633 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf rechter Seite von OVERLAPS-Ausdruck" -#: gram.y:14803 +#: gram.y:14810 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-Prädikat ist noch nicht implementiert" -#: gram.y:15219 +#: gram.y:15226 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "in WITHIN GROUP können nicht mehrere ORDER-BY-Klauseln verwendet werden" -#: gram.y:15224 +#: gram.y:15231 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:15229 +#: gram.y:15236 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:15863 gram.y:15887 +#: gram.y:15870 gram.y:15894 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "Frame-Beginn kann nicht UNBOUNDED FOLLOWING sein" -#: gram.y:15868 +#: gram.y:15875 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "Frame der in der folgenden Zeile beginnt kann nicht in der aktuellen Zeile enden" -#: gram.y:15892 +#: gram.y:15899 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "Frame-Ende kann nicht UNBOUNDED PRECEDING sein" -#: gram.y:15898 +#: gram.y:15905 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "Frame der in der aktuellen Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:15905 +#: gram.y:15912 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "Frame der in der folgenden Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:16666 +#: gram.y:16673 #, c-format msgid "type modifier cannot have parameter name" msgstr "Typmodifikator kann keinen Parameternamen haben" -#: gram.y:16672 +#: gram.y:16679 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "Typmodifikator kann kein ORDER BY haben" -#: gram.y:16740 gram.y:16747 gram.y:16754 +#: gram.y:16747 gram.y:16754 gram.y:16761 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kann hier nicht als Rollenname verwendet werden" -#: gram.y:16844 gram.y:18301 +#: gram.y:16851 gram.y:18308 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES kann nicht ohne ORDER-BY-Klausel angegeben werden" -#: gram.y:17980 gram.y:18167 +#: gram.y:17987 gram.y:18174 msgid "improper use of \"*\"" msgstr "unzulässige Verwendung von »*«" -#: gram.y:18130 gram.y:18147 tsearch/spell.c:964 tsearch/spell.c:981 +#: gram.y:18137 gram.y:18154 tsearch/spell.c:964 tsearch/spell.c:981 #: tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 #, c-format msgid "syntax error" msgstr "Syntaxfehler" -#: gram.y:18231 +#: gram.y:18238 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "eine Ordered-Set-Aggregatfunktion mit einem direkten VARIADIC-Argument muss ein aggregiertes VARIADIC-Argument des selben Datentyps haben" -#: gram.y:18268 +#: gram.y:18275 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "mehrere ORDER-BY-Klauseln sind nicht erlaubt" -#: gram.y:18279 +#: gram.y:18286 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "mehrere OFFSET-Klauseln sind nicht erlaubt" -#: gram.y:18288 +#: gram.y:18295 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "mehrere LIMIT-Klauseln sind nicht erlaubt" -#: gram.y:18297 +#: gram.y:18304 #, c-format msgid "multiple limit options not allowed" msgstr "mehrere Limit-Optionen sind nicht erlaubt" -#: gram.y:18324 +#: gram.y:18331 #, c-format msgid "multiple WITH clauses not allowed" msgstr "mehrere WITH-Klauseln sind nicht erlaubt" -#: gram.y:18517 +#: gram.y:18524 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT- und INOUT-Argumente sind in TABLE-Funktionen nicht erlaubt" -#: gram.y:18650 +#: gram.y:18657 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "mehrere COLLATE-Klauseln sind nicht erlaubt" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18688 gram.y:18701 +#: gram.y:18695 gram.y:18708 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s-Constraints können nicht als DEFERRABLE markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18714 +#: gram.y:18721 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s-Constraints können nicht als NOT VALID markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18727 +#: gram.y:18734 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-Constraints können nicht als NO INHERIT markiert werden" -#: gram.y:18749 +#: gram.y:18756 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "unbekannte Partitionierungsstrategie »%s«" -#: gram.y:18773 +#: gram.y:18780 #, c-format msgid "invalid publication object list" msgstr "ungültige Publikationsobjektliste" -#: gram.y:18774 +#: gram.y:18781 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "Entweder TABLE oder TABLES IN SCHEMA muss vor einem alleinstehenden Tabellen- oder Schemanamen angegeben werden." -#: gram.y:18790 +#: gram.y:18797 #, c-format msgid "invalid table name" msgstr "ungültiger Tabellenname" -#: gram.y:18811 +#: gram.y:18818 #, c-format msgid "WHERE clause not allowed for schema" msgstr "für Schemas ist keine WHERE-Klausel erlaubt" -#: gram.y:18818 +#: gram.y:18825 #, c-format msgid "column specification not allowed for schema" msgstr "für Schemas ist keine Spaltenangabe erlaubt" -#: gram.y:18832 +#: gram.y:18839 #, c-format msgid "invalid schema name" msgstr "ungültiger Schemaname" @@ -14561,550 +14578,550 @@ msgstr "Fehlerhafter Proof in »client-final-message«." msgid "Garbage found at the end of client-final-message." msgstr "Müll am Ende der »client-final-message« gefunden." -#: libpq/auth.c:271 +#: libpq/auth.c:279 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: Host abgelehnt" -#: libpq/auth.c:274 +#: libpq/auth.c:282 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "»trust«-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:277 +#: libpq/auth.c:285 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:280 +#: libpq/auth.c:288 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:285 +#: libpq/auth.c:293 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Passwort-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:290 +#: libpq/auth.c:298 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:293 +#: libpq/auth.c:301 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:296 +#: libpq/auth.c:304 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:299 +#: libpq/auth.c:307 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:302 +#: libpq/auth.c:310 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:305 +#: libpq/auth.c:313 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:308 +#: libpq/auth.c:316 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADIUS-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:311 +#: libpq/auth.c:319 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: ungültige Authentifizierungsmethode" -#: libpq/auth.c:315 +#: libpq/auth.c:323 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Verbindung stimmte mit Datei »%s« Zeile %d überein: »%s«" -#: libpq/auth.c:359 +#: libpq/auth.c:367 #, c-format msgid "authentication identifier set more than once" msgstr "Authentifizierungsbezeichner mehrmals gesetzt" -#: libpq/auth.c:360 +#: libpq/auth.c:368 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "vorheriger Bezeichner: »%s«; neuer Bezeichner: »%s«" -#: libpq/auth.c:370 +#: libpq/auth.c:378 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "Verbindung authentifiziert: Identität=»%s« Methode=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:418 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "Client-Zertifikate können nur überprüft werden, wenn Wurzelzertifikat verfügbar ist" -#: libpq/auth.c:421 +#: libpq/auth.c:429 #, c-format msgid "connection requires a valid client certificate" msgstr "Verbindung erfordert ein gültiges Client-Zertifikat" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:460 libpq/auth.c:506 msgid "GSS encryption" msgstr "GSS-Verschlüsselung" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "SSL encryption" msgstr "SSL-Verschlüsselung" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:465 libpq/auth.c:511 msgid "no encryption" msgstr "keine Verschlüsselung" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:471 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf lehnt Replikationsverbindung ab für Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:478 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf lehnt Verbindung ab für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:508 +#: libpq/auth.c:516 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt überein." -#: libpq/auth.c:511 +#: libpq/auth.c:519 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung nicht geprüft." -#: libpq/auth.c:514 +#: libpq/auth.c:522 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt nicht überein." -#: libpq/auth.c:517 +#: libpq/auth.c:525 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Konnte Client-Hostnamen »%s« nicht in IP-Adresse übersetzen: %s." -#: libpq/auth.c:522 +#: libpq/auth.c:530 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Konnte Client-IP-Adresse nicht in einen Hostnamen auflösen: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:538 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Replikationsverbindung von Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:546 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:711 +#: libpq/auth.c:719 #, c-format msgid "expected password response, got message type %d" msgstr "Passwort-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:732 +#: libpq/auth.c:740 #, c-format msgid "invalid password packet size" msgstr "ungültige Größe des Passwortpakets" -#: libpq/auth.c:750 +#: libpq/auth.c:758 #, c-format msgid "empty password returned by client" msgstr "Client gab leeres Passwort zurück" -#: libpq/auth.c:877 libpq/hba.c:1727 +#: libpq/auth.c:885 libpq/hba.c:1727 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "MD5-Authentifizierung wird nicht unterstützt, wenn »db_user_namespace« angeschaltet ist" -#: libpq/auth.c:883 +#: libpq/auth.c:891 #, c-format msgid "could not generate random MD5 salt" msgstr "konnte zufälliges MD5-Salt nicht erzeugen" -#: libpq/auth.c:934 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:942 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "konnte Umgebung nicht setzen: %m" -#: libpq/auth.c:973 +#: libpq/auth.c:981 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1039 +#: libpq/auth.c:1047 msgid "accepting GSS security context failed" msgstr "Annahme des GSS-Sicherheitskontexts fehlgeschlagen" -#: libpq/auth.c:1080 +#: libpq/auth.c:1088 msgid "retrieving GSS user name failed" msgstr "Abfrage des GSS-Benutzernamens fehlgeschlagen" -#: libpq/auth.c:1226 +#: libpq/auth.c:1234 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: libpq/auth.c:1251 +#: libpq/auth.c:1259 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1329 +#: libpq/auth.c:1337 msgid "could not accept SSPI security context" msgstr "konnte SSPI-Sicherheitskontext nicht akzeptieren" -#: libpq/auth.c:1370 +#: libpq/auth.c:1378 msgid "could not get token from SSPI security context" msgstr "konnte kein Token vom SSPI-Sicherheitskontext erhalten" -#: libpq/auth.c:1506 libpq/auth.c:1525 +#: libpq/auth.c:1514 libpq/auth.c:1533 #, c-format msgid "could not translate name" msgstr "konnte Namen nicht umwandeln" -#: libpq/auth.c:1538 +#: libpq/auth.c:1546 #, c-format msgid "realm name too long" msgstr "Realm-Name zu lang" -#: libpq/auth.c:1553 +#: libpq/auth.c:1561 #, c-format msgid "translated account name too long" msgstr "umgewandelter Account-Name zu lang" -#: libpq/auth.c:1732 +#: libpq/auth.c:1740 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "konnte Socket für Ident-Verbindung nicht erzeugen: %m" -#: libpq/auth.c:1747 +#: libpq/auth.c:1755 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "konnte nicht mit lokaler Adresse »%s« verbinden: %m" -#: libpq/auth.c:1759 +#: libpq/auth.c:1767 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "konnte nicht mit Ident-Server auf Adresse »%s«, Port %s verbinden: %m" -#: libpq/auth.c:1781 +#: libpq/auth.c:1789 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "konnte Anfrage an Ident-Server auf Adresse »%s«, Port %s nicht senden: %m" -#: libpq/auth.c:1798 +#: libpq/auth.c:1806 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "konnte Antwort von Ident-Server auf Adresse »%s«, Port %s nicht empfangen: %m" -#: libpq/auth.c:1808 +#: libpq/auth.c:1816 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ungültig formatierte Antwort vom Ident-Server: »%s«" -#: libpq/auth.c:1861 +#: libpq/auth.c:1869 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Peer-Authentifizierung wird auf dieser Plattform nicht unterstützt" -#: libpq/auth.c:1865 +#: libpq/auth.c:1873 #, c-format msgid "could not get peer credentials: %m" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %m" -#: libpq/auth.c:1877 +#: libpq/auth.c:1885 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "konnte lokale Benutzer-ID %ld nicht nachschlagen: %s" -#: libpq/auth.c:1979 +#: libpq/auth.c:1987 #, c-format msgid "error from underlying PAM layer: %s" msgstr "Fehler von der unteren PAM-Ebene: %s" -#: libpq/auth.c:1990 +#: libpq/auth.c:1998 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "nicht unterstützte PAM-Conversation: %d/»%s«" -#: libpq/auth.c:2047 +#: libpq/auth.c:2055 #, c-format msgid "could not create PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht erzeugen: %s" -#: libpq/auth.c:2058 +#: libpq/auth.c:2066 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) fehlgeschlagen: %s" -#: libpq/auth.c:2090 +#: libpq/auth.c:2098 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) fehlgeschlagen: %s" -#: libpq/auth.c:2102 +#: libpq/auth.c:2110 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) fehlgeschlagen: %s" -#: libpq/auth.c:2115 +#: libpq/auth.c:2123 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate fehlgeschlagen: %s" -#: libpq/auth.c:2128 +#: libpq/auth.c:2136 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt fehlgeschlagen: %s" -#: libpq/auth.c:2139 +#: libpq/auth.c:2147 #, c-format msgid "could not release PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht freigeben: %s" -#: libpq/auth.c:2219 +#: libpq/auth.c:2227 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "konnte LDAP nicht initialisieren: Fehlercode %d" -#: libpq/auth.c:2256 +#: libpq/auth.c:2264 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "konnte keinen Domain-Namen aus ldapbasedn herauslesen" -#: libpq/auth.c:2264 +#: libpq/auth.c:2272 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP-Authentifizierung konnte keine DNS-SRV-Einträge für »%s« finden" -#: libpq/auth.c:2266 +#: libpq/auth.c:2274 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Geben Sie einen LDAP-Servernamen explizit an." -#: libpq/auth.c:2318 +#: libpq/auth.c:2326 #, c-format msgid "could not initialize LDAP: %s" msgstr "konnte LDAP nicht initialisieren: %s" -#: libpq/auth.c:2328 +#: libpq/auth.c:2336 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps wird mit dieser LDAP-Bibliothek nicht unterstützt" -#: libpq/auth.c:2336 +#: libpq/auth.c:2344 #, c-format msgid "could not initialize LDAP: %m" msgstr "konnte LDAP nicht initialisieren: %m" -#: libpq/auth.c:2346 +#: libpq/auth.c:2354 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "konnte LDAP-Protokollversion nicht setzen: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2370 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "konnte LDAP-TLS-Sitzung nicht starten: %s" -#: libpq/auth.c:2439 +#: libpq/auth.c:2447 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Server nicht angegeben, und kein ldapbasedn" -#: libpq/auth.c:2446 +#: libpq/auth.c:2454 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Server nicht angegeben" -#: libpq/auth.c:2508 +#: libpq/auth.c:2516 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ungültiges Zeichen im Benutzernamen für LDAP-Authentifizierung" -#: libpq/auth.c:2525 +#: libpq/auth.c:2533 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "erstes LDAP-Binden für ldapbinddn »%s« auf Server »%s« fehlgeschlagen: %s" -#: libpq/auth.c:2555 +#: libpq/auth.c:2563 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "konnte LDAP nicht mit Filter »%s« auf Server »%s« durchsuchen: %s" -#: libpq/auth.c:2571 +#: libpq/auth.c:2579 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-Benutzer »%s« existiert nicht" -#: libpq/auth.c:2572 +#: libpq/auth.c:2580 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-Suche nach Filter »%s« auf Server »%s« gab keine Einträge zurück." -#: libpq/auth.c:2576 +#: libpq/auth.c:2584 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-Benutzer »%s« ist nicht eindeutig" -#: libpq/auth.c:2577 +#: libpq/auth.c:2585 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Eintrag zurück." msgstr[1] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Einträge zurück." -#: libpq/auth.c:2597 +#: libpq/auth.c:2605 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "konnte DN fũr den ersten Treffer für »%s« auf Server »%s« nicht lesen: %s" -#: libpq/auth.c:2618 +#: libpq/auth.c:2626 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "Losbinden fehlgeschlagen nach Suche nach Benutzer »%s« auf Server »%s«" -#: libpq/auth.c:2649 +#: libpq/auth.c:2657 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "LDAP-Login fehlgeschlagen für Benutzer »%s« auf Server »%s«: %s" -#: libpq/auth.c:2681 +#: libpq/auth.c:2689 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-Diagnostik: %s" -#: libpq/auth.c:2719 +#: libpq/auth.c:2727 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: Client-Zertifikat enthält keinen Benutzernamen" -#: libpq/auth.c:2740 +#: libpq/auth.c:2748 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: konnte Subject-DN nicht abfragen" -#: libpq/auth.c:2763 +#: libpq/auth.c:2771 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: DN stimmt nicht überein" -#: libpq/auth.c:2768 +#: libpq/auth.c:2776 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: CN stimmt nicht überein" -#: libpq/auth.c:2870 +#: libpq/auth.c:2878 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Server nicht angegeben" -#: libpq/auth.c:2877 +#: libpq/auth.c:2885 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-Geheimnis nicht angegeben" -#: libpq/auth.c:2891 +#: libpq/auth.c:2899 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS-Authentifizierung unterstützt keine Passwörter länger als %d Zeichen" -#: libpq/auth.c:2993 libpq/hba.c:2369 +#: libpq/auth.c:3001 libpq/hba.c:2369 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "konnte RADIUS-Servername »%s« nicht in Adresse übersetzen: %s" -#: libpq/auth.c:3007 +#: libpq/auth.c:3015 #, c-format msgid "could not generate random encryption vector" msgstr "konnte zufälligen Verschlüsselungsvektor nicht erzeugen" -#: libpq/auth.c:3044 +#: libpq/auth.c:3052 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "konnte MD5-Verschlüsselung des Passworts nicht durchführen: %s" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not create RADIUS socket: %m" msgstr "konnte RADIUS-Socket nicht erstellen: %m" -#: libpq/auth.c:3087 +#: libpq/auth.c:3095 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "konnte lokales RADIUS-Socket nicht binden: %m" -#: libpq/auth.c:3097 +#: libpq/auth.c:3105 #, c-format msgid "could not send RADIUS packet: %m" msgstr "konnte RADIUS-Paket nicht senden: %m" -#: libpq/auth.c:3131 libpq/auth.c:3157 +#: libpq/auth.c:3139 libpq/auth.c:3165 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "Zeitüberschreitung beim Warten auf RADIUS-Antwort von %s" -#: libpq/auth.c:3150 +#: libpq/auth.c:3158 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "konnte Status des RADIUS-Sockets nicht prüfen: %m" -#: libpq/auth.c:3180 +#: libpq/auth.c:3188 #, c-format msgid "could not read RADIUS response: %m" msgstr "konnte RADIUS-Antwort nicht lesen: %m" -#: libpq/auth.c:3188 +#: libpq/auth.c:3196 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "RADIUS-Antwort von %s wurde von falschem Port gesendet: %d" -#: libpq/auth.c:3196 +#: libpq/auth.c:3204 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-Antwort von %s zu kurz: %d" -#: libpq/auth.c:3203 +#: libpq/auth.c:3211 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "RADIUS-Antwort von %s hat verfälschte Länge: %d (tatsächliche Länge %d)" -#: libpq/auth.c:3211 +#: libpq/auth.c:3219 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "RADIUS-Antwort von %s unterscheidet sich von Anfrage: %d (sollte %d sein)" -#: libpq/auth.c:3236 +#: libpq/auth.c:3244 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "konnte MD5-Verschlüsselung des empfangenen Pakets nicht durchführen: %s" -#: libpq/auth.c:3246 +#: libpq/auth.c:3254 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-Antwort von %s hat falsche MD5-Signatur" -#: libpq/auth.c:3264 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "RADIUS-Antwort von %s hat ungültigen Code (%d) für Benutzer »%s«" @@ -15209,44 +15226,39 @@ msgstr "private Schlüsseldatei »%s« erlaubt Zugriff von Gruppe oder Welt" msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der Datenbankbenutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist." -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Server versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "übergroßes GSSAPI-Paket vom Client gesendet (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPI-Unwrap-Fehler" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "eingehende GSSAPI-Nachricht verwendete keine Vertraulichkeit" -#: libpq/be-secure-gssapi.c:575 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "übergroßes GSSAPI-Paket vom Client gesendet (%zu > %d)" - -#: libpq/be-secure-gssapi.c:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "konnte GSSAPI-Sicherheitskontext nicht akzeptieren" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" @@ -16376,7 +16388,7 @@ msgstr "unbenanntes Portal mit Parametern: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN wird nur für Merge- oder Hash-Verbund-fähige Verbundbedingungen unterstützt" -#: optimizer/plan/createplan.c:7124 parser/parse_merge.c:187 +#: optimizer/plan/createplan.c:7126 parser/parse_merge.c:187 #: parser/parse_merge.c:194 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -19276,32 +19288,32 @@ msgstr "Autovacuum-Worker benötigte zu lange zum Starten; abgebrochen" msgid "could not fork autovacuum worker process: %m" msgstr "konnte Autovacuum-Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/autovacuum.c:2355 +#: postmaster/autovacuum.c:2370 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "Autovacuum: lösche verwaiste temporäre Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2591 +#: postmaster/autovacuum.c:2613 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2594 +#: postmaster/autovacuum.c:2616 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2788 +#: postmaster/autovacuum.c:2812 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3402 +#: postmaster/autovacuum.c:3439 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3403 +#: postmaster/autovacuum.c:3440 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." @@ -19363,24 +19375,24 @@ msgstr[1] "Mit den aktuellen Einstellungen können bis zu %d Background-Worker r msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_worker_processes«." -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:434 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "Checkpoints passieren zu oft (alle %d Sekunde)" msgstr[1] "Checkpoints passieren zu oft (alle %d Sekunden)" -#: postmaster/checkpointer.c:435 +#: postmaster/checkpointer.c:438 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_wal_size«." -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1065 #, c-format msgid "checkpoint request failed" msgstr "Checkpoint-Anforderung fehlgeschlagen" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1066 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Einzelheiten finden Sie in den letzten Meldungen im Serverlog." @@ -20271,17 +20283,17 @@ msgstr "Apply-Worker für logische Replikation wird die restlichen Änderungen d msgid "logical decoding on standby requires wal_level >= logical on the primary" msgstr "logische Dekodierung auf dem Standby-Server erfordert wal_level >= logical auf dem Primärserver" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:344 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "Arbeitsprozesse für logische Replikation können nicht gestartet werden, wenn max_replication_slots = 0" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:437 #, c-format msgid "out of logical replication worker slots" msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" -#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 +#: replication/logical/launcher.c:438 replication/logical/launcher.c:512 #: replication/slot.c:1297 storage/lmgr/lock.c:998 storage/lmgr/lock.c:1036 #: storage/lmgr/lock.c:2831 storage/lmgr/lock.c:4216 storage/lmgr/lock.c:4281 #: storage/lmgr/lock.c:4631 storage/lmgr/predicate.c:2418 @@ -20290,17 +20302,17 @@ msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" msgid "You might need to increase %s." msgstr "Sie müssen möglicherweise %s erhöhen." -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:511 #, c-format msgid "out of background worker slots" msgstr "alle Slots für Background-Worker belegt" -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:718 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "Arbeitsprozess-Slot %d für logische Replikation ist leer, kann nicht zugeteilt werden" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:727 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "Arbeitsprozess-Slot %d für logische Replikation wird schon von einem anderen Arbeitsprozess verwendet, kann nicht zugeteilt werden" @@ -20528,29 +20540,29 @@ msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:3941 +#: replication/logical/reorderbuffer.c:4070 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "konnte nicht in Datendatei für XID %u schreiben: %m" -#: replication/logical/reorderbuffer.c:4287 -#: replication/logical/reorderbuffer.c:4312 +#: replication/logical/reorderbuffer.c:4416 +#: replication/logical/reorderbuffer.c:4441 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %m" -#: replication/logical/reorderbuffer.c:4291 -#: replication/logical/reorderbuffer.c:4316 +#: replication/logical/reorderbuffer.c:4420 +#: replication/logical/reorderbuffer.c:4445 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %d statt %u Bytes gelesen" -#: replication/logical/reorderbuffer.c:4566 +#: replication/logical/reorderbuffer.c:4695 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "konnte Datei »%s« nicht löschen, bei Löschen von pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5062 +#: replication/logical/reorderbuffer.c:5191 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "konnte nicht aus Datei »%s« lesen: %d statt %d Bytes gelesen" @@ -20567,58 +20579,58 @@ msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs msgstr[0] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-ID" msgstr[1] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-IDs" -#: replication/logical/snapbuild.c:1431 replication/logical/snapbuild.c:1528 -#: replication/logical/snapbuild.c:2044 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1536 +#: replication/logical/snapbuild.c:2052 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisches Dekodieren fand konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1433 +#: replication/logical/snapbuild.c:1441 #, c-format msgid "There are no running transactions." msgstr "Keine laufenden Transaktionen." -#: replication/logical/snapbuild.c:1480 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisches Dekodieren fand initialen Startpunkt bei %X/%X" -#: replication/logical/snapbuild.c:1482 replication/logical/snapbuild.c:1506 +#: replication/logical/snapbuild.c:1490 replication/logical/snapbuild.c:1514 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Warten auf Abschluss der Transaktionen (ungefähr %d), die älter als %u sind." -#: replication/logical/snapbuild.c:1504 +#: replication/logical/snapbuild.c:1512 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisches Dekodieren fand initialen konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1530 +#: replication/logical/snapbuild.c:1538 #, c-format msgid "There are no old transactions anymore." msgstr "Es laufen keine alten Transaktionen mehr." -#: replication/logical/snapbuild.c:1931 +#: replication/logical/snapbuild.c:1939 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "Scanbuild-State-Datei »%s« hat falsche magische Zahl %u statt %u" -#: replication/logical/snapbuild.c:1937 +#: replication/logical/snapbuild.c:1945 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "Snapbuild-State-Datei »%s« hat nicht unterstützte Version: %u statt %u" -#: replication/logical/snapbuild.c:1978 +#: replication/logical/snapbuild.c:1986 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Snapbuild-State-Datei »%s«: ist %u, sollte %u sein" -#: replication/logical/snapbuild.c:2046 +#: replication/logical/snapbuild.c:2054 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logische Dekodierung beginnt mit gespeichertem Snapshot." -#: replication/logical/snapbuild.c:2153 +#: replication/logical/snapbuild.c:2161 #, c-format msgid "could not parse file name \"%s\"" msgstr "konnte Dateinamen »%s« nicht parsen" @@ -20628,52 +20640,52 @@ msgstr "konnte Dateinamen »%s« nicht parsen" msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat abgeschlossen" -#: replication/logical/tablesync.c:639 +#: replication/logical/tablesync.c:665 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten, damit two_phase eingeschaltet werden kann" -#: replication/logical/tablesync.c:814 replication/logical/tablesync.c:956 +#: replication/logical/tablesync.c:840 replication/logical/tablesync.c:982 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "konnte Tabelleninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:821 +#: replication/logical/tablesync.c:847 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Tabelle »%s.%s« nicht auf dem Publikationsserver gefunden" -#: replication/logical/tablesync.c:879 +#: replication/logical/tablesync.c:905 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "konnte Spaltenlisteninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:1058 +#: replication/logical/tablesync.c:1084 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "konnte WHERE-Klausel-Informationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:1217 +#: replication/logical/tablesync.c:1243 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "konnte Kopieren des Anfangsinhalts für Tabelle »%s.%s« nicht starten: %s" -#: replication/logical/tablesync.c:1418 +#: replication/logical/tablesync.c:1444 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht gestartet werden: %s" -#: replication/logical/tablesync.c:1460 +#: replication/logical/tablesync.c:1486 #, c-format msgid "replication origin \"%s\" already exists" msgstr "Replication-Origin »%s« existiert bereits" -#: replication/logical/tablesync.c:1493 replication/logical/worker.c:2376 +#: replication/logical/tablesync.c:1519 replication/logical/worker.c:2376 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "Benutzer »%s« kann nicht in eine Relation mit Sicherheit auf Zeilenebene replizieren: »%s«" -#: replication/logical/tablesync.c:1506 +#: replication/logical/tablesync.c:1532 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht beenden werden: %s" @@ -20763,62 +20775,62 @@ msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gest msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/logical/worker.c:4791 +#: replication/logical/worker.c:4807 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" -#: replication/logical/worker.c:4839 +#: replication/logical/worker.c:4855 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "logische Replikation beginnt Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:4853 +#: replication/logical/worker.c:4869 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "logische Replikation beendet Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:4935 +#: replication/logical/worker.c:4957 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "Skip-LSN von Subskription »%s« gelöscht" -#: replication/logical/worker.c:4936 +#: replication/logical/worker.c:4958 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "Die WAL-Endposition (LSN) %X/%X der Remote-Transaktion stimmte nicht mit der Skip-LSN %X/%X überein." -#: replication/logical/worker.c:4962 +#: replication/logical/worker.c:4986 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s«" -#: replication/logical/worker.c:4966 +#: replication/logical/worker.c:4990 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u" -#: replication/logical/worker.c:4971 +#: replication/logical/worker.c:4995 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:4982 +#: replication/logical/worker.c:5006 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u" -#: replication/logical/worker.c:4989 +#: replication/logical/worker.c:5013 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:5000 +#: replication/logical/worker.c:5024 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u" -#: replication/logical/worker.c:5008 +#: replication/logical/worker.c:5032 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u, beendet bei %X/%X" @@ -21328,7 +21340,7 @@ msgstr "ungültiger Standby-Message-Typ »%c«" msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2453 +#: replication/walsender.c:2457 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "WAL-Sender-Prozess wird abgebrochen wegen Zeitüberschreitung bei der Replikation" @@ -21971,133 +21983,133 @@ msgstr "konnte Fileset »%s« nicht löschen: %m" msgid "could not truncate file \"%s\": %m" msgstr "kann Datei »%s« nicht kürzen: %m" -#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 +#: storage/file/fd.c:534 storage/file/fd.c:606 storage/file/fd.c:642 #, c-format msgid "could not flush dirty data: %m" msgstr "konnte schmutzige Daten nicht flushen: %m" -#: storage/file/fd.c:567 +#: storage/file/fd.c:564 #, c-format msgid "could not determine dirty data size: %m" msgstr "konnte Größe der schmutzigen Daten nicht bestimmen: %m" -#: storage/file/fd.c:619 +#: storage/file/fd.c:616 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "munmap() fehlgeschlagen beim Flushen von Daten: %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:934 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fehlgeschlagen: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1024 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "nicht genug Dateideskriptoren verfügbar, um Serverprozess zu starten" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1025 #, c-format msgid "System allows %d, server needs at least %d." msgstr "System erlaubt %d, Server benötigt mindestens %d." -#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 -#: storage/file/fd.c:2825 +#: storage/file/fd.c:1113 storage/file/fd.c:2562 storage/file/fd.c:2671 +#: storage/file/fd.c:2822 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "keine Dateideskriptoren mehr: %m; freigeben und nochmal versuchen" -#: storage/file/fd.c:1490 +#: storage/file/fd.c:1487 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporäre Datei: Pfad »%s«, Größe %lu" -#: storage/file/fd.c:1629 +#: storage/file/fd.c:1626 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "konnte temporäres Verzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1636 +#: storage/file/fd.c:1633 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "konnte temporäres Unterverzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1833 +#: storage/file/fd.c:1830 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1869 +#: storage/file/fd.c:1866 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: storage/file/fd.c:1910 +#: storage/file/fd.c:1907 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:1998 +#: storage/file/fd.c:1995 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:2185 +#: storage/file/fd.c:2182 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "Größe der temporären Datei überschreitet temp_file_limit (%dkB)" -#: storage/file/fd.c:2541 storage/file/fd.c:2600 +#: storage/file/fd.c:2538 storage/file/fd.c:2597 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, die Datei »%s« zu öffnen" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2642 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, den Befehl »%s« auszuführen" -#: storage/file/fd.c:2801 +#: storage/file/fd.c:2798 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, das Verzeichnis »%s« zu öffnen" -#: storage/file/fd.c:3331 +#: storage/file/fd.c:3328 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "unerwartete Datei im Verzeichnis für temporäre Dateien gefunden: »%s«" -#: storage/file/fd.c:3449 +#: storage/file/fd.c:3446 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (syncfs), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3463 +#: storage/file/fd.c:3460 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" -#: storage/file/fd.c:3676 +#: storage/file/fd.c:3673 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (pre-fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3708 +#: storage/file/fd.c:3705 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3897 +#: storage/file/fd.c:3894 #, c-format msgid "debug_io_direct is not supported on this platform." msgstr "debug_io_direct wird auf dieser Plattform nicht unterstützt." -#: storage/file/fd.c:3944 +#: storage/file/fd.c:3941 #, c-format msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" msgstr "debug_io_direct wird für WAL nicht unterstützt, weil XLOG_BLCKSZ zu klein ist" -#: storage/file/fd.c:3951 +#: storage/file/fd.c:3948 #, c-format msgid "debug_io_direct is not supported for data because BLCKSZ is too small" msgstr "debug_io_direct wird für Daten nicht unterstützt, weil BLCKSZ zu klein ist" @@ -22409,107 +22421,107 @@ msgstr "Verklemmung (Deadlock) entdeckt" msgid "See server log for query details." msgstr "Einzelheiten zur Anfrage finden Sie im Serverlog." -#: storage/lmgr/lmgr.c:853 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "beim Aktualisieren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:856 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "beim Löschen von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "beim Sperren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "beim Sperren von aktualisierter Version (%u,%u) von Tupel in Relation »%s«" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "beim Einfügen von Indextupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen der Eindeutigkeit von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "beim erneuten Prüfen des aktualisierten Tupels (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen eines Exclusion-Constraints für Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1212 #, c-format msgid "relation %u of database %u" msgstr "Relation %u der Datenbank %u" -#: storage/lmgr/lmgr.c:1212 +#: storage/lmgr/lmgr.c:1218 #, c-format msgid "extension of relation %u of database %u" msgstr "Erweiterung von Relation %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1218 +#: storage/lmgr/lmgr.c:1224 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid der Datenbank %u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1229 #, c-format msgid "page %u of relation %u of database %u" msgstr "Seite %u von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1230 +#: storage/lmgr/lmgr.c:1236 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "Tupel (%u, %u) von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1244 #, c-format msgid "transaction %u" msgstr "Transaktion %u" -#: storage/lmgr/lmgr.c:1243 +#: storage/lmgr/lmgr.c:1249 #, c-format msgid "virtual transaction %d/%u" msgstr "virtuelle Transaktion %d/%u" -#: storage/lmgr/lmgr.c:1249 +#: storage/lmgr/lmgr.c:1255 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulatives Token %u von Transaktion %u" -#: storage/lmgr/lmgr.c:1255 +#: storage/lmgr/lmgr.c:1261 #, c-format msgid "object %u of class %u of database %u" msgstr "Objekt %u von Klasse %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, c-format msgid "user lock [%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1270 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1278 +#: storage/lmgr/lmgr.c:1284 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "Remote-Transaktion %u von Subskription %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1285 +#: storage/lmgr/lmgr.c:1291 #, c-format msgid "unrecognized locktag type %d" msgstr "unbekannter Locktag-Typ %d" @@ -23070,12 +23082,12 @@ msgstr "Verbindungsende: Sitzungszeit: %d:%02d:%02d.%03d Benutzer=%s Datenbank=% msgid "bind message has %d result formats but query has %d columns" msgstr "Bind-Message hat %d Ergebnisspalten, aber Anfrage hat %d Spalten" -#: tcop/pquery.c:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "Cursor kann nur vorwärts scannen" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarieren Sie ihn mit der Option SCROLL, um rückwarts scannen zu können." @@ -23415,102 +23427,102 @@ msgstr "Funktionsaufruf einer gelöschten Funktion" msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "bestehende Statistiken für Art %s, db=%u, oid=%u werden zurückgesetzt" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/adt/acl.c:194 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "Bezeichner zu lang" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:195 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Bezeichner muss weniger als %d Zeichen haben." -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:283 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "unbekanntes Schlüsselwort: »%s«" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:284 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-Schlüsselwort muss »group« oder »user« sein." -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:292 #, c-format msgid "missing name" msgstr "Name fehlt" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:293 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Auf das Schlüsselwort »group« oder »user« muss ein Name folgen." -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, c-format msgid "missing \"=\" sign" msgstr "»=«-Zeichen fehlt" -#: utils/adt/acl.c:341 +#: utils/adt/acl.c:358 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ungültiges Moduszeichen: muss eines aus »%s« sein" -#: utils/adt/acl.c:371 +#: utils/adt/acl.c:388 #, c-format msgid "a name must follow the \"/\" sign" msgstr "auf das »/«-Zeichen muss ein Name folgen" -#: utils/adt/acl.c:383 +#: utils/adt/acl.c:400 #, c-format msgid "defaulting grantor to user ID %u" msgstr "nicht angegebener Grantor wird auf user ID %u gesetzt" -#: utils/adt/acl.c:569 +#: utils/adt/acl.c:586 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-Array enthält falschen Datentyp" -#: utils/adt/acl.c:573 +#: utils/adt/acl.c:590 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-Arrays müssen eindimensional sein" -#: utils/adt/acl.c:577 +#: utils/adt/acl.c:594 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-Array darf keine NULL-Werte enthalten" -#: utils/adt/acl.c:606 +#: utils/adt/acl.c:623 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "überflüssiger Müll am Ende der ACL-Angabe" -#: utils/adt/acl.c:1248 +#: utils/adt/acl.c:1265 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "Grant-Optionen können nicht an den eigenen Grantor gegeben werden" -#: utils/adt/acl.c:1564 +#: utils/adt/acl.c:1581 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert wird nicht mehr unterstützt" -#: utils/adt/acl.c:1574 +#: utils/adt/acl.c:1591 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove wird nicht mehr unterstützt" -#: utils/adt/acl.c:1693 +#: utils/adt/acl.c:1710 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "unbekannter Privilegtyp: »%s«" -#: utils/adt/acl.c:3476 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3493 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "Funktion »%s« existiert nicht" -#: utils/adt/acl.c:5023 +#: utils/adt/acl.c:5040 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "Berechtigung nur für Rollen, die SET ROLE \"%s\" ausführen können" @@ -23536,7 +23548,7 @@ msgstr "Eingabedatentyp ist kein Array" #: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 #: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 #: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 -#: utils/adt/int8.c:1272 utils/adt/numeric.c:1916 utils/adt/numeric.c:4403 +#: utils/adt/int8.c:1272 utils/adt/numeric.c:1917 utils/adt/numeric.c:4404 #: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 #: utils/adt/varlena.c:3134 @@ -23885,8 +23897,8 @@ msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 #: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 -#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7151 -#: utils/adt/numeric.c:7354 utils/adt/numeric.c:8301 utils/adt/numutils.c:357 +#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7152 +#: utils/adt/numeric.c:7355 utils/adt/numeric.c:8302 utils/adt/numutils.c:357 #: utils/adt/numutils.c:619 utils/adt/numutils.c:881 utils/adt/numutils.c:920 #: utils/adt/numutils.c:942 utils/adt/numutils.c:1006 utils/adt/numutils.c:1028 #: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 @@ -23907,10 +23919,10 @@ msgstr "money ist außerhalb des gültigen Bereichs" #: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 #: utils/adt/int8.c:515 utils/adt/int8.c:573 utils/adt/int8.c:958 #: utils/adt/int8.c:1038 utils/adt/int8.c:1100 utils/adt/int8.c:1180 -#: utils/adt/numeric.c:3190 utils/adt/numeric.c:3213 utils/adt/numeric.c:3298 -#: utils/adt/numeric.c:3316 utils/adt/numeric.c:3412 utils/adt/numeric.c:8850 -#: utils/adt/numeric.c:9163 utils/adt/numeric.c:9511 utils/adt/numeric.c:9627 -#: utils/adt/numeric.c:11138 utils/adt/timestamp.c:3442 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8851 +#: utils/adt/numeric.c:9164 utils/adt/numeric.c:9512 utils/adt/numeric.c:9628 +#: utils/adt/numeric.c:11139 utils/adt/timestamp.c:3442 #, c-format msgid "division by zero" msgstr "Division durch Null" @@ -23957,7 +23969,7 @@ msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%s«" #: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 -#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2533 +#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2535 #, c-format msgid "date out of range" msgstr "date ist außerhalb des gültigen Bereichs" @@ -24028,8 +24040,8 @@ msgstr "Einheit »%s« nicht erkannt für Typ %s" #: utils/adt/timestamp.c:5609 utils/adt/timestamp.c:5696 #: utils/adt/timestamp.c:5737 utils/adt/timestamp.c:5741 #: utils/adt/timestamp.c:5795 utils/adt/timestamp.c:5799 -#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2555 -#: utils/adt/xml.c:2562 utils/adt/xml.c:2582 utils/adt/xml.c:2589 +#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2557 +#: utils/adt/xml.c:2564 utils/adt/xml.c:2584 utils/adt/xml.c:2591 #, c-format msgid "timestamp out of range" msgstr "timestamp ist außerhalb des gültigen Bereichs" @@ -24046,7 +24058,7 @@ msgstr "Zeit-Feldwert ist außerhalb des gültigen Bereichs: %d:%02d:%02g" #: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 #: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 -#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2594 +#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2595 #: utils/adt/timestamp.c:3513 utils/adt/timestamp.c:3540 #: utils/adt/timestamp.c:3571 #, c-format @@ -24219,34 +24231,34 @@ msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ double precision" #: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 #: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 #: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 -#: utils/adt/int8.c:1293 utils/adt/numeric.c:4515 utils/adt/numeric.c:4520 +#: utils/adt/int8.c:1293 utils/adt/numeric.c:4516 utils/adt/numeric.c:4521 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1453 utils/adt/numeric.c:3708 utils/adt/numeric.c:10042 +#: utils/adt/float.c:1453 utils/adt/numeric.c:3709 utils/adt/numeric.c:10043 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1521 utils/adt/numeric.c:3996 utils/adt/numeric.c:4108 +#: utils/adt/float.c:1521 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1525 utils/adt/numeric.c:4000 utils/adt/numeric.c:10933 +#: utils/adt/float.c:1525 utils/adt/numeric.c:4001 utils/adt/numeric.c:10934 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "eine negative Zahl hoch eine nicht ganze Zahl ergibt ein komplexes Ergebnis" -#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3908 -#: utils/adt/numeric.c:10713 +#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10714 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3846 -#: utils/adt/numeric.c:3903 utils/adt/numeric.c:10717 +#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10718 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" @@ -24265,22 +24277,22 @@ msgstr "Eingabe ist außerhalb des gültigen Bereichs" msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "setseed-Parameter %g ist außerhalb des gültigen Bereichs [-1;-1]" -#: utils/adt/float.c:4095 utils/adt/numeric.c:1856 +#: utils/adt/float.c:4095 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4100 utils/adt/numeric.c:1867 +#: utils/adt/float.c:4100 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "Operand, Untergrenze und Obergrenze dürfen nicht NaN sein" -#: utils/adt/float.c:4106 utils/adt/numeric.c:1872 +#: utils/adt/float.c:4106 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4172 utils/adt/numeric.c:1886 +#: utils/adt/float.c:4172 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" @@ -24650,7 +24662,7 @@ msgstr "Schrittgröße kann nicht gleich null sein" #: utils/adt/int8.c:1010 utils/adt/int8.c:1024 utils/adt/int8.c:1057 #: utils/adt/int8.c:1071 utils/adt/int8.c:1085 utils/adt/int8.c:1116 #: utils/adt/int8.c:1138 utils/adt/int8.c:1152 utils/adt/int8.c:1166 -#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4474 +#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4475 #: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 #: utils/adt/varbit.c:1676 #, c-format @@ -24704,7 +24716,7 @@ msgstr "Array muss zwei Spalten haben" msgid "mismatched array dimensions" msgstr "Array-Dimensionen passen nicht" -#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1958 +#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1964 #, c-format msgid "duplicate JSON object key value" msgstr "doppelter JSON-Objekt-Schlüsselwert" @@ -24769,23 +24781,23 @@ msgstr "kann jsonb-Objekt nicht in Typ %s umwandeln" msgid "cannot cast jsonb array or object to type %s" msgstr "kann jsonb-Array oder -Objekt nicht in Typ %s umwandeln" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:755 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Objekte-Paare überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:796 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Arrayelemente überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1679 utils/adt/jsonb_util.c:1699 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "Gesamtgröße der jsonb-Array-Elemente überschreitet die maximale Größe von %d Bytes" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1760 utils/adt/jsonb_util.c:1795 +#: utils/adt/jsonb_util.c:1815 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "Gesamtgröße der jsonb-Objektelemente überschreitet die maximale Größe von %d Bytes" @@ -25193,12 +25205,12 @@ msgstr "nichtdeterministische Sortierfolgen werden von ILIKE nicht unterstützt" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-Muster darf nicht mit Escape-Zeichen enden" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "ungültige ESCAPE-Zeichenkette" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "ESCAPE-Zeichenkette muss null oder ein Zeichen lang sein." @@ -25409,10 +25421,10 @@ msgstr "Ergebnis ist außerhalb des gültigen Bereichs" msgid "cannot subtract inet values of different sizes" msgstr "Subtraktion von »inet«-Werten unterschiedlicher Größe nicht möglich" -#: utils/adt/numeric.c:792 utils/adt/numeric.c:3658 utils/adt/numeric.c:7146 -#: utils/adt/numeric.c:7349 utils/adt/numeric.c:7821 utils/adt/numeric.c:10516 -#: utils/adt/numeric.c:10991 utils/adt/numeric.c:11085 -#: utils/adt/numeric.c:11220 +#: utils/adt/numeric.c:792 utils/adt/numeric.c:3659 utils/adt/numeric.c:7147 +#: utils/adt/numeric.c:7350 utils/adt/numeric.c:7822 utils/adt/numeric.c:10517 +#: utils/adt/numeric.c:10992 utils/adt/numeric.c:11086 +#: utils/adt/numeric.c:11221 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" @@ -25477,39 +25489,39 @@ msgstr "Schrittgröße kann nicht NaN sein" msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3648 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:4381 utils/adt/numeric.c:4461 utils/adt/numeric.c:4502 -#: utils/adt/numeric.c:4698 +#: utils/adt/numeric.c:4382 utils/adt/numeric.c:4462 utils/adt/numeric.c:4503 +#: utils/adt/numeric.c:4699 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4385 utils/adt/numeric.c:4465 utils/adt/numeric.c:4506 -#: utils/adt/numeric.c:4702 +#: utils/adt/numeric.c:4386 utils/adt/numeric.c:4466 utils/adt/numeric.c:4507 +#: utils/adt/numeric.c:4703 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4711 +#: utils/adt/numeric.c:4712 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7911 utils/adt/numeric.c:7962 +#: utils/adt/numeric.c:7912 utils/adt/numeric.c:7963 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7912 +#: utils/adt/numeric.c:7913 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ein Feld mit Präzision %d, Skala %d muss beim Runden einen Betrag von weniger als %s%d ergeben." -#: utils/adt/numeric.c:7963 +#: utils/adt/numeric.c:7964 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Ein Feld mit Präzision %d, Skala %d kann keinen unendlichen Wert enthalten." @@ -25807,7 +25819,7 @@ msgstr "Zu viele Kommas." msgid "Junk after right parenthesis or bracket." msgstr "Müll nach rechter runder oder eckiger Klammer." -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:2023 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "regulärer Ausdruck fehlgeschlagen: %s" @@ -25822,33 +25834,33 @@ msgstr "ungültige Option für regulären Ausdruck: »%.*s«" msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Wenn Sie regexp_replace() mit einem Startparameter verwenden wollten, wandeln Sie das vierte Argument explizit in integer um." -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 -#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 -#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 -#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1109 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1182 utils/adt/regexp.c:1191 +#: utils/adt/regexp.c:1200 utils/adt/regexp.c:1880 utils/adt/regexp.c:1889 +#: utils/adt/regexp.c:1898 utils/misc/guc.c:6674 utils/misc/guc.c:6708 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ungültiger Wert für Parameter »%s«: %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:940 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQL regulärer Ausdruck darf nicht mehr als zwei Escape-Double-Quote-Separatoren enthalten" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 -#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 -#: utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1120 utils/adt/regexp.c:1211 utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1337 utils/adt/regexp.c:1725 utils/adt/regexp.c:1780 +#: utils/adt/regexp.c:1909 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s unterstützt die »Global«-Option nicht" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1339 #, c-format msgid "Use the regexp_matches function instead." msgstr "Verwenden Sie stattdessen die Funktion regexp_matches." -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1527 #, c-format msgid "too many regular expression matches" msgstr "zu viele Treffer für regulären Ausdruck" @@ -25863,8 +25875,8 @@ msgstr "es gibt mehrere Funktionen namens »%s«" msgid "more than one operator named %s" msgstr "es gibt mehrere Operatoren namens %s" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10110 -#: utils/adt/ruleutils.c:10323 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10120 +#: utils/adt/ruleutils.c:10333 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -26549,136 +26561,136 @@ msgstr "ungültiger XML-Kommentar" msgid "not an XML document" msgstr "kein XML-Dokument" -#: utils/adt/xml.c:987 utils/adt/xml.c:1010 +#: utils/adt/xml.c:999 utils/adt/xml.c:1022 #, c-format msgid "invalid XML processing instruction" msgstr "ungültige XML-Verarbeitungsanweisung" -#: utils/adt/xml.c:988 +#: utils/adt/xml.c:1000 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "Die Zielangabe der XML-Verarbeitungsanweisung darf nicht »%s« sein." -#: utils/adt/xml.c:1011 +#: utils/adt/xml.c:1023 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-Verarbeitungsanweisung darf nicht »?>« enthalten." -#: utils/adt/xml.c:1090 +#: utils/adt/xml.c:1102 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate ist nicht implementiert" -#: utils/adt/xml.c:1146 +#: utils/adt/xml.c:1158 #, c-format msgid "could not initialize XML library" msgstr "konnte XML-Bibliothek nicht initialisieren" -#: utils/adt/xml.c:1147 +#: utils/adt/xml.c:1159 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 hat inkompatiblen char-Typ: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1233 +#: utils/adt/xml.c:1245 #, c-format msgid "could not set up XML error handler" msgstr "konnte XML-Fehlerbehandlung nicht einrichten" -#: utils/adt/xml.c:1234 +#: utils/adt/xml.c:1246 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Das deutet wahrscheinlich darauf hin, dass die verwendete Version von libxml2 nicht mit den Header-Dateien der Version, mit der PostgreSQL gebaut wurde, kompatibel ist." -#: utils/adt/xml.c:2262 +#: utils/adt/xml.c:2264 msgid "Invalid character value." msgstr "Ungültiger Zeichenwert." -#: utils/adt/xml.c:2265 +#: utils/adt/xml.c:2267 msgid "Space required." msgstr "Leerzeichen benötigt." -#: utils/adt/xml.c:2268 +#: utils/adt/xml.c:2270 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone akzeptiert nur »yes« oder »no«." -#: utils/adt/xml.c:2271 +#: utils/adt/xml.c:2273 msgid "Malformed declaration: missing version." msgstr "Fehlerhafte Deklaration: Version fehlt." -#: utils/adt/xml.c:2274 +#: utils/adt/xml.c:2276 msgid "Missing encoding in text declaration." msgstr "Fehlende Kodierung in Textdeklaration." -#: utils/adt/xml.c:2277 +#: utils/adt/xml.c:2279 msgid "Parsing XML declaration: '?>' expected." msgstr "Beim Parsen der XML-Deklaration: »?>« erwartet." -#: utils/adt/xml.c:2280 +#: utils/adt/xml.c:2282 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Unbekannter Libxml-Fehlercode: %d." -#: utils/adt/xml.c:2534 +#: utils/adt/xml.c:2536 #, c-format msgid "XML does not support infinite date values." msgstr "XML unterstützt keine unendlichen Datumswerte." -#: utils/adt/xml.c:2556 utils/adt/xml.c:2583 +#: utils/adt/xml.c:2558 utils/adt/xml.c:2585 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML unterstützt keine unendlichen timestamp-Werte." -#: utils/adt/xml.c:2999 +#: utils/adt/xml.c:3001 #, c-format msgid "invalid query" msgstr "ungültige Anfrage" -#: utils/adt/xml.c:3091 +#: utils/adt/xml.c:3093 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "Portal »%s« gibt keine Tupel zurück" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4345 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4344 +#: utils/adt/xml.c:4346 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Das Array muss zweidimensional sein und die Länge der zweiten Achse muss gleich 2 sein." -#: utils/adt/xml.c:4368 +#: utils/adt/xml.c:4370 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4420 +#: utils/adt/xml.c:4422 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4427 +#: utils/adt/xml.c:4429 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "konnte XML-Namensraum mit Namen »%s« und URI »%s« nicht registrieren" -#: utils/adt/xml.c:4776 +#: utils/adt/xml.c:4778 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4805 +#: utils/adt/xml.c:4807 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4839 +#: utils/adt/xml.c:4841 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4986 +#: utils/adt/xml.c:4988 #, c-format msgid "more than one value returned by column XPath expression" msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" @@ -27423,7 +27435,7 @@ msgstr "bind_textdomain_codeset fehlgeschlagen" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ungültige Byte-Sequenz für Kodierung »%s«: %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1766 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "Zeichen mit Byte-Folge %s in Kodierung »%s« hat keine Entsprechung in Kodierung »%s«" @@ -27588,7 +27600,7 @@ msgid "parameter \"%s\" cannot be changed now" msgstr "Parameter »%s« kann jetzt nicht geändert werden" #: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 -#: utils/misc/guc.c:6604 +#: utils/misc/guc.c:6610 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" @@ -27668,7 +27680,7 @@ msgstr "Parameter »%s« kann nicht gesetzt werden" msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:6736 +#: utils/misc/guc.c:6742 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index 7205ddad9cc..5807122142c 100644 --- a/src/backend/po/ja.po +++ b/src/backend/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL 16)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-04 09:44+0900\n" -"PO-Revision-Date: 2025-04-04 11:05+0900\n" +"POT-Creation-Date: 2025-06-05 15:49+0900\n" +"PO-Revision-Date: 2025-06-05 16:00+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -83,18 +83,18 @@ msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み込み用にオープンできませんでした: %m" #: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1347 access/transam/xlog.c:3196 access/transam/xlog.c:3999 access/transam/xlogrecovery.c:1225 access/transam/xlogrecovery.c:1317 access/transam/xlogrecovery.c:1354 access/transam/xlogrecovery.c:1414 backup/basebackup.c:1846 commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5055 replication/logical/snapbuild.c:2040 replication/slot.c:1980 replication/slot.c:2021 replication/walsender.c:643 storage/file/buffile.c:470 storage/file/copydir.c:185 utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:830 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5055 replication/logical/snapbuild.c:2079 replication/slot.c:1980 replication/slot.c:2021 replication/walsender.c:646 storage/file/buffile.c:470 storage/file/copydir.c:185 utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:830 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み込みに失敗しました: %m" -#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 access/transam/xlog.c:3201 access/transam/xlog.c:4004 backup/basebackup.c:1850 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2045 replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:648 utils/cache/relmapper.c:834 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 access/transam/xlog.c:3201 access/transam/xlog.c:4004 backup/basebackup.c:1850 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2084 replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:651 utils/cache/relmapper.c:834 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" #: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 ../common/controldata_utils.c:263 ../common/controldata_utils.c:266 access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1359 access/transam/twophase.c:1778 access/transam/xlog.c:3042 access/transam/xlog.c:3236 access/transam/xlog.c:3241 access/transam/xlog.c:3377 -#: access/transam/xlog.c:3969 access/transam/xlog.c:4888 commands/copyfrom.c:1747 commands/copyto.c:332 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5107 replication/logical/snapbuild.c:1807 replication/logical/snapbuild.c:1931 replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:658 storage/file/copydir.c:208 storage/file/copydir.c:213 +#: access/transam/xlog.c:3969 access/transam/xlog.c:4888 commands/copyfrom.c:1747 commands/copyto.c:332 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5107 replication/logical/snapbuild.c:1846 replication/logical/snapbuild.c:1970 replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:661 storage/file/copydir.c:208 storage/file/copydir.c:213 #: storage/file/fd.c:782 storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:842 utils/cache/relmapper.c:957 #, c-format msgid "could not close file \"%s\": %m" @@ -118,8 +118,8 @@ msgstr "" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" #: ../common/controldata_utils.c:211 ../common/controldata_utils.c:216 ../common/file_utils.c:228 ../common/file_utils.c:287 ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1303 access/transam/xlog.c:2949 access/transam/xlog.c:3112 access/transam/xlog.c:3151 access/transam/xlog.c:3344 access/transam/xlog.c:3989 -#: access/transam/xlogrecovery.c:4214 access/transam/xlogrecovery.c:4317 access/transam/xlogutils.c:838 backup/basebackup.c:538 backup/basebackup.c:1516 libpq/hba.c:629 postmaster/syslogger.c:1560 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3711 replication/logical/reorderbuffer.c:4262 replication/logical/reorderbuffer.c:5035 replication/logical/snapbuild.c:1762 replication/logical/snapbuild.c:1872 replication/slot.c:1952 -#: replication/walsender.c:616 replication/walsender.c:2731 storage/file/copydir.c:151 storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:819 utils/cache/relmapper.c:936 utils/error/elog.c:2119 utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 utils/init/miscinit.c:1792 utils/misc/guc.c:4656 utils/misc/guc.c:4706 +#: access/transam/xlogrecovery.c:4214 access/transam/xlogrecovery.c:4317 access/transam/xlogutils.c:838 backup/basebackup.c:538 backup/basebackup.c:1516 libpq/hba.c:629 postmaster/syslogger.c:1560 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3711 replication/logical/reorderbuffer.c:4262 replication/logical/reorderbuffer.c:5035 replication/logical/snapbuild.c:1801 replication/logical/snapbuild.c:1911 replication/slot.c:1952 +#: replication/walsender.c:619 replication/walsender.c:2760 storage/file/copydir.c:151 storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:819 utils/cache/relmapper.c:936 utils/error/elog.c:2119 utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 utils/init/miscinit.c:1792 utils/misc/guc.c:4656 utils/misc/guc.c:4706 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" @@ -130,16 +130,16 @@ msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" #: ../common/controldata_utils.c:249 ../common/controldata_utils.c:254 ../common/file_utils.c:299 ../common/file_utils.c:369 access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1772 access/transam/xlog.c:3035 access/transam/xlog.c:3230 access/transam/xlog.c:3962 access/transam/xlog.c:8181 access/transam/xlog.c:8226 -#: backup/basebackup_server.c:209 commands/dbcommands.c:515 replication/logical/snapbuild.c:1800 replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:774 storage/file/fd.c:3798 storage/smgr/md.c:1137 storage/smgr/md.c:1182 storage/sync/sync.c:451 utils/misc/guc.c:4426 +#: backup/basebackup_server.c:209 commands/dbcommands.c:515 replication/logical/snapbuild.c:1839 replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:774 storage/file/fd.c:3798 storage/smgr/md.c:1137 storage/smgr/md.c:1182 storage/sync/sync.c:451 utils/misc/guc.c:4426 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" #: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 ../common/md5_common.c:155 ../common/psprintf.c:143 ../common/scram-common.c:268 ../common/stringinfo.c:305 ../port/path.c:828 ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1412 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:524 postmaster/bgworker.c:352 postmaster/bgworker.c:934 postmaster/postmaster.c:2539 postmaster/postmaster.c:4131 postmaster/postmaster.c:5500 postmaster/postmaster.c:5871 replication/libpqwalreceiver/libpqwalreceiver.c:361 replication/logical/logical.c:209 replication/walsender.c:686 storage/buffer/localbuf.c:601 -#: storage/file/fd.c:866 storage/file/fd.c:1397 storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1461 storage/ipc/procarray.c:2243 storage/ipc/procarray.c:2250 storage/ipc/procarray.c:2749 storage/ipc/procarray.c:3385 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/pg_locale.c:496 utils/adt/pg_locale.c:660 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 utils/hash/dynahash.c:614 -#: utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 utils/misc/guc.c:4404 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 utils/mmgr/dsa.c:817 utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:534 libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:352 postmaster/bgworker.c:934 postmaster/postmaster.c:2539 postmaster/postmaster.c:4131 postmaster/postmaster.c:5500 postmaster/postmaster.c:5871 replication/libpqwalreceiver/libpqwalreceiver.c:361 replication/logical/logical.c:209 replication/walsender.c:689 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1461 storage/ipc/procarray.c:2243 storage/ipc/procarray.c:2250 storage/ipc/procarray.c:2749 storage/ipc/procarray.c:3385 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/pg_locale.c:496 utils/adt/pg_locale.c:660 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:515 +#: utils/hash/dynahash.c:615 utils/hash/dynahash.c:1112 utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 utils/misc/guc.c:4404 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 utils/mmgr/dsa.c:817 utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 +#: utils/mmgr/mcxt.c:1246 utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -191,7 +191,7 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:447 ../common/file_utils.c:451 access/transam/twophase.c:1315 access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:236 backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 commands/copyfrom.c:1697 commands/copyto.c:706 commands/extension.c:3469 commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 replication/logical/snapbuild.c:1658 storage/file/fd.c:1922 +#: ../common/file_utils.c:87 ../common/file_utils.c:447 ../common/file_utils.c:451 access/transam/twophase.c:1315 access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:236 backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 commands/copyfrom.c:1697 commands/copyto.c:706 commands/extension.c:3469 commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 replication/logical/snapbuild.c:1697 storage/file/fd.c:1922 #: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 utils/adt/genfile.c:658 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" @@ -207,7 +207,7 @@ msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 postmaster/pgarch.c:746 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1819 replication/slot.c:723 replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:792 utils/time/snapmgr.c:1284 +#: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 postmaster/pgarch.c:746 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1858 replication/slot.c:723 replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:792 utils/time/snapmgr.c:1284 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -216,89 +216,89 @@ msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: % msgid "internal error" msgstr "内部エラー" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:1147 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "エスケープシーケンス\"\\%s\"は不正です。" -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:1150 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:1153 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "入力の終端を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:1156 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:1159 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:1162 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "\":\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:1165 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON値を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:1168 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:1170 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "文字列または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:1173 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:1176 #, c-format msgid "Expected string, but found \"%s\"." msgstr "文字列を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:1179 #, c-format msgid "Token \"%s\" is invalid." msgstr "トークン\"%s\"は不正です。" -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:1182 jsonpath_scan.l:597 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:1184 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:1187 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。" -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:1190 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:1193 jsonpath_scan.l:630 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 jsonpath_scan.l:702 +#: ../common/jsonapi.c:1195 jsonpath_scan.l:641 jsonpath_scan.l:651 jsonpath_scan.l:702 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" @@ -383,7 +383,7 @@ msgstr "制限付きトークンで再実行できませんでした: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" -#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 access/transam/twophase.c:1711 access/transam/xlogarchive.c:120 access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 postmaster/syslogger.c:1537 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4531 replication/logical/snapbuild.c:1700 replication/logical/snapbuild.c:2134 replication/slot.c:1936 storage/file/fd.c:832 storage/file/fd.c:3325 storage/file/fd.c:3387 +#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 access/transam/twophase.c:1711 access/transam/xlogarchive.c:120 access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 postmaster/syslogger.c:1537 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4531 replication/logical/snapbuild.c:1739 replication/logical/snapbuild.c:2173 replication/slot.c:1936 storage/file/fd.c:832 storage/file/fd.c:3325 storage/file/fd.c:3387 #: storage/file/reinit.c:262 storage/ipc/dsm.c:316 storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 utils/time/snapmgr.c:1608 #, c-format msgid "could not remove file \"%s\": %m" @@ -594,7 +594,7 @@ msgstr "インデックス\"%s\"は有効ではありません" msgid "cannot accept a value of type %s" msgstr "%s型の値は受け付けられません" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2002 access/spgist/spgdoinsert.c:2279 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 access/gist/gist.c:1469 access/spgist/spgdoinsert.c:2002 access/spgist/spgdoinsert.c:2279 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "インデックス行サイズ%1$zuはインデックス\"%3$s\"での最大値%2$zuを超えています" @@ -717,67 +717,72 @@ msgstr "ユーザー定義リレーションのパラメータ型の制限を超 msgid "RESET must not include values for parameters" msgstr "RESETにはパラメータの値を含めてはいけません" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "認識できないパラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1214 +#: access/common/reloptions.c:1296 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "不正なオプション名\"%s\": \"=\"が含まれていてはなりません" + +#: access/common/reloptions.c:1311 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSと定義されたテーブルはサポートされません" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1479 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "認識できないラメータ \"%s\"" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1591 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "パラメータ\"%s\"が複数回指定されました" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1607 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "不正なブール型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1619 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "不正な整数型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1625 access/common/reloptions.c:1645 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "値%sはオプション\"%s\"の範囲外です" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1627 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "有効な値の範囲は\"%d\"~\"%d\"です。" -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1639 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "不正な浮動小数点型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1647 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "有効な値の範囲は\"%f\"~\"%f\"です。" -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1669 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "不正な列挙型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:2000 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "パーティション親テーブルに対してストレージパラメータは指定できません" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:2001 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "代わりにリーフパーティションに対してストレージパラメータを指定してください。" @@ -792,7 +797,7 @@ msgstr "圧縮方式 lz4 はサポートされていません" msgid "This functionality requires the server to be built with lz4 support." msgstr "この機能はlz4lサポート付きでビルドしたサーバーを必要とします。" -#: access/common/tupdesc.c:837 commands/tablecmds.c:7025 commands/tablecmds.c:13236 +#: access/common/tupdesc.c:837 commands/tablecmds.c:7025 commands/tablecmds.c:13244 #, c-format msgid "too many array dimensions" msgstr "配列の次元多すぎます" @@ -877,7 +882,7 @@ msgstr "これは、PostgreSQL 9.1へアップグレードする前のクラッ msgid "Please REINDEX it." msgstr "REINDEXを行ってください。" -#: access/gist/gist.c:1195 +#: access/gist/gist.c:1202 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "インデックス\"%s\"内の不完全な分割を修正します、ブロック%u" @@ -917,7 +922,7 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$s msgid "could not determine which collation to use for string hashing" msgstr "文字列のハッシュ値計算で使用する照合順序を特定できませんでした" -#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:672 catalog/heap.c:678 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:2022 commands/tablecmds.c:17744 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 utils/adt/like_support.c:1025 utils/adt/varchar.c:739 utils/adt/varchar.c:1010 utils/adt/varchar.c:1067 +#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:672 catalog/heap.c:678 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:2022 commands/tablecmds.c:17752 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 utils/adt/like_support.c:1025 utils/adt/varchar.c:739 utils/adt/varchar.c:1010 utils/adt/varchar.c:1067 #: utils/adt/varlena.c:1518 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." @@ -968,37 +973,37 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$s msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は異なる型間に対応する演算子を含んでいません" -#: access/heap/heapam.c:2049 +#: access/heap/heapam.c:2084 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカーではタプルの挿入はできません" -#: access/heap/heapam.c:2568 +#: access/heap/heapam.c:2607 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処理中はタプルの削除はできません" -#: access/heap/heapam.c:2615 +#: access/heap/heapam.c:2654 #, c-format msgid "attempted to delete invisible tuple" msgstr "不可視のタプルを削除しようとしました" -#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 +#: access/heap/heapam.c:3104 access/heap/heapam.c:6380 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処理中はタプルの更新はできません" -#: access/heap/heapam.c:3239 +#: access/heap/heapam.c:3280 #, c-format msgid "attempted to update invisible tuple" msgstr "不可視のタプルを更新しようとしました" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4791 access/heap/heapam.c:4829 access/heap/heapam.c:5094 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"の行ロックを取得できませんでした" -#: access/heap/heapam.c:6152 commands/trigger.c:3347 executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 +#: access/heap/heapam.c:6193 commands/trigger.c:3347 executor/nodeModifyTable.c:2402 executor/nodeModifyTable.c:2493 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "更新対象のタプルはすでに現在のコマンドによって発行された操作によって変更されています" @@ -1029,7 +1034,7 @@ msgstr "ファイル\"%s\"を作成できませんでした: %m" msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3024 access/transam/xlog.c:3221 access/transam/xlog.c:3953 commands/dbcommands.c:507 postmaster/postmaster.c:4568 postmaster/postmaster.c:4578 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1776 replication/slot.c:1839 +#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3024 access/transam/xlog.c:3221 access/transam/xlog.c:3953 commands/dbcommands.c:507 postmaster/postmaster.c:4568 postmaster/postmaster.c:4578 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1815 replication/slot.c:1839 #: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1656 utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4387 utils/misc/guc.c:4418 utils/misc/guc.c:5554 utils/misc/guc.c:5572 utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 #, c-format msgid "could not write to file \"%s\": %m" @@ -1272,7 +1277,7 @@ msgstr "システムカタログのスキャン中にトランザクションが msgid "cannot access index \"%s\" while it is being reindexed" msgstr "再作成中であるためインデックス\"%s\"にアクセスできません" -#: access/index/indexam.c:208 catalog/objectaddress.c:1394 commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 commands/tablecmds.c:17439 commands/tablecmds.c:19308 +#: access/index/indexam.c:208 catalog/objectaddress.c:1394 commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 commands/tablecmds.c:17447 commands/tablecmds.c:19324 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" @@ -1798,7 +1803,7 @@ msgstr "ファイル\"%s\"内に格納されているサイズが不正です" msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出されたCRCチェックサムがファイル\"%s\"に格納されている値と一致しません" -#: access/transam/twophase.c:1413 access/transam/xlogrecovery.c:590 replication/logical/logical.c:210 replication/walsender.c:687 +#: access/transam/twophase.c:1413 access/transam/xlogrecovery.c:590 replication/logical/logical.c:210 replication/walsender.c:690 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダの割り当てに中に失敗しました。" @@ -2028,7 +2033,7 @@ msgstr "生成されたWALより先の位置までのフラッシュ要求; 要 msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "ログファイル%sのオフセット%uに長さ%zuの書き込みができませんでした: %m" -#: access/transam/xlog.c:3458 access/transam/xlogutils.c:833 replication/walsender.c:2725 +#: access/transam/xlog.c:3458 access/transam/xlogutils.c:833 replication/walsender.c:2754 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" @@ -3625,7 +3630,7 @@ msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "GRANT/REVOKE ON SCHEMAS を使っている時には IN SCHEMA 句は指定できません" #: catalog/aclchk.c:1596 catalog/catalog.c:661 catalog/objectaddress.c:1561 catalog/pg_publication.c:533 commands/analyze.c:390 commands/copy.c:837 commands/sequence.c:1673 commands/tablecmds.c:7444 commands/tablecmds.c:7600 commands/tablecmds.c:7650 commands/tablecmds.c:7724 commands/tablecmds.c:7794 commands/tablecmds.c:7910 commands/tablecmds.c:8004 commands/tablecmds.c:8063 commands/tablecmds.c:8152 commands/tablecmds.c:8182 commands/tablecmds.c:8310 -#: commands/tablecmds.c:8392 commands/tablecmds.c:8526 commands/tablecmds.c:8638 commands/tablecmds.c:12459 commands/tablecmds.c:12651 commands/tablecmds.c:12812 commands/tablecmds.c:14007 commands/tablecmds.c:16539 commands/trigger.c:949 parser/analyze.c:2529 parser/parse_relation.c:737 parser/parse_target.c:1068 parser/parse_type.c:144 parser/parse_utilcmd.c:3443 parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2876 +#: commands/tablecmds.c:8392 commands/tablecmds.c:8526 commands/tablecmds.c:8638 commands/tablecmds.c:12467 commands/tablecmds.c:12659 commands/tablecmds.c:12820 commands/tablecmds.c:14015 commands/tablecmds.c:16547 commands/trigger.c:949 parser/analyze.c:2529 parser/parse_relation.c:737 parser/parse_target.c:1068 parser/parse_type.c:144 parser/parse_utilcmd.c:3443 parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2876 #: utils/adt/ruleutils.c:2793 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -3636,12 +3641,12 @@ msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません" msgid "\"%s\" is an index" msgstr "\"%s\"はインデックスです" -#: catalog/aclchk.c:1848 commands/tablecmds.c:14164 commands/tablecmds.c:17448 +#: catalog/aclchk.c:1848 commands/tablecmds.c:14172 commands/tablecmds.c:17456 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\"は複合型です" -#: catalog/aclchk.c:1856 catalog/objectaddress.c:1401 commands/sequence.c:1178 commands/tablecmds.c:254 commands/tablecmds.c:17412 utils/adt/acl.c:2084 utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 utils/adt/acl.c:2206 utils/adt/acl.c:2236 +#: catalog/aclchk.c:1856 catalog/objectaddress.c:1401 commands/sequence.c:1178 commands/tablecmds.c:254 commands/tablecmds.c:17420 utils/adt/acl.c:2084 utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 utils/adt/acl.c:2206 utils/adt/acl.c:2236 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\"はシーケンスではありません" @@ -4145,7 +4150,7 @@ msgstr[0] "" msgid "cannot drop %s because other objects depend on it" msgstr "他のオブジェクトが依存しているため%sを削除できません" -#: catalog/dependency.c:1209 catalog/dependency.c:1216 catalog/dependency.c:1227 commands/tablecmds.c:1349 commands/tablecmds.c:14651 commands/tablespace.c:466 commands/user.c:1303 commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6673 +#: catalog/dependency.c:1209 catalog/dependency.c:1216 catalog/dependency.c:1227 commands/tablecmds.c:1349 commands/tablecmds.c:14659 commands/tablespace.c:466 commands/user.c:1303 commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1084 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6673 #: utils/misc/guc.c:6707 utils/misc/guc.c:6741 utils/misc/guc.c:6784 utils/misc/guc.c:6826 #, c-format msgid "%s" @@ -4269,7 +4274,7 @@ msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加 msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2624 catalog/index.c:901 catalog/pg_constraint.c:682 commands/tablecmds.c:9013 +#: catalog/heap.c:2624 catalog/index.c:901 catalog/pg_constraint.c:683 commands/tablecmds.c:9013 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "すでに制約\"%s\"はリレーション\"%s\"に存在します" @@ -4294,7 +4299,7 @@ msgstr "制約\"%s\"は、リレーション\"%s\"上の NOT VALID 制約と競 msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:2683 catalog/pg_constraint.c:811 commands/tablecmds.c:2686 commands/tablecmds.c:3213 commands/tablecmds.c:6926 commands/tablecmds.c:15474 commands/tablecmds.c:15615 +#: catalog/heap.c:2683 catalog/pg_constraint.c:812 commands/tablecmds.c:2686 commands/tablecmds.c:3213 commands/tablecmds.c:6926 commands/tablecmds.c:15482 commands/tablecmds.c:15623 #, c-format msgid "too many inheritance parents" msgstr "継承の親テーブルが多すぎます" @@ -4534,7 +4539,7 @@ msgstr "テキスト検索設定\"%s\"は存在しません" msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: catalog/namespace.c:2886 gram.y:18576 gram.y:18616 parser/parse_expr.c:839 parser/parse_target.c:1267 +#: catalog/namespace.c:2886 gram.y:18583 gram.y:18623 parser/parse_expr.c:839 parser/parse_target.c:1267 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" @@ -4584,22 +4589,22 @@ msgstr "リカバリ中は一時テーブルを作成できません" msgid "cannot create temporary tables during a parallel operation" msgstr "並行処理中は一時テーブルを作成できません" -#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2220 commands/tablecmds.c:12587 +#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2220 commands/tablecmds.c:12595 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\"はテーブルではありません" -#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 commands/tablecmds.c:17417 commands/view.c:119 +#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 commands/tablecmds.c:17425 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\"はビューではありません" -#: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 commands/tablecmds.c:17422 +#: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 commands/tablecmds.c:17430 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\"は実体化ビューではありません" -#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 commands/tablecmds.c:17427 +#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 commands/tablecmds.c:17435 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\"は外部テーブルではありません" @@ -4639,7 +4644,7 @@ msgstr "%4$s の関数 %1$d (%2$s, %3$s) がありません" msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ユーザー\"%s\"に対するユーザーマッピングがサーバー\"%s\"には存在しません" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:710 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:441 commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 foreign/foreign.c:710 #, c-format msgid "server \"%s\" does not exist" msgstr "サーバー\"%s\"は存在しません" @@ -5266,17 +5271,17 @@ msgstr "照合順序\"%s\"はすでに存在します" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:690 +#: catalog/pg_constraint.c:691 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 +#: catalog/pg_constraint.c:891 catalog/pg_constraint.c:984 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"の制約\"%1$s\"は存在しません" -#: catalog/pg_constraint.c:1083 +#: catalog/pg_constraint.c:1084 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ドメイン\"%2$s\"に対する制約\"%1$s\"は存在しません" @@ -5361,7 +5366,7 @@ msgstr "パーティション\"%s\"を取り外せません" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "このパーティションは今現在取り外し中であるか取り外し処理が未完了の状態です。" -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4646 commands/tablecmds.c:15730 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4646 commands/tablecmds.c:15738 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中の取り外し処理を完了させてください。" @@ -5823,12 +5828,12 @@ msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE で msgid "event trigger \"%s\" already exists" msgstr "イベントトリガ\"%s\"はすでに存在します" -#: commands/alter.c:90 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"はすでに存在します" -#: commands/alter.c:93 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "サーバー\"%s\"はすでに存在します" @@ -5923,7 +5928,7 @@ msgstr "アクセスメソッド\"%s\"は存在しません" msgid "handler function is not specified" msgstr "ハンドラ関数の指定がありません" -#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:500 commands/proclang.c:80 commands/trigger.c:709 parser/parse_clause.c:941 #, c-format msgid "function %s must return type %s" msgstr "関数%sは型%sを返さなければなりません" @@ -6028,7 +6033,7 @@ msgstr "他のセッションの一時テーブルをクラスタ化できませ msgid "there is no previously clustered index for table \"%s\"" msgstr "テーブル\"%s\"には事前にクラスタ化されたインデックスはありません" -#: commands/cluster.c:192 commands/tablecmds.c:14465 commands/tablecmds.c:16309 +#: commands/cluster.c:192 commands/tablecmds.c:14473 commands/tablecmds.c:16317 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"にはインデックス\"%1$s\"は存在しません" @@ -6043,7 +6048,7 @@ msgstr "共有カタログをクラスタ化できません" msgid "cannot vacuum temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対してはVACUUMを実行できません" -#: commands/cluster.c:513 commands/tablecmds.c:16319 +#: commands/cluster.c:513 commands/tablecmds.c:16327 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\"はテーブル\"%s\"のインデックスではありません" @@ -6102,7 +6107,7 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:125 commands/collationcmds.c:131 commands/define.c:389 commands/tablecmds.c:7985 replication/pgoutput/pgoutput.c:316 replication/pgoutput/pgoutput.c:339 replication/pgoutput/pgoutput.c:353 replication/pgoutput/pgoutput.c:363 replication/pgoutput/pgoutput.c:373 replication/pgoutput/pgoutput.c:383 replication/pgoutput/pgoutput.c:393 replication/walsender.c:996 replication/walsender.c:1018 replication/walsender.c:1028 +#: commands/collationcmds.c:125 commands/collationcmds.c:131 commands/define.c:389 commands/tablecmds.c:7985 replication/pgoutput/pgoutput.c:316 replication/pgoutput/pgoutput.c:339 replication/pgoutput/pgoutput.c:353 replication/pgoutput/pgoutput.c:363 replication/pgoutput/pgoutput.c:373 replication/pgoutput/pgoutput.c:383 replication/pgoutput/pgoutput.c:393 replication/walsender.c:999 replication/walsender.c:1021 replication/walsender.c:1031 #, c-format msgid "conflicting or redundant options" msgstr "競合するオプション、あるいは余計なオプションがあります" @@ -6171,7 +6176,7 @@ msgstr "デフォルト照合順序のバーションはリフレッシュでき #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 commands/tablecmds.c:7810 commands/tablecmds.c:7820 commands/tablecmds.c:14167 commands/tablecmds.c:17450 commands/tablecmds.c:17471 commands/typecmds.c:3637 commands/typecmds.c:3720 commands/typecmds.c:4013 +#: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 commands/tablecmds.c:7810 commands/tablecmds.c:7820 commands/tablecmds.c:14175 commands/tablecmds.c:17458 commands/tablecmds.c:17479 commands/typecmds.c:3637 commands/typecmds.c:3720 commands/typecmds.c:4013 #, c-format msgid "Use %s instead." msgstr "代わりに%sを使用してください" @@ -7280,7 +7285,7 @@ msgstr "\"%s\"は集約関数です" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除するにはDROP AGGREGATEを使用してください" -#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3739 commands/tablecmds.c:3897 commands/tablecmds.c:3949 commands/tablecmds.c:16734 tcop/utility.c:1336 +#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3739 commands/tablecmds.c:3897 commands/tablecmds.c:3949 commands/tablecmds.c:16742 tcop/utility.c:1336 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "リレーション\"%s\"は存在しません、スキップします" @@ -7405,7 +7410,7 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません、 msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" @@ -7796,112 +7801,112 @@ msgstr "スキーマ\"%s\"を拡張\"%s\"に追加できません。そのスキ msgid "file \"%s\" is too large" msgstr "ファイル\"%s\"は大きすぎます" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "オプション\"%s\"が見つかりません" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "オプション\"%s\"が2回以上指定されました" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"の所有者を変更する権限がありません" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "外部データラッパーの所有者を変更するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "外部データラッパーの所有者はスーパーユーザーでなければなりません" -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:688 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:688 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "外部データラッパー\"%s\"は存在しません" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "OID %uの外部データラッパーは存在しません" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "OID %uの外部サーバーは存在しません" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を作成する権限がありません" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "外部データラッパを作成するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を変更する権限がありません" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "外部データラッパーを更新するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "外部データラッパーのハンドラーを変更すると、既存の外部テーブルの振る舞いが変わることがあります" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "外部データラッパーのバリデータ(検証用関数)を変更すると、それに依存するオプションが不正になる場合があります" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "サーバー\"%s\"はすでに存在します、スキップします" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します、スキップします" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません、スキップします" -#: commands/foreigncmds.c:1507 foreign/foreign.c:401 +#: commands/foreigncmds.c:1518 foreign/foreign.c:401 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"にはハンドラがありません" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "外部データラッパー\"%s\"は IMPORT FOREIGN SCHEMA をサポートしていません" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインポートします" @@ -8417,7 +8422,7 @@ msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:2029 commands/tablecmds.c:17751 commands/typecmds.c:807 parser/parse_expr.c:2730 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 utils/adt/misc.c:586 +#: commands/indexcmds.c:2029 commands/tablecmds.c:17759 commands/typecmds.c:807 parser/parse_expr.c:2730 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされません" @@ -8452,7 +8457,7 @@ msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポート msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:2211 commands/tablecmds.c:17776 commands/tablecmds.c:17782 commands/typecmds.c:2301 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17784 commands/tablecmds.c:17790 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" @@ -8522,7 +8527,7 @@ msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築 msgid "while reindexing partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 +#: commands/indexcmds.c:3355 commands/indexcmds.c:4219 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" @@ -8547,12 +8552,12 @@ msgstr "このタイプのリレーションでインデックス並列再構築 msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 +#: commands/indexcmds.c:4200 commands/indexcmds.c:4212 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 +#: commands/indexcmds.c:4202 commands/indexcmds.c:4221 #, c-format msgid "%s." msgstr "%s。" @@ -8567,7 +8572,7 @@ msgstr "リレーション\"%s\"はロックできません" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "実体化ビューにデータが投入されていない場合はCONCURRENTLYを使用することはできません" -#: commands/matview.c:199 gram.y:18313 +#: commands/matview.c:199 gram.y:18320 #, c-format msgid "%s and %s options cannot be used together" msgstr "%sオプションと%sオプションとを同時に使用することはできません" @@ -8862,7 +8867,7 @@ msgstr "JOIN推定関数 %s は %s型を返す必要があります" msgid "operator attribute \"%s\" cannot be changed" msgstr "演算子の属性\"%s\"は変更できません" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1630 commands/tablecmds.c:2233 commands/tablecmds.c:3549 commands/tablecmds.c:6434 commands/tablecmds.c:9294 commands/tablecmds.c:17338 commands/tablecmds.c:17373 commands/trigger.c:323 commands/trigger.c:1339 commands/trigger.c:1449 rewrite/rewriteDefine.c:275 rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1630 commands/tablecmds.c:2233 commands/tablecmds.c:3549 commands/tablecmds.c:6434 commands/tablecmds.c:9294 commands/tablecmds.c:17346 commands/tablecmds.c:17381 commands/trigger.c:323 commands/trigger.c:1339 commands/trigger.c:1449 rewrite/rewriteDefine.c:275 rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "権限がありません: \"%s\"はシステムカタログです" @@ -8912,7 +8917,7 @@ msgstr "カーソル名が不正です: 空ではいけません" msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "セキュリティー制限操作中は、WITH HOLD指定のカーソルを作成できません" -#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2917 utils/adt/xml.c:3087 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2930 utils/adt/xml.c:3100 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"は存在しません" @@ -9307,7 +9312,7 @@ msgstr "シーケンスは関連するテーブルと同じスキーマでなけ msgid "cannot change ownership of identity sequence" msgstr "識別シーケンスの所有者は変更できません" -#: commands/sequence.c:1689 commands/tablecmds.c:14154 commands/tablecmds.c:16754 +#: commands/sequence.c:1689 commands/tablecmds.c:14162 commands/tablecmds.c:16762 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "シーケンス\"%s\"はテーブル\"%s\"にリンクされています" @@ -9440,7 +9445,7 @@ msgstr "サブスクリプションを作成する権限がありません" msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "\"%s\"ロールの権限を持つロールのみがサブスクリプションを作成できます。" -#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 replication/logical/tablesync.c:1334 replication/logical/worker.c:4640 +#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 replication/logical/tablesync.c:1334 replication/logical/worker.c:4650 #, c-format msgid "could not connect to the publisher: %s" msgstr "発行サーバーへの接続ができませんでした: %s" @@ -9659,7 +9664,7 @@ msgstr "実体化ビュー\"%s\"は存在しません、スキップします" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19351 parser/parse_utilcmd.c:2289 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19367 parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" @@ -9682,7 +9687,7 @@ msgstr "\"%s\"は型ではありません" msgid "Use DROP TYPE to remove a type." msgstr "型を削除するにはDROP TYPEを使用してください" -#: commands/tablecmds.c:282 commands/tablecmds.c:13993 commands/tablecmds.c:16459 +#: commands/tablecmds.c:282 commands/tablecmds.c:14001 commands/tablecmds.c:16467 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "外部テーブル\"%s\"は存在しません" @@ -9706,7 +9711,7 @@ msgstr "ON COMMITは一時テーブルでのみ使用できます" msgid "cannot create temporary table within security-restricted operation" msgstr "セキュリティー制限操作中は、一時テーブルを作成できません" -#: commands/tablecmds.c:785 commands/tablecmds.c:15304 +#: commands/tablecmds.c:785 commands/tablecmds.c:15312 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "リレーション\"%s\"が複数回継承されました" @@ -9776,7 +9781,7 @@ msgstr "外部テーブル\"%s\"の切り詰めはできません" msgid "cannot truncate temporary tables of other sessions" msgstr "他のセッションの一時テーブルを削除できません" -#: commands/tablecmds.c:2502 commands/tablecmds.c:15201 +#: commands/tablecmds.c:2502 commands/tablecmds.c:15209 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"からの継承はできません" @@ -9796,12 +9801,12 @@ msgstr "継承しようとしたリレーション\"%s\"はテーブルまたは msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション\"%s\"のパーティション子テーブルとして作ることはできません" -#: commands/tablecmds.c:2536 commands/tablecmds.c:15180 +#: commands/tablecmds.c:2536 commands/tablecmds.c:15188 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"から継承することはできません" -#: commands/tablecmds.c:2546 commands/tablecmds.c:15188 +#: commands/tablecmds.c:2546 commands/tablecmds.c:15196 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "他のセッションの一時リレーションから継承することはできません" @@ -9846,7 +9851,7 @@ msgstr "列\"%s\"の圧縮方式が競合しています" msgid "inherited column \"%s\" has a generation conflict" msgstr "継承された列 \"%s\"の生成が競合しています" -#: commands/tablecmds.c:2781 commands/tablecmds.c:2836 commands/tablecmds.c:12686 parser/parse_utilcmd.c:1293 parser/parse_utilcmd.c:1336 parser/parse_utilcmd.c:1773 parser/parse_utilcmd.c:1881 +#: commands/tablecmds.c:2781 commands/tablecmds.c:2836 commands/tablecmds.c:12694 parser/parse_utilcmd.c:1293 parser/parse_utilcmd.c:1336 parser/parse_utilcmd.c:1773 parser/parse_utilcmd.c:1881 #, c-format msgid "cannot convert whole-row table reference" msgstr "行全体テーブル参照を変換できません" @@ -10094,12 +10099,12 @@ msgstr "型付けされたテーブルに列を追加できません" msgid "cannot add column to a partition" msgstr "パーティションに列は追加できません" -#: commands/tablecmds.c:6909 commands/tablecmds.c:15431 +#: commands/tablecmds.c:6909 commands/tablecmds.c:15439 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "子テーブル\"%s\"に異なる型の列\"%s\"があります" -#: commands/tablecmds.c:6915 commands/tablecmds.c:15438 +#: commands/tablecmds.c:6915 commands/tablecmds.c:15446 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "子テーブル\"%s\"に異なる照合順序の列\"%s\"があります" @@ -10129,17 +10134,17 @@ msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します、 msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します" -#: commands/tablecmds.c:7415 commands/tablecmds.c:12313 +#: commands/tablecmds.c:7415 commands/tablecmds.c:12321 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "パーティションが存在する場合にはパーティション親テーブルのみから制約を削除することはできません" -#: commands/tablecmds.c:7416 commands/tablecmds.c:7733 commands/tablecmds.c:8706 commands/tablecmds.c:12314 +#: commands/tablecmds.c:7416 commands/tablecmds.c:7733 commands/tablecmds.c:8706 commands/tablecmds.c:12322 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLYキーワードを指定しないでください。" -#: commands/tablecmds.c:7453 commands/tablecmds.c:7659 commands/tablecmds.c:7801 commands/tablecmds.c:7919 commands/tablecmds.c:8013 commands/tablecmds.c:8072 commands/tablecmds.c:8191 commands/tablecmds.c:8330 commands/tablecmds.c:8400 commands/tablecmds.c:8534 commands/tablecmds.c:12468 commands/tablecmds.c:14016 commands/tablecmds.c:16548 +#: commands/tablecmds.c:7453 commands/tablecmds.c:7659 commands/tablecmds.c:7801 commands/tablecmds.c:7919 commands/tablecmds.c:8013 commands/tablecmds.c:8072 commands/tablecmds.c:8191 commands/tablecmds.c:8330 commands/tablecmds.c:8400 commands/tablecmds.c:8534 commands/tablecmds.c:12476 commands/tablecmds.c:14024 commands/tablecmds.c:16556 #, c-format msgid "cannot alter system column \"%s\"" msgstr "システム列\"%s\"を変更できません" @@ -10304,7 +10309,7 @@ msgstr "パーティションテーブル\"%1$s\"にリレーション\"%2$s\" msgid "This feature is not yet supported on partitioned tables." msgstr "この機能はパーティションテーブルに対してはサポートされていません。" -#: commands/tablecmds.c:9288 commands/tablecmds.c:9749 +#: commands/tablecmds.c:9288 commands/tablecmds.c:9770 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "参照先のリレーション\"%s\"はテーブルではありません" @@ -10329,703 +10334,703 @@ msgstr "一時テーブルに対する制約は一時テーブルだけを参照 msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルに対する制約にはこのセッションの一時テーブルを加える必要があります" -#: commands/tablecmds.c:9392 commands/tablecmds.c:9398 +#: commands/tablecmds.c:9393 commands/tablecmds.c:9399 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生成カラムを含む外部キー制約に対する不正な %s 処理" -#: commands/tablecmds.c:9414 +#: commands/tablecmds.c:9415 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーの参照列数と被参照列数が合いません" -#: commands/tablecmds.c:9521 +#: commands/tablecmds.c:9522 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sは実装されていません" -#: commands/tablecmds.c:9523 +#: commands/tablecmds.c:9524 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "キーとなる列\"%s\"と\"%s\"との間で型に互換性がありません:%sと%s" -#: commands/tablecmds.c:9692 +#: commands/tablecmds.c:9699 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "ON DELETE SETアクションで参照されている列\"%s\"は外部キーの一部である必要があります" -#: commands/tablecmds.c:10049 commands/tablecmds.c:10489 parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:951 +#: commands/tablecmds.c:10070 commands/tablecmds.c:10497 parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:951 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "外部テーブルでは外部キー制約はサポートされていません" -#: commands/tablecmds.c:10472 +#: commands/tablecmds.c:10480 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "外部キー\"%2$s\"で参照されているため、テーブル\"%1$s\"を子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:11073 commands/tablecmds.c:11354 commands/tablecmds.c:12270 commands/tablecmds.c:12345 +#: commands/tablecmds.c:11081 commands/tablecmds.c:11362 commands/tablecmds.c:12278 commands/tablecmds.c:12353 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/tablecmds.c:11080 +#: commands/tablecmds.c:11088 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約ではありません" -#: commands/tablecmds.c:11118 +#: commands/tablecmds.c:11126 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"を変更できません" -#: commands/tablecmds.c:11121 +#: commands/tablecmds.c:11129 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "制約\"%1$s\"は、リレーション\"%3$s\"上の制約\"%2$s\"から派生しています。" -#: commands/tablecmds.c:11123 +#: commands/tablecmds.c:11131 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "この制約の代わりに派生元の制約を変更することは可能です。" -#: commands/tablecmds.c:11362 +#: commands/tablecmds.c:11370 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約でも検査制約でもありません" -#: commands/tablecmds.c:11439 +#: commands/tablecmds.c:11447 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約は子テーブルでも検証される必要があります" -#: commands/tablecmds.c:11526 +#: commands/tablecmds.c:11534 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約で参照される列\"%s\"が存在しません" -#: commands/tablecmds.c:11532 +#: commands/tablecmds.c:11540 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "システム列は外部キーに使用できません" -#: commands/tablecmds.c:11536 +#: commands/tablecmds.c:11544 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーでは%dを超えるキーを持つことができません" -#: commands/tablecmds.c:11601 +#: commands/tablecmds.c:11609 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"には遅延可能プライマリキーは使用できません" -#: commands/tablecmds.c:11618 +#: commands/tablecmds.c:11626 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"にはプライマリキーがありません" -#: commands/tablecmds.c:11686 +#: commands/tablecmds.c:11694 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーの被参照列リストには重複があってはなりません" -#: commands/tablecmds.c:11778 +#: commands/tablecmds.c:11786 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に対しては、遅延可能な一意性制約は使用できません" -#: commands/tablecmds.c:11783 +#: commands/tablecmds.c:11791 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に、指定したキーに一致する一意性制約がありません" -#: commands/tablecmds.c:12226 +#: commands/tablecmds.c:12234 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を削除できません" -#: commands/tablecmds.c:12276 +#: commands/tablecmds.c:12284 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:12452 +#: commands/tablecmds.c:12460 #, c-format msgid "cannot alter column type of typed table" msgstr "型付けされたテーブルの列の型を変更できません" -#: commands/tablecmds.c:12478 +#: commands/tablecmds.c:12486 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "生成列の型変更の際にはUSINGを指定することはできません" -#: commands/tablecmds.c:12479 commands/tablecmds.c:17594 commands/tablecmds.c:17684 commands/trigger.c:663 rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 +#: commands/tablecmds.c:12487 commands/tablecmds.c:17602 commands/tablecmds.c:17692 commands/trigger.c:663 rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" -#: commands/tablecmds.c:12489 +#: commands/tablecmds.c:12497 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承される列\"%s\"を変更できません" -#: commands/tablecmds.c:12498 +#: commands/tablecmds.c:12506 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、変更できません" -#: commands/tablecmds.c:12548 +#: commands/tablecmds.c:12556 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"に対するUSING句の結果は自動的に%s型に型変換できません" -#: commands/tablecmds.c:12551 +#: commands/tablecmds.c:12559 #, c-format msgid "You might need to add an explicit cast." msgstr "必要に応じて明示的な型変換を追加してください。" -#: commands/tablecmds.c:12555 +#: commands/tablecmds.c:12563 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"は型%sには自動的に型変換できません" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12559 +#: commands/tablecmds.c:12567 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "必要に応じて\"USING %s::%s\"を追加してください。" -#: commands/tablecmds.c:12658 +#: commands/tablecmds.c:12666 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承列\"%1$s\"は変更できません" -#: commands/tablecmds.c:12687 +#: commands/tablecmds.c:12695 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING式が行全体テーブル参照を含んでいます。" -#: commands/tablecmds.c:12698 +#: commands/tablecmds.c:12706 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承される列\"%s\"の型を子テーブルで変更しなければなりません" -#: commands/tablecmds.c:12823 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"の型を2回変更することはできません" -#: commands/tablecmds.c:12861 +#: commands/tablecmds.c:12869 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"に対する生成式は自動的に%s型にキャストできません" -#: commands/tablecmds.c:12866 +#: commands/tablecmds.c:12874 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"のデフォルト値を自動的に%s型にキャストできません" -#: commands/tablecmds.c:12954 +#: commands/tablecmds.c:12962 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "関数またはプロシージャで使用される列の型は変更できません" -#: commands/tablecmds.c:12955 commands/tablecmds.c:12969 commands/tablecmds.c:12988 commands/tablecmds.c:13006 commands/tablecmds.c:13064 +#: commands/tablecmds.c:12963 commands/tablecmds.c:12977 commands/tablecmds.c:12996 commands/tablecmds.c:13014 commands/tablecmds.c:13072 #, c-format msgid "%s depends on column \"%s\"" msgstr "%sは列\"%s\"に依存しています" -#: commands/tablecmds.c:12968 +#: commands/tablecmds.c:12976 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ビューまたはルールで使用される列の型は変更できません" -#: commands/tablecmds.c:12987 +#: commands/tablecmds.c:12995 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義で使用される列の型は変更できません" -#: commands/tablecmds.c:13005 +#: commands/tablecmds.c:13013 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ポリシ定義で使用されている列の型は変更できません" -#: commands/tablecmds.c:13036 +#: commands/tablecmds.c:13044 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "生成カラムで使用される列の型は変更できません" -#: commands/tablecmds.c:13037 +#: commands/tablecmds.c:13045 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" -#: commands/tablecmds.c:13063 +#: commands/tablecmds.c:13071 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "パブリケーションのWHERE句で使用される列の型は変更できません" -#: commands/tablecmds.c:14124 commands/tablecmds.c:14136 +#: commands/tablecmds.c:14132 commands/tablecmds.c:14144 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:14126 commands/tablecmds.c:14138 +#: commands/tablecmds.c:14134 commands/tablecmds.c:14146 #, c-format msgid "Change the ownership of the index's table instead." msgstr "代わりにインデックスのテーブルの所有者を変更してください。" -#: commands/tablecmds.c:14152 +#: commands/tablecmds.c:14160 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:14177 +#: commands/tablecmds.c:14185 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "リレーション\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:14539 +#: commands/tablecmds.c:14547 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定できません" -#: commands/tablecmds.c:14616 +#: commands/tablecmds.c:14624 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "リレーション\"%s\"のオプションは設定できません" -#: commands/tablecmds.c:14650 commands/view.c:445 +#: commands/tablecmds.c:14658 commands/view.c:445 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTIONは自動更新可能ビューでのみサポートされます" -#: commands/tablecmds.c:14901 +#: commands/tablecmds.c:14909 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースにはテーブル、インデックスおよび実体化ビューしかありません" -#: commands/tablecmds.c:14913 +#: commands/tablecmds.c:14921 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースとの間のリレーションの移動はできません" -#: commands/tablecmds.c:15005 +#: commands/tablecmds.c:15013 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"のロックが獲得できなかったため中断します" -#: commands/tablecmds.c:15021 +#: commands/tablecmds.c:15029 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"には合致するリレーションはありませんでした" -#: commands/tablecmds.c:15139 +#: commands/tablecmds.c:15147 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付けされたテーブルの継承を変更できません" -#: commands/tablecmds.c:15144 commands/tablecmds.c:15662 +#: commands/tablecmds.c:15152 commands/tablecmds.c:15670 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションの継承は変更できません" -#: commands/tablecmds.c:15149 +#: commands/tablecmds.c:15157 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "パーティションテーブルの継承は変更できません" -#: commands/tablecmds.c:15195 +#: commands/tablecmds.c:15203 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "他のセッションの一時テーブルを継承できません" -#: commands/tablecmds.c:15208 +#: commands/tablecmds.c:15216 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションからの継承はできません" -#: commands/tablecmds.c:15230 commands/tablecmds.c:18095 +#: commands/tablecmds.c:15238 commands/tablecmds.c:18103 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行うことはできません" -#: commands/tablecmds.c:15231 commands/tablecmds.c:18096 +#: commands/tablecmds.c:15239 commands/tablecmds.c:18104 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"はすでに\"%s\"の子です" -#: commands/tablecmds.c:15244 +#: commands/tablecmds.c:15252 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "トリガ\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" -#: commands/tablecmds.c:15246 +#: commands/tablecmds.c:15254 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "遷移テーブルを使用したROWトリガは継承関係ではサポートされていません。" -#: commands/tablecmds.c:15449 +#: commands/tablecmds.c:15457 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "子テーブルの列\"%s\"はNOT NULLである必要があります" -#: commands/tablecmds.c:15458 +#: commands/tablecmds.c:15466 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "子テーブルの列\"%s\"は生成列である必要があります" -#: commands/tablecmds.c:15463 +#: commands/tablecmds.c:15471 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "子テーブルの列\"%s\"は生成列であってはなりません" -#: commands/tablecmds.c:15494 +#: commands/tablecmds.c:15502 #, c-format msgid "child table is missing column \"%s\"" msgstr "子テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:15582 +#: commands/tablecmds.c:15590 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "子テーブル\"%s\"では検査制約\"%s\"に異なった定義がされています" -#: commands/tablecmds.c:15590 +#: commands/tablecmds.c:15598 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"上の継承されない制約と競合します" -#: commands/tablecmds.c:15601 +#: commands/tablecmds.c:15609 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT VALID制約と衝突しています" -#: commands/tablecmds.c:15640 +#: commands/tablecmds.c:15648 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "子テーブルには制約\"%s\"がありません" -#: commands/tablecmds.c:15726 +#: commands/tablecmds.c:15734 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "パーティション\"%s\"はすでにパーティションテーブル\"%s.%s\"からの取り外し保留中です" -#: commands/tablecmds.c:15755 commands/tablecmds.c:15803 +#: commands/tablecmds.c:15763 commands/tablecmds.c:15811 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"のパーティション子テーブルではありません" -#: commands/tablecmds.c:15809 +#: commands/tablecmds.c:15817 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"の親ではありません" -#: commands/tablecmds.c:16037 +#: commands/tablecmds.c:16045 #, c-format msgid "typed tables cannot inherit" msgstr "型付けされたテーブルは継承できません" -#: commands/tablecmds.c:16067 +#: commands/tablecmds.c:16075 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:16078 +#: commands/tablecmds.c:16086 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルには列\"%s\"がありますが型は\"%s\"を必要としています" -#: commands/tablecmds.c:16087 +#: commands/tablecmds.c:16095 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"では列\"%s\"の型が異なっています" -#: commands/tablecmds.c:16101 +#: commands/tablecmds.c:16109 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルに余分な列\"%s\"があります" -#: commands/tablecmds.c:16153 +#: commands/tablecmds.c:16161 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"は型付けされたテーブルではありません" -#: commands/tablecmds.c:16327 +#: commands/tablecmds.c:16335 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "非ユニークインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:16333 +#: commands/tablecmds.c:16341 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "一意性を即時検査しないインデックス\"%s\"は複製識別には使用できません" -#: commands/tablecmds.c:16339 +#: commands/tablecmds.c:16347 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "式インデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:16345 +#: commands/tablecmds.c:16353 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別としては使用できません" -#: commands/tablecmds.c:16362 +#: commands/tablecmds.c:16370 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "列%2$dはシステム列であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:16369 +#: commands/tablecmds.c:16377 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "列\"%2$s\"はnull可であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:16614 +#: commands/tablecmds.c:16622 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"は一時テーブルであるため、ログ出力設定を変更できません" -#: commands/tablecmds.c:16638 +#: commands/tablecmds.c:16646 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"はパブリケーションの一部であるため、UNLOGGEDに変更できません" -#: commands/tablecmds.c:16640 +#: commands/tablecmds.c:16648 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションはレプリケーションできません。" -#: commands/tablecmds.c:16685 +#: commands/tablecmds.c:16693 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"はUNLOGGEDテーブル\"%s\"を参照しているためLOGGEDには設定できません" -#: commands/tablecmds.c:16695 +#: commands/tablecmds.c:16703 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"はLOGGEDテーブル\"%s\"を参照しているためUNLOGGEDには設定できません" -#: commands/tablecmds.c:16753 +#: commands/tablecmds.c:16761 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有するシーケンスを他のスキーマに移動することができません" -#: commands/tablecmds.c:16858 +#: commands/tablecmds.c:16866 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/tablecmds.c:17282 +#: commands/tablecmds.c:17290 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\"はテーブルや実体化ビューではありません" -#: commands/tablecmds.c:17432 +#: commands/tablecmds.c:17440 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"は複合型ではありません" -#: commands/tablecmds.c:17462 +#: commands/tablecmds.c:17470 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "インデックス\"%s\"のスキーマを変更できません" -#: commands/tablecmds.c:17464 commands/tablecmds.c:17478 +#: commands/tablecmds.c:17472 commands/tablecmds.c:17486 #, c-format msgid "Change the schema of the table instead." msgstr "代わりにこのテーブルのスキーマを変更してください。" -#: commands/tablecmds.c:17468 +#: commands/tablecmds.c:17476 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "複合型%sのスキーマは変更できません" -#: commands/tablecmds.c:17476 +#: commands/tablecmds.c:17484 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "TOASTテーブル\"%s\"のスキーマは変更できません" -#: commands/tablecmds.c:17508 +#: commands/tablecmds.c:17516 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジは2つ以上の列に対しては使えません" -#: commands/tablecmds.c:17574 +#: commands/tablecmds.c:17582 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "パーティションキーに指定されている列\"%s\"は存在しません" -#: commands/tablecmds.c:17582 +#: commands/tablecmds.c:17590 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーでシステム列\"%s\"は使用できません" -#: commands/tablecmds.c:17593 commands/tablecmds.c:17683 +#: commands/tablecmds.c:17601 commands/tablecmds.c:17691 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーで生成カラムは使用できません" -#: commands/tablecmds.c:17666 +#: commands/tablecmds.c:17674 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "パーティションキー式はシステム列への参照を含むことができません" -#: commands/tablecmds.c:17713 +#: commands/tablecmds.c:17721 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" -#: commands/tablecmds.c:17722 +#: commands/tablecmds.c:17730 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数式をパーティションキーとして使うことはできません" -#: commands/tablecmds.c:17743 +#: commands/tablecmds.c:17751 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティション式で使用する照合順序を特定できませんでした" -#: commands/tablecmds.c:17778 +#: commands/tablecmds.c:17786 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "ハッシュ演算子クラスを指定するか、もしくはこのデータ型にデフォルトのハッシュ演算子クラスを定義する必要があります。" -#: commands/tablecmds.c:17784 +#: commands/tablecmds.c:17792 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "btree演算子クラスを指定するか、もしくはこのデータ型にデフォルトのbtree演算子クラスを定義するかする必要があります。" -#: commands/tablecmds.c:18035 +#: commands/tablecmds.c:18043 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"はすでパーティションです" -#: commands/tablecmds.c:18041 +#: commands/tablecmds.c:18049 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付けされたテーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:18057 +#: commands/tablecmds.c:18065 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承子テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:18071 +#: commands/tablecmds.c:18079 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:18105 +#: commands/tablecmds.c:18113 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:18113 +#: commands/tablecmds.c:18121 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:18121 +#: commands/tablecmds.c:18129 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションの一時リレーションのパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:18128 +#: commands/tablecmds.c:18136 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションの一時リレーションにパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:18148 +#: commands/tablecmds.c:18156 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"は親テーブル\"%3$s\"にない列\"%2$s\"を含んでいます" -#: commands/tablecmds.c:18151 +#: commands/tablecmds.c:18159 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "新しいパーティションは親に存在する列のみを含むことができます。" -#: commands/tablecmds.c:18163 +#: commands/tablecmds.c:18171 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "トリガ\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" -#: commands/tablecmds.c:18165 +#: commands/tablecmds.c:18173 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません。" -#: commands/tablecmds.c:18344 +#: commands/tablecmds.c:18352 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"はパーティションテーブル\"%s\"の子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:18347 +#: commands/tablecmds.c:18355 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "パーティション親テーブル\"%s\"はユニークインデックスを持っています。" -#: commands/tablecmds.c:18664 +#: commands/tablecmds.c:18672 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "デフォルトパーティションを持つパーティションは並列的に取り外しはできません" -#: commands/tablecmds.c:18773 +#: commands/tablecmds.c:18781 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/tablecmds.c:18779 +#: commands/tablecmds.c:18787 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:19385 commands/tablecmds.c:19405 commands/tablecmds.c:19426 commands/tablecmds.c:19445 commands/tablecmds.c:19487 +#: commands/tablecmds.c:19401 commands/tablecmds.c:19421 commands/tablecmds.c:19442 commands/tablecmds.c:19461 commands/tablecmds.c:19503 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:19388 +#: commands/tablecmds.c:19404 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:19408 +#: commands/tablecmds.c:19424 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:19429 +#: commands/tablecmds.c:19445 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:19448 +#: commands/tablecmds.c:19464 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"の制約に属していますが、インデックス\"%s\"には制約がありません。" -#: commands/tablecmds.c:19490 +#: commands/tablecmds.c:19506 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:19726 +#: commands/tablecmds.c:19742 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:19733 +#: commands/tablecmds.c:19749 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効な圧縮方式\"%s\"" -#: commands/tablecmds.c:19759 +#: commands/tablecmds.c:19775 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:19769 +#: commands/tablecmds.c:19785 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" @@ -11390,17 +11395,17 @@ msgstr "BEFORE FOR EACH ROWトリガの実行では、他のパーティショ msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "トリガ\"%s\"の実行前には、この行はパーティション\"%s.%s\"に置かれるはずでした。" -#: commands/trigger.c:3348 executor/nodeModifyTable.c:1543 executor/nodeModifyTable.c:1617 executor/nodeModifyTable.c:2382 executor/nodeModifyTable.c:2473 executor/nodeModifyTable.c:3034 executor/nodeModifyTable.c:3173 +#: commands/trigger.c:3348 executor/nodeModifyTable.c:1564 executor/nodeModifyTable.c:1638 executor/nodeModifyTable.c:2403 executor/nodeModifyTable.c:2494 executor/nodeModifyTable.c:3055 executor/nodeModifyTable.c:3194 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "他の行への変更を伝搬させるためにBEFOREトリガではなくAFTERトリガの使用を検討してください" -#: commands/trigger.c:3389 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:316 executor/nodeModifyTable.c:1559 executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2623 +#: commands/trigger.c:3389 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:337 executor/nodeModifyTable.c:1580 executor/nodeModifyTable.c:2420 executor/nodeModifyTable.c:2644 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:3397 executor/nodeModifyTable.c:1649 executor/nodeModifyTable.c:2490 executor/nodeModifyTable.c:2647 executor/nodeModifyTable.c:3052 +#: commands/trigger.c:3397 executor/nodeModifyTable.c:1670 executor/nodeModifyTable.c:2511 executor/nodeModifyTable.c:2668 executor/nodeModifyTable.c:3073 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "削除が同時に行われたためアクセスの直列化ができませんでした" @@ -11870,7 +11875,7 @@ msgstr "%s属性を持つロールのみがロールを作成できます。" msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "%s属性を持つロールのみが%s属性を持つロールを作成できます。" -#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16733 gram.y:16779 utils/adt/acl.c:5401 utils/adt/acl.c:5407 +#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16740 gram.y:16786 utils/adt/acl.c:5401 utils/adt/acl.c:5407 #, c-format msgid "role name \"%s\" is reserved" msgstr "ロール名\"%s\"は予約されています" @@ -12229,42 +12234,42 @@ msgstr "ONLY_DATABASE_STATSは他のVACUUMオプションと一緒に指定す msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%sはVACUUMやANALYZEからは実行できません" -#: commands/vacuum.c:733 +#: commands/vacuum.c:735 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "列%sのVACUUMを行う権限がありません、スキップします" -#: commands/vacuum.c:746 +#: commands/vacuum.c:748 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "列%sのANALYZEを行う権限がありません、スキップします" -#: commands/vacuum.c:824 commands/vacuum.c:921 +#: commands/vacuum.c:826 commands/vacuum.c:923 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\"のVACUUM処理をスキップしています -- ロックを獲得できませんでした" -#: commands/vacuum.c:829 +#: commands/vacuum.c:831 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "\"%s\"のVACUUM処理をスキップしています -- リレーションはすでに存在しません" -#: commands/vacuum.c:845 commands/vacuum.c:926 +#: commands/vacuum.c:847 commands/vacuum.c:928 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\"のANALYZEをスキップしています --- ロック獲得できませんでした" -#: commands/vacuum.c:850 +#: commands/vacuum.c:852 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\"のANALYZEをスキップします --- リレーションはすでに存在しません" -#: commands/vacuum.c:1161 +#: commands/vacuum.c:1163 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "タプルの削除およびフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1162 commands/vacuum.c:1167 +#: commands/vacuum.c:1164 commands/vacuum.c:1169 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12273,37 +12278,37 @@ msgstr "" "周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除が必要な場合もあります。" -#: commands/vacuum.c:1166 +#: commands/vacuum.c:1168 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "マルチトランザクションのフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1922 +#: commands/vacuum.c:1924 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "データベースの一部は20億トランザクション以上の間にVACUUMを実行されていませんでした" -#: commands/vacuum.c:1923 +#: commands/vacuum.c:1925 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "トランザクションの周回によるデータ損失が発生している可能性があります" -#: commands/vacuum.c:2092 +#: commands/vacuum.c:2094 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルではないものや、特別なシステムテーブルに対してはVACUUMを実行できません" -#: commands/vacuum.c:2517 +#: commands/vacuum.c:2519 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"をスキャンしました" -#: commands/vacuum.c:2536 +#: commands/vacuum.c:2538 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" -#: commands/vacuum.c:2540 +#: commands/vacuum.c:2542 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -12551,22 +12556,22 @@ msgstr "パラメータの型%d(%s)が実行計画(%s)を準備する時点と msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 executor/execExprInterp.c:4246 executor/execExprInterp.c:4263 executor/execExprInterp.c:4362 executor/nodeModifyTable.c:205 executor/nodeModifyTable.c:216 executor/nodeModifyTable.c:233 executor/nodeModifyTable.c:241 +#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 executor/execExprInterp.c:4246 executor/execExprInterp.c:4263 executor/execExprInterp.c:4362 executor/nodeModifyTable.c:206 executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:242 executor/nodeModifyTable.c:252 executor/nodeModifyTable.c:262 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:206 +#: executor/execExpr.c:638 executor/nodeModifyTable.c:207 #, c-format msgid "Query has too many columns." msgstr "問い合わせの列が多すぎます" -#: executor/execExpr.c:645 executor/nodeModifyTable.c:234 +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:651 executor/execExprInterp.c:4264 executor/nodeModifyTable.c:217 +#: executor/execExpr.c:651 executor/execExprInterp.c:4264 executor/nodeModifyTable.c:253 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" @@ -12909,7 +12914,7 @@ msgstr "同時更新がありました、リトライします" msgid "concurrent delete, retrying" msgstr "並行する削除がありました、リトライします" -#: executor/execReplication.c:311 parser/parse_cte.c:308 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3888 utils/adt/arrayfuncs.c:4443 utils/adt/arrayfuncs.c:6455 utils/adt/rowtypes.c:1230 +#: executor/execReplication.c:311 parser/parse_cte.c:309 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3888 utils/adt/arrayfuncs.c:4443 utils/adt/arrayfuncs.c:6455 utils/adt/rowtypes.c:1230 #, c-format msgid "could not identify an equality operator for type %s" msgstr "型%sの等価演算子を識別できませんでした" @@ -13137,63 +13142,68 @@ msgstr "RIGHT JOINはマージ結合可能な結合条件でのみサポート msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINはマージ結合可能な結合条件でのみサポートされています" -#: executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:243 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "問い合わせで %d 番目に生成列の値を指定しています。" + +#: executor/nodeModifyTable.c:263 #, c-format msgid "Query has too few columns." msgstr "問い合わせの列が少なすぎます。" -#: executor/nodeModifyTable.c:1542 executor/nodeModifyTable.c:1616 +#: executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "削除対象のタプルはすでに現在のコマンドによって引き起こされた操作によって変更されています" -#: executor/nodeModifyTable.c:1771 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "invalid ON UPDATE specification" msgstr "不正な ON UPDATE 指定です" -#: executor/nodeModifyTable.c:1772 +#: executor/nodeModifyTable.c:1793 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "結果タプルをもとのパーティションではなく異なるパーティションに追加しようとしました。" -#: executor/nodeModifyTable.c:2231 +#: executor/nodeModifyTable.c:2252 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "ソースパーティションのルート以外の上位パーティションが外部キーで直接参照されている場合はパーティション間でタプルを移動させることができません" -#: executor/nodeModifyTable.c:2232 +#: executor/nodeModifyTable.c:2253 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "外部キーがパーティションルートテーブル\"%2$s\"ではなくパーティション親テーブル\"%1$s\"を指しています。" -#: executor/nodeModifyTable.c:2235 +#: executor/nodeModifyTable.c:2256 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "テーブル\"%s\"上に外部キー制約を定義することを検討してください。" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2601 executor/nodeModifyTable.c:3040 executor/nodeModifyTable.c:3179 +#: executor/nodeModifyTable.c:2622 executor/nodeModifyTable.c:3061 executor/nodeModifyTable.c:3200 #, c-format msgid "%s command cannot affect row a second time" msgstr "%sコマンドは単一の行に2度は適用できません" -#: executor/nodeModifyTable.c:2603 +#: executor/nodeModifyTable.c:2624 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "同じコマンドでの挿入候補の行が同じ制約値を持つことがないようにしてください" -#: executor/nodeModifyTable.c:3033 executor/nodeModifyTable.c:3172 +#: executor/nodeModifyTable.c:3054 executor/nodeModifyTable.c:3193 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "更新または削除対象のタプルは、現在のコマンドによって発火した操作トリガーによってすでに更新されています" -#: executor/nodeModifyTable.c:3042 executor/nodeModifyTable.c:3181 +#: executor/nodeModifyTable.c:3063 executor/nodeModifyTable.c:3202 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" -#: executor/nodeModifyTable.c:3131 +#: executor/nodeModifyTable.c:3152 #, c-format msgid "tuple to be deleted was already moved to another partition due to concurrent update" msgstr "削除対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" @@ -13564,189 +13574,194 @@ msgstr "列\"%s\"でNULL / NOT NULL宣言が衝突しているか重複してい msgid "unrecognized column option \"%s\"" msgstr "認識できない列オプション \"%s\"" -#: gram.y:14109 +#: gram.y:13888 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "オプション名 \"%s\" は XMLTABLE の中では使用できません" + +#: gram.y:14116 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "浮動小数点数の型の精度は最低でも1ビット必要です" -#: gram.y:14118 +#: gram.y:14125 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "浮動小数点型の精度は54ビットより低くなければなりません" -#: gram.y:14621 +#: gram.y:14628 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS式の左辺のパラメータ数が間違っています" -#: gram.y:14626 +#: gram.y:14633 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS式の右辺のパラメータ数が間違っています" -#: gram.y:14803 +#: gram.y:14810 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 述部はまだ実装されていません" -#: gram.y:15219 +#: gram.y:15226 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "複数のORDER BY句はWITHIN GROUPと一緒には使用できません" -#: gram.y:15224 +#: gram.y:15231 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT は WITHIN GROUP と同時には使えません" -#: gram.y:15229 +#: gram.y:15236 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC は WITHIN GROUP と同時には使えません" -#: gram.y:15863 gram.y:15887 +#: gram.y:15870 gram.y:15894 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "フレームの開始は UNBOUNDED FOLLOWING であってはなりません" -#: gram.y:15868 +#: gram.y:15875 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "次の行から始まるフレームは、現在行では終了できません" -#: gram.y:15892 +#: gram.y:15899 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "フレームの終了は UNBOUNDED PRECEDING であってはなりません" -#: gram.y:15898 +#: gram.y:15905 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "現在行から始まるフレームは、先行する行を含むことができません" -#: gram.y:15905 +#: gram.y:15912 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "次の行から始まるフレームは、先行する行を含むことができません" -#: gram.y:16666 +#: gram.y:16673 #, c-format msgid "type modifier cannot have parameter name" msgstr "型修正子はパラメータ名を持つことはできません" -#: gram.y:16672 +#: gram.y:16679 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "型修正子はORDER BYを持つことはできません" -#: gram.y:16740 gram.y:16747 gram.y:16754 +#: gram.y:16747 gram.y:16754 gram.y:16761 #, c-format msgid "%s cannot be used as a role name here" msgstr "%sはここではロール名として使用できません" -#: gram.y:16844 gram.y:18301 +#: gram.y:16851 gram.y:18308 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIESはORDER BY句なしでは指定できません" -#: gram.y:17980 gram.y:18167 +#: gram.y:17987 gram.y:18174 msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:18130 gram.y:18147 tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 +#: gram.y:18137 gram.y:18154 tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 #, c-format msgid "syntax error" msgstr "構文エラー" -#: gram.y:18231 +#: gram.y:18238 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "VARIADIC直接引数を使った順序集合集約は同じデータタイプのVARIADIC集約引数を一つ持つ必要があります" -#: gram.y:18268 +#: gram.y:18275 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "複数のORDER BY句は使用できません" -#: gram.y:18279 +#: gram.y:18286 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "複数のOFFSET句は使用できません" -#: gram.y:18288 +#: gram.y:18295 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "複数のLIMIT句は使用できません" -#: gram.y:18297 +#: gram.y:18304 #, c-format msgid "multiple limit options not allowed" msgstr "複数のLIMITオプションは使用できません" -#: gram.y:18324 +#: gram.y:18331 #, c-format msgid "multiple WITH clauses not allowed" msgstr "複数の WITH 句は使用できません" -#: gram.y:18517 +#: gram.y:18524 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "テーブル関数では OUT と INOUT 引数は使用できません" -#: gram.y:18650 +#: gram.y:18657 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "複数の COLLATE 句は使用できません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18688 gram.y:18701 +#: gram.y:18695 gram.y:18708 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s制約は遅延可能にはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18714 +#: gram.y:18721 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s制約をNOT VALIDとマークすることはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18727 +#: gram.y:18734 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s制約をNO INHERITをマークすることはできません" -#: gram.y:18749 +#: gram.y:18756 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "識別できないパーティションストラテジ \"%s\"" -#: gram.y:18773 +#: gram.y:18780 #, c-format msgid "invalid publication object list" msgstr "不正なパブリケーションオブジェクトリスト" -#: gram.y:18774 +#: gram.y:18781 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "テーブル名やスキーマ名を単独記述の前にTABLEまたはTABLES IN SCHEMAのいずれかを指定する必要があります。" -#: gram.y:18790 +#: gram.y:18797 #, c-format msgid "invalid table name" msgstr "不正なテーブル名" -#: gram.y:18811 +#: gram.y:18818 #, c-format msgid "WHERE clause not allowed for schema" msgstr "WHERE句はスキーマに対しては使用できません" -#: gram.y:18818 +#: gram.y:18825 #, c-format msgid "column specification not allowed for schema" msgstr "列指定はスキーマに対しては使用できません" -#: gram.y:18832 +#: gram.y:18839 #, c-format msgid "invalid schema name" msgstr "不正なスキーマ名" @@ -14210,7 +14225,7 @@ msgstr "\"db_user_namespace\"が有効の場合、MD5 認証はサポートさ msgid "could not generate random MD5 salt" msgstr "ランダムなMD5ソルトの生成に失敗しました" -#: libpq/auth.c:934 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:934 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "環境を設定できません: %m" @@ -14671,44 +14686,39 @@ msgstr "秘密鍵ファイル\"%s\"はグループまたは全員からアクセ msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "ファイルはデータベースユーザーの所有の場合は u=rw (0600) かそれよりも低いパーミッション、root所有の場合は u=rw,g=r (0640) かそれよりも低いパーミッションである必要があります" -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI名ラップエラー" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "送出されるGSSAPIメッセージに機密性が適用されません" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "サーバーは過大なサイズのGSSAPIパケットを送信しようとしました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPIアンラップエラー" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "到着したGSSAPIメッセージには機密性が適用されていません" -#: libpq/be-secure-gssapi.c:575 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %d)" - -#: libpq/be-secure-gssapi.c:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "GSSAPIセキュリティコンテキストを受け入れられませんでした" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPIサイズチェックエラー" @@ -15836,37 +15846,37 @@ msgstr "外部結合のNULL可な側では%sを適用できません" msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "UNION/INTERSECT/EXCEPTでは%sを使用できません" -#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4036 +#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4079 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY を実行できませんでした" -#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4037 optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4080 optimizer/plan/planner.c:4720 optimizer/prep/prepunion.c:1052 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "一部のデータ型がハッシュのみをサポートする一方で、別の型はソートのみをサポートしています。" -#: optimizer/plan/planner.c:4676 +#: optimizer/plan/planner.c:4719 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行できませんでした" -#: optimizer/plan/planner.c:6015 +#: optimizer/plan/planner.c:6058 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウの PARTITION BY を実行できませんでした" -#: optimizer/plan/planner.c:6016 +#: optimizer/plan/planner.c:6059 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割に使用する列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/planner.c:6020 +#: optimizer/plan/planner.c:6063 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウの ORDER BY を実行できませんでした" -#: optimizer/plan/planner.c:6021 +#: optimizer/plan/planner.c:6064 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウの順序付けをする列は、ソート可能なデータ型でなければなりません。" @@ -16914,152 +16924,152 @@ msgstr "問い合わせ\"%s\"への再帰的参照が、INTERSECT内に現れて msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "問い合わせ\"%s\"への再帰的参照が、EXCEPT内で現れてはなりません" -#: parser/parse_cte.c:133 +#: parser/parse_cte.c:134 #, c-format msgid "MERGE not supported in WITH query" msgstr "MERGEはWITH問い合わせではサポートされません" -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:144 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH 問い合わせ名\"%s\"が複数回指定されました" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:315 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "型%sの不等演算子を特定できませんでした" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:342 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "データを変更するようなステートメントを含む WITH 句はトップレベルでなければなりません" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:391 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "再帰問い合わせ\"%s\"の列%dの型は、非再帰項の内では%sになっていますが全体としては%sです" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:397 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "非再帰項の出力を正しい型に変換してください。" -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:402 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "再帰問い合わせ\"%s\"の列%dの照合順序は、非再帰項では\"%s\"ですが全体としては\"%s\"です" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:406 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "COLLATE句を使って非再帰項の照合順序を設定してください。" -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:427 #, c-format msgid "WITH query is not recursive" msgstr "WITH問い合わせは再帰的ではありません" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:458 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの左辺はSELECTでなければなりません" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:463 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの右辺はSELECTでなければなりません" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "検索カラム\\\"%s\\\"はWITH問い合わせの列リストの中にありません" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:485 #, c-format msgid "search column \"%s\" specified more than once" msgstr "検索列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:494 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "検索順序列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "循環列\"%s\"がWITH問い合わせの列リストに存在しません" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:518 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "循環列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:527 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "循環識別列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:534 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "循環経路列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:542 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "循環識別列と循環経路列の名前が同一です" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "検索順序列と循環識別列の名前が同一です" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:559 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "検索順序列と循環経路列の名前が同一です" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:643 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH問い合わせ\"%s\"には%d列しかありませんが、%d列指定されています" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:888 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH項目間の再帰は実装されていません" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:940 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "再帰問い合わせ\"%s\"はデータを更新するス文を含んでいてはなりません" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:948 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "再帰問い合わせ\"%s\"が、<非再帰項> UNION [ALL] <再帰項> の形式になっていません" -#: parser/parse_cte.c:917 +#: parser/parse_cte.c:983 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "再帰問い合わせ内の ORDER BY は実装されていません" -#: parser/parse_cte.c:923 +#: parser/parse_cte.c:989 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "再帰問い合わせ内の OFFSET は実装されていません" -#: parser/parse_cte.c:929 +#: parser/parse_cte.c:995 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "再帰問い合わせ内の LIMIT は実装されていません" -#: parser/parse_cte.c:935 +#: parser/parse_cte.c:1001 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "再帰問い合わせ内の FOR UPDATE/SHARE は実装されていません" -#: parser/parse_cte.c:1014 +#: parser/parse_cte.c:1080 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "問い合わせ\"%s\"への再帰参照が2回以上現れてはなりません" @@ -18680,32 +18690,32 @@ msgstr "自動VACUUMワーカーの起動に時間がかかりすぎています msgid "could not fork autovacuum worker process: %m" msgstr "自動VACUUMワーカープロセスをforkできませんでした: %m" -#: postmaster/autovacuum.c:2355 +#: postmaster/autovacuum.c:2370 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立した一時テーブル\"%s.%s.%s\"を削除します" -#: postmaster/autovacuum.c:2591 +#: postmaster/autovacuum.c:2613 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動VACUUM" -#: postmaster/autovacuum.c:2594 +#: postmaster/autovacuum.c:2616 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE" -#: postmaster/autovacuum.c:2788 +#: postmaster/autovacuum.c:2812 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"の作業エントリを処理しています" -#: postmaster/autovacuum.c:3402 +#: postmaster/autovacuum.c:3439 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定のため自動VACUUMが起動できません" -#: postmaster/autovacuum.c:3403 +#: postmaster/autovacuum.c:3440 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効にしてください。" @@ -19942,57 +19952,57 @@ msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "エクスポートされた論理デコードスナップショット: \"%s\" (%u個のトランザクションID を含む)" -#: replication/logical/snapbuild.c:1392 replication/logical/snapbuild.c:1489 replication/logical/snapbuild.c:2005 +#: replication/logical/snapbuild.c:1431 replication/logical/snapbuild.c:1528 replication/logical/snapbuild.c:2044 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "論理デコードは一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1394 +#: replication/logical/snapbuild.c:1433 #, c-format msgid "There are no running transactions." msgstr "実行中のトランザクションはありません。" -#: replication/logical/snapbuild.c:1441 +#: replication/logical/snapbuild.c:1480 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "論理デコードは初期開始点を%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1443 replication/logical/snapbuild.c:1467 +#: replication/logical/snapbuild.c:1482 replication/logical/snapbuild.c:1506 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "%2$uより古いトランザクション(おおよそ%1$d個)の完了を待っています" -#: replication/logical/snapbuild.c:1465 +#: replication/logical/snapbuild.c:1504 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "論理デコードは初期の一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1491 +#: replication/logical/snapbuild.c:1530 #, c-format msgid "There are no old transactions anymore." msgstr "古いトランザクションはこれ以上はありません" -#: replication/logical/snapbuild.c:1892 +#: replication/logical/snapbuild.c:1931 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "スナップショット構築状態ファイル\"%1$s\"のマジックナンバーが不正です: %3$uのはずが%2$uでした" -#: replication/logical/snapbuild.c:1898 +#: replication/logical/snapbuild.c:1937 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "スナップショット状態ファイル\"%1$s\"のバージョン%2$uはサポート外です: %3$uのはずが%2$uでした" -#: replication/logical/snapbuild.c:1939 +#: replication/logical/snapbuild.c:1978 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "スナップショット生成状態ファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/logical/snapbuild.c:2007 +#: replication/logical/snapbuild.c:2046 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "論理デコードは保存されたスナップショットを使って開始します。" -#: replication/logical/snapbuild.c:2114 +#: replication/logical/snapbuild.c:2153 #, c-format msgid "could not parse file name \"%s\"" msgstr "ファイル名\"%s\"をパースできませんでした" @@ -20042,7 +20052,7 @@ msgstr "テーブルコピー中に発行サーバー上でのトランザクシ msgid "replication origin \"%s\" already exists" msgstr "レプリケーション基点\"%s\"はすでに存在します" -#: replication/logical/tablesync.c:1493 replication/logical/worker.c:2374 +#: replication/logical/tablesync.c:1493 replication/logical/worker.c:2376 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "ユーザー\"%s\"は行レベルセキュリティが有効なリレーションへのレプリケーションはできません: \"%s\"" @@ -20052,147 +20062,147 @@ msgstr "ユーザー\"%s\"は行レベルセキュリティが有効なリレー msgid "table copy could not finish transaction on publisher: %s" msgstr "テーブルコピー中に発行サーバー上でのトランザクション終了に失敗しました: %s" -#: replication/logical/worker.c:499 +#: replication/logical/worker.c:501 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:501 +#: replication/logical/worker.c:503 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "すべてのテーブルの同期が完了するまでは、ストリームされたトランザクションを適用ワーカーで扱うことはできません。" -#: replication/logical/worker.c:863 replication/logical/worker.c:978 +#: replication/logical/worker.c:865 replication/logical/worker.c:980 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "論理レプリケーション列%dのバイナリデータ書式が不正です" -#: replication/logical/worker.c:2513 +#: replication/logical/worker.c:2515 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は複製の識別列を期待していましたが、発行サーバーは送信しませんでした" -#: replication/logical/worker.c:2520 +#: replication/logical/worker.c:2522 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "論理レプリケーション先のリレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつ発行されたリレーションがREPLICA IDENTITY FULLとなっていません" -#: replication/logical/worker.c:3384 +#: replication/logical/worker.c:3386 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "不正な論理レプリケーションのメッセージタイプ \"??? (%d)\"" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3558 #, c-format msgid "data stream from publisher has ended" msgstr "発行サーバーからのデータストリームが終了しました" -#: replication/logical/worker.c:3713 +#: replication/logical/worker.c:3715 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトにより論理レプリケーションワーカーを終了しています" -#: replication/logical/worker.c:3907 +#: replication/logical/worker.c:3909 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:3920 +#: replication/logical/worker.c:3922 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:3951 +#: replication/logical/worker.c:3953 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:3955 +#: replication/logical/worker.c:3957 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:4489 +#: replication/logical/worker.c:4499 #, c-format msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "サブスクリプション%uが起動中に削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーは起動しません" -#: replication/logical/worker.c:4504 +#: replication/logical/worker.c:4514 #, c-format msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "サブスクリプション\"%s\"が起動中に無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーは起動しません" -#: replication/logical/worker.c:4521 +#: replication/logical/worker.c:4531 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカーが起動しました" -#: replication/logical/worker.c:4526 +#: replication/logical/worker.c:4536 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが起動しました" -#: replication/logical/worker.c:4614 +#: replication/logical/worker.c:4624 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/logical/worker.c:4781 +#: replication/logical/worker.c:4807 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "サブスクリプション\"%s\"はエラーのため無効化されました" -#: replication/logical/worker.c:4829 +#: replication/logical/worker.c:4855 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xででトランザクションのスキップを開始します" -#: replication/logical/worker.c:4843 +#: replication/logical/worker.c:4869 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xでトランザクションのスキップを完了しました" -#: replication/logical/worker.c:4925 +#: replication/logical/worker.c:4957 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "サブスクリプションの\"%s\"スキップLSNをクリアしました" -#: replication/logical/worker.c:4926 +#: replication/logical/worker.c:4958 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "リモートトランザクションの完了WAL位置(LSN) %X/%XがスキップLSN %X/%X と一致しません。" -#: replication/logical/worker.c:4963 +#: replication/logical/worker.c:4986 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "メッセージタイプ \"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:4967 +#: replication/logical/worker.c:4990 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "トランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:4972 +#: replication/logical/worker.c:4995 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "%4$X/%5$Xで終了したトランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:4983 +#: replication/logical/worker.c:5006 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"のリモートデータ処理中、トランザクション%5$uのレプリケーション対象リレーション\"%3$s.%4$s\"に対するメッセージタイプ\"%2$s\"内" -#: replication/logical/worker.c:4990 +#: replication/logical/worker.c:5013 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "%6$X/%7$Xで終了したトランザクション%5$u中、レプリケーション先リレーション\"%3$s.%4$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5001 +#: replication/logical/worker.c:5024 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"のリモートデータ処理中、トランザクション%6$uのレプリケーション対象リレーション\"%3$s.%4$s\"、列\"%5$s\"に対するメッセージタイプ\"%2$s\"内" -#: replication/logical/worker.c:5009 +#: replication/logical/worker.c:5032 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "%7$X/%8$Xで終了したトランザクション%6$u中、レプリケーション先リレーション\"%3$s.%4$s\"、列\"%5$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" @@ -20472,38 +20482,38 @@ msgstr "レプリケーションスロット\"%s\"はコピーできません" msgid "The source replication slot was invalidated during the copy operation." msgstr "コピー元のレプリケーションスロットがコピー処理中に無効化されました。" -#: replication/syncrep.c:262 +#: replication/syncrep.c:305 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "管理者コマンドにより同期レプリケーションの待ち状態をキャンセルし、接続を終了しています" -#: replication/syncrep.c:263 replication/syncrep.c:280 +#: replication/syncrep.c:306 replication/syncrep.c:323 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "トランザクションはローカルではすでにコミット済みですが、スタンバイ側にはレプリケーションされていない可能性があります。" -#: replication/syncrep.c:279 +#: replication/syncrep.c:322 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ユーザーからの要求により同期レプリケーションの待ち状態をキャンセルしています" # y, c-format -#: replication/syncrep.c:486 +#: replication/syncrep.c:529 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "スタンバイ\"%s\"は優先度%uの同期スタンバイになりました" -#: replication/syncrep.c:490 +#: replication/syncrep.c:533 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "スタンバイ\"%s\"は定足数同期スタンバイの候補になりました" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1086 #, c-format msgid "synchronous_standby_names parser failed" msgstr "synchronous_standby_names の読み取りに失敗しました" -#: replication/syncrep.c:1025 +#: replication/syncrep.c:1092 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "同期スタンバイの数(%d)は1以上である必要があります" @@ -20583,123 +20593,123 @@ msgstr "プライマリサーバーからライムライン%u用のタイムラ msgid "could not write to WAL segment %s at offset %u, length %lu: %m" msgstr "WALファイルセグメント%sのオフセット%u、長さ%luの書き込みが失敗しました: %m" -#: replication/walsender.c:519 +#: replication/walsender.c:522 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "%sは論理レプリケーションスロットでは使用できません" -#: replication/walsender.c:623 storage/smgr/md.c:1541 +#: replication/walsender.c:626 storage/smgr/md.c:1541 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "ファイル\"%s\"の終端へシークできませんでした: %m" -#: replication/walsender.c:627 +#: replication/walsender.c:630 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "ファイル\"%s\"の先頭にシークできませんでした: %m" -#: replication/walsender.c:704 +#: replication/walsender.c:707 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "論理レプリケーションスロットは物理レプリケーションには使用できません" -#: replication/walsender.c:770 +#: replication/walsender.c:773 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "タイムライン%3$u上の要求された開始ポイント%1$X/%2$Xはサーバーの履歴にありません" -#: replication/walsender.c:773 +#: replication/walsender.c:776 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "サーバーの履歴はタイムライン%uの%X/%Xからフォークしました。" -#: replication/walsender.c:817 +#: replication/walsender.c:820 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "要求された開始ポイント%X/%XはサーバーのWALフラッシュ位置%X/%Xより進んでいます" -#: replication/walsender.c:1010 +#: replication/walsender.c:1013 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "CREATE_REPLICATION_SLOTのオプション\"%s\"に対する認識できない値: \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1095 +#: replication/walsender.c:1098 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sはトランザクション内では呼び出せません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1105 +#: replication/walsender.c:1108 #, c-format msgid "%s must be called inside a transaction" msgstr "%sはトランザクション内で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1114 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s は REPEATABLE READ 分離レベルのトランザクションで呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1119 #, c-format msgid "%s must be called in a read-only transaction" msgstr "%sは読み取り専用トランザクションの中で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1125 #, c-format msgid "%s must be called before any query" msgstr "%s は問い合わせの実行前に呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1131 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1275 +#: replication/walsender.c:1278 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:1696 +#: replication/walsender.c:1710 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WAL送信プロセスが停止モードの間は新しいコマンドを実行できません" -#: replication/walsender.c:1731 +#: replication/walsender.c:1745 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" -#: replication/walsender.c:1764 +#: replication/walsender.c:1778 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1142 tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2238 tcop/postgres.c:2676 tcop/postgres.c:2754 +#: replication/walsender.c:1786 tcop/fastpath.c:209 tcop/postgres.c:1142 tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2238 tcop/postgres.c:2676 tcop/postgres.c:2754 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:1914 replication/walsender.c:1949 +#: replication/walsender.c:1928 replication/walsender.c:1963 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:1937 +#: replication/walsender.c:1951 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:2026 +#: replication/walsender.c:2040 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2439 +#: replication/walsender.c:2453 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" @@ -21583,7 +21593,7 @@ msgstr "共有メモリキュー経由で大きさ%zuのメッセージは送信 msgid "invalid message size %zu in shared memory queue" msgstr "共有メモリキュー内の不正なメッセージ長%zu" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:997 storage/lmgr/lock.c:1035 storage/lmgr/lock.c:2830 storage/lmgr/lock.c:4215 storage/lmgr/lock.c:4280 storage/lmgr/lock.c:4630 storage/lmgr/predicate.c:2417 storage/lmgr/predicate.c:2432 storage/lmgr/predicate.c:3829 storage/lmgr/predicate.c:4876 utils/hash/dynahash.c:1107 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:997 storage/lmgr/lock.c:1035 storage/lmgr/lock.c:2830 storage/lmgr/lock.c:4215 storage/lmgr/lock.c:4280 storage/lmgr/lock.c:4630 storage/lmgr/predicate.c:2417 storage/lmgr/predicate.c:2432 storage/lmgr/predicate.c:3829 storage/lmgr/predicate.c:4876 utils/hash/dynahash.c:1108 #, c-format msgid "out of shared memory" msgstr "共有メモリが足りません" @@ -21762,107 +21772,107 @@ msgstr "デッドロックを検出しました" msgid "See server log for query details." msgstr "問い合わせの詳細はサーバーログを参照してください" -#: storage/lmgr/lmgr.c:853 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の更新中" -#: storage/lmgr/lmgr.c:856 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の削除中" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)のロック中" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプルの更新後バージョン(%1$u,%2$u)のロック中" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のインデックスタプル(%1$u,%2$u)の挿入中" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の一意性の確認中" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"の更新されたタプル(%1$u,%2$u)の再チェック中" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)に対する排除制約のチェック中" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1212 #, c-format msgid "relation %u of database %u" msgstr "データベース%2$uのリレーション%1$u" -#: storage/lmgr/lmgr.c:1212 +#: storage/lmgr/lmgr.c:1218 #, c-format msgid "extension of relation %u of database %u" msgstr "データベース%2$uのリレーション%1$uの拡張" -#: storage/lmgr/lmgr.c:1218 +#: storage/lmgr/lmgr.c:1224 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "データベース%uのpg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1229 #, c-format msgid "page %u of relation %u of database %u" msgstr "データベース%3$uのリレーション%2$uのページ%1$u" -#: storage/lmgr/lmgr.c:1230 +#: storage/lmgr/lmgr.c:1236 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "データベース%4$uのリレーション%3$uのタプル(%2$u,%1$u)" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1244 #, c-format msgid "transaction %u" msgstr "トランザクション %u" -#: storage/lmgr/lmgr.c:1243 +#: storage/lmgr/lmgr.c:1249 #, c-format msgid "virtual transaction %d/%u" msgstr "仮想トランザクション %d/%u" -#: storage/lmgr/lmgr.c:1249 +#: storage/lmgr/lmgr.c:1255 #, c-format msgid "speculative token %u of transaction %u" msgstr "トランザクション%2$uの投機的書き込みトークン%1$u" -#: storage/lmgr/lmgr.c:1255 +#: storage/lmgr/lmgr.c:1261 #, c-format msgid "object %u of class %u of database %u" msgstr "データベース%3$uのリレーション%2$uのオブジェクト%1$u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, c-format msgid "user lock [%u,%u,%u]" msgstr "ユーザーロック[%u,%u,%u]" -#: storage/lmgr/lmgr.c:1270 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "アドバイザリ・ロック[%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1278 +#: storage/lmgr/lmgr.c:1284 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "データベース%3$uのサブスクリプション%2$uのリモートトランザクション%1$u" -#: storage/lmgr/lmgr.c:1285 +#: storage/lmgr/lmgr.c:1291 #, c-format msgid "unrecognized locktag type %d" msgstr "ロックタグタイプ%dは不明です" @@ -22709,37 +22719,37 @@ msgstr "MaxFragments は 0 以上でなければなりません" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "永続統計情報ファイル\"%s\"をunlinkできませんでした: %m" -#: utils/activity/pgstat.c:1258 +#: utils/activity/pgstat.c:1257 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "不正な統計情報種別: \"%s\"" -#: utils/activity/pgstat.c:1338 +#: utils/activity/pgstat.c:1337 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1458 +#: utils/activity/pgstat.c:1457 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" -#: utils/activity/pgstat.c:1467 +#: utils/activity/pgstat.c:1466 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" -#: utils/activity/pgstat.c:1475 +#: utils/activity/pgstat.c:1474 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: utils/activity/pgstat.c:1524 +#: utils/activity/pgstat.c:1523 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1686 +#: utils/activity/pgstat.c:1685 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "統計情報ファイル\"%s\"が破損しています" @@ -23225,7 +23235,7 @@ msgstr "TIME(%d)%sの位取りを許容最大値%dまで減らしました" msgid "date out of range: \"%s\"" msgstr "日付が範囲外です: \"%s\"" -#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2533 +#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2546 #, c-format msgid "date out of range" msgstr "日付が範囲外です" @@ -23263,7 +23273,7 @@ msgstr "単位\"%s\"は型%sに対しては認識できません" #: utils/adt/date.c:1313 utils/adt/date.c:1359 utils/adt/date.c:1918 utils/adt/date.c:1949 utils/adt/date.c:1978 utils/adt/date.c:2848 utils/adt/date.c:3080 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 utils/adt/json.c:506 utils/adt/timestamp.c:232 utils/adt/timestamp.c:264 utils/adt/timestamp.c:700 utils/adt/timestamp.c:709 #: utils/adt/timestamp.c:787 utils/adt/timestamp.c:820 utils/adt/timestamp.c:2933 utils/adt/timestamp.c:2938 utils/adt/timestamp.c:2957 utils/adt/timestamp.c:2970 utils/adt/timestamp.c:2981 utils/adt/timestamp.c:2987 utils/adt/timestamp.c:2993 utils/adt/timestamp.c:2998 utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3064 utils/adt/timestamp.c:3085 utils/adt/timestamp.c:3098 utils/adt/timestamp.c:3112 utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3126 #: utils/adt/timestamp.c:3131 utils/adt/timestamp.c:3859 utils/adt/timestamp.c:3983 utils/adt/timestamp.c:4054 utils/adt/timestamp.c:4090 utils/adt/timestamp.c:4180 utils/adt/timestamp.c:4254 utils/adt/timestamp.c:4290 utils/adt/timestamp.c:4393 utils/adt/timestamp.c:4842 utils/adt/timestamp.c:5116 utils/adt/timestamp.c:5555 utils/adt/timestamp.c:5565 utils/adt/timestamp.c:5570 utils/adt/timestamp.c:5576 utils/adt/timestamp.c:5609 utils/adt/timestamp.c:5696 -#: utils/adt/timestamp.c:5737 utils/adt/timestamp.c:5741 utils/adt/timestamp.c:5795 utils/adt/timestamp.c:5799 utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2555 utils/adt/xml.c:2562 utils/adt/xml.c:2582 utils/adt/xml.c:2589 +#: utils/adt/timestamp.c:5737 utils/adt/timestamp.c:5741 utils/adt/timestamp.c:5795 utils/adt/timestamp.c:5799 utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2568 utils/adt/xml.c:2575 utils/adt/xml.c:2595 utils/adt/xml.c:2602 #, c-format msgid "timestamp out of range" msgstr "timestampの範囲外です" @@ -24382,12 +24392,12 @@ msgstr "非決定的照合順序はILIKEではサポートされません" msgid "LIKE pattern must not end with escape character" msgstr "LIKE パターンはエスケープ文字で終わってはなりません" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "不正なエスケープ文字列" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "エスケープ文字は空か1文字でなければなりません。" @@ -24979,7 +24989,7 @@ msgstr "カンマが多すぎます" msgid "Junk after right parenthesis or bracket." msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:2023 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "正規表現が失敗しました: %s" @@ -24994,28 +25004,28 @@ msgstr "不正な正規表現オプション: \"%.*s\"" msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "regexp_replace()でパラメータstartを指定したいのであれば、4番目のパラメータを明示的に整数にキャストしてください。" -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1109 utils/adt/regexp.c:1173 utils/adt/regexp.c:1182 utils/adt/regexp.c:1191 utils/adt/regexp.c:1200 utils/adt/regexp.c:1880 utils/adt/regexp.c:1889 utils/adt/regexp.c:1898 utils/misc/guc.c:6668 utils/misc/guc.c:6702 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "パラメータ\"%s\"の値が無効です: %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:940 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQL正規表現はエスケープされたダブルクオートを2つより多く含むことはできません" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1120 utils/adt/regexp.c:1211 utils/adt/regexp.c:1298 utils/adt/regexp.c:1337 utils/adt/regexp.c:1725 utils/adt/regexp.c:1780 utils/adt/regexp.c:1909 #, c-format msgid "%s does not support the \"global\" option" msgstr "%sは\"global\"オプションをサポートしません" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1339 #, c-format msgid "Use the regexp_matches function instead." msgstr "代わりにregexp_matchesを使ってください。" -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1527 #, c-format msgid "too many regular expression matches" msgstr "正規表現のマッチが多過ぎます" @@ -25030,7 +25040,7 @@ msgstr "\"%s\"という名前の関数が複数あります" msgid "more than one operator named %s" msgstr "%sという名前の演算子が複数あります" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10110 utils/adt/ruleutils.c:10323 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10120 utils/adt/ruleutils.c:10333 #, c-format msgid "too many arguments" msgstr "引数が多すぎます" @@ -25696,136 +25706,136 @@ msgstr "無効なXMLコメント" msgid "not an XML document" msgstr "XML文書ではありません" -#: utils/adt/xml.c:987 utils/adt/xml.c:1010 +#: utils/adt/xml.c:994 utils/adt/xml.c:1017 #, c-format msgid "invalid XML processing instruction" msgstr "無効なXML処理命令です" -#: utils/adt/xml.c:988 +#: utils/adt/xml.c:995 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML処理命令の対象名を\"%s\"とすることができませんでした。" -#: utils/adt/xml.c:1011 +#: utils/adt/xml.c:1018 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML処理命令には\"?>\"を含めることはできません。" -#: utils/adt/xml.c:1090 +#: utils/adt/xml.c:1097 #, c-format msgid "xmlvalidate is not implemented" msgstr "XML の妥当性検査は実装されていません" -#: utils/adt/xml.c:1146 +#: utils/adt/xml.c:1153 #, c-format msgid "could not initialize XML library" msgstr "XMLライブラリを初期化できませんでした" -#: utils/adt/xml.c:1147 +#: utils/adt/xml.c:1154 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2が互換性がない文字型を持ちます: sizeof(char)=%zu、sizeof(xmlChar)=%zu" -#: utils/adt/xml.c:1233 +#: utils/adt/xml.c:1240 #, c-format msgid "could not set up XML error handler" msgstr "XMLエラーハンドラを設定できませんでした" -#: utils/adt/xml.c:1234 +#: utils/adt/xml.c:1241 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "これはおそらく使用するlibxml2のバージョンがPostgreSQLを構築する時に使用したlibxml2ヘッダと互換性がないことを示します。" -#: utils/adt/xml.c:2262 +#: utils/adt/xml.c:2275 msgid "Invalid character value." msgstr "文字の値が有効ではありません" -#: utils/adt/xml.c:2265 +#: utils/adt/xml.c:2278 msgid "Space required." msgstr "スペースをあけてください。" -#: utils/adt/xml.c:2268 +#: utils/adt/xml.c:2281 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone には 'yes' か 'no' だけが有効です。" -#: utils/adt/xml.c:2271 +#: utils/adt/xml.c:2284 msgid "Malformed declaration: missing version." msgstr "不正な形式の宣言: バージョンがありません。" -#: utils/adt/xml.c:2274 +#: utils/adt/xml.c:2287 msgid "Missing encoding in text declaration." msgstr "テキスト宣言にエンコーディングの指定がありません。" -#: utils/adt/xml.c:2277 +#: utils/adt/xml.c:2290 msgid "Parsing XML declaration: '?>' expected." msgstr "XML 宣言のパース中: '>?' が必要です。" -#: utils/adt/xml.c:2280 +#: utils/adt/xml.c:2293 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "認識できないlibxml のエラーコード: %d" -#: utils/adt/xml.c:2534 +#: utils/adt/xml.c:2547 #, c-format msgid "XML does not support infinite date values." msgstr "XMLはデータ値として無限をサポートしません。" -#: utils/adt/xml.c:2556 utils/adt/xml.c:2583 +#: utils/adt/xml.c:2569 utils/adt/xml.c:2596 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XMLタイムスタンプ値としては無限をサポートしません。" -#: utils/adt/xml.c:2999 +#: utils/adt/xml.c:3012 #, c-format msgid "invalid query" msgstr "不正な無効な問い合わせ" -#: utils/adt/xml.c:3091 +#: utils/adt/xml.c:3104 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "ポータル\"%s\"はタプルを返却しません" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4356 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML名前空間マッピングに対する不正な配列" -#: utils/adt/xml.c:4344 +#: utils/adt/xml.c:4357 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "この配列は第2軸の長さが2である2次元配列でなければなりません。" -#: utils/adt/xml.c:4368 +#: utils/adt/xml.c:4381 #, c-format msgid "empty XPath expression" msgstr "空のXPath式" -#: utils/adt/xml.c:4420 +#: utils/adt/xml.c:4433 #, c-format msgid "neither namespace name nor URI may be null" msgstr "名前空間名もURIもnullにはできません" -#: utils/adt/xml.c:4427 +#: utils/adt/xml.c:4440 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"という名前のXML名前空間およびURI\"%s\"を登録できませんでした" -#: utils/adt/xml.c:4776 +#: utils/adt/xml.c:4789 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルト名前空間は実装されていません" -#: utils/adt/xml.c:4805 +#: utils/adt/xml.c:4818 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタは空文字列であってはなりません" -#: utils/adt/xml.c:4839 +#: utils/adt/xml.c:4852 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列であってはなりません" -#: utils/adt/xml.c:4986 +#: utils/adt/xml.c:4999 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPath式が2つ以上の値を返却しました" @@ -26561,7 +26571,7 @@ msgstr "bind_textdomain_codesetが失敗しました" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "符号化方式\"%s\"に対する不正なバイト列です: %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1766 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "符号化方式\"%2$s\"においてバイト列%1$sである文字は符号化方式\"%3$s\"で等価な文字を持ちません" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index 96d1c832c8a..ab327d0f150 100644 --- a/src/backend/po/ru.po +++ b/src/backend/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" -"PO-Revision-Date: 2025-05-03 16:34+0300\n" +"POT-Creation-Date: 2025-08-09 07:12+0300\n" +"PO-Revision-Date: 2025-08-09 07:31+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -90,13 +90,13 @@ msgstr "не удалось открыть файл \"%s\" для чтения: #: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1347 access/transam/xlog.c:3196 -#: access/transam/xlog.c:3999 access/transam/xlogrecovery.c:1225 +#: access/transam/twophase.c:1347 access/transam/xlog.c:3197 +#: access/transam/xlog.c:4000 access/transam/xlogrecovery.c:1225 #: access/transam/xlogrecovery.c:1317 access/transam/xlogrecovery.c:1354 #: access/transam/xlogrecovery.c:1414 backup/basebackup.c:1846 #: commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5055 -#: replication/logical/snapbuild.c:2079 replication/slot.c:1980 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5184 +#: replication/logical/snapbuild.c:2087 replication/slot.c:1980 #: replication/slot.c:2021 replication/walsender.c:646 #: storage/file/buffile.c:470 storage/file/copydir.c:185 #: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:830 @@ -105,9 +105,9 @@ msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" #: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 -#: access/transam/xlog.c:3201 access/transam/xlog.c:4004 +#: access/transam/xlog.c:3202 access/transam/xlog.c:4005 #: backup/basebackup.c:1850 replication/logical/origin.c:750 -#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2084 +#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2092 #: replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:651 #: utils/cache/relmapper.c:834 #, c-format @@ -119,17 +119,17 @@ msgstr "не удалось прочитать файл \"%s\" (прочитан #: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 #: access/transam/timeline.c:392 access/transam/timeline.c:438 #: access/transam/timeline.c:512 access/transam/twophase.c:1359 -#: access/transam/twophase.c:1778 access/transam/xlog.c:3042 -#: access/transam/xlog.c:3236 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3377 access/transam/xlog.c:3969 -#: access/transam/xlog.c:4888 commands/copyfrom.c:1747 commands/copyto.c:332 +#: access/transam/twophase.c:1778 access/transam/xlog.c:3043 +#: access/transam/xlog.c:3237 access/transam/xlog.c:3242 +#: access/transam/xlog.c:3378 access/transam/xlog.c:3970 +#: access/transam/xlog.c:4889 commands/copyfrom.c:1747 commands/copyto.c:332 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5107 -#: replication/logical/snapbuild.c:1846 replication/logical/snapbuild.c:1970 +#: replication/logical/reorderbuffer.c:5236 +#: replication/logical/snapbuild.c:1854 replication/logical/snapbuild.c:1978 #: replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:661 -#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 -#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:842 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:779 +#: storage/file/fd.c:3697 storage/file/fd.c:3803 utils/cache/relmapper.c:842 #: utils/cache/relmapper.c:957 #, c-format msgid "could not close file \"%s\": %m" @@ -158,20 +158,20 @@ msgstr "" #: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 #: access/transam/timeline.c:111 access/transam/timeline.c:251 #: access/transam/timeline.c:348 access/transam/twophase.c:1303 -#: access/transam/xlog.c:2949 access/transam/xlog.c:3112 -#: access/transam/xlog.c:3151 access/transam/xlog.c:3344 -#: access/transam/xlog.c:3989 access/transam/xlogrecovery.c:4214 +#: access/transam/xlog.c:2950 access/transam/xlog.c:3113 +#: access/transam/xlog.c:3152 access/transam/xlog.c:3345 +#: access/transam/xlog.c:3990 access/transam/xlogrecovery.c:4214 #: access/transam/xlogrecovery.c:4317 access/transam/xlogutils.c:838 #: backup/basebackup.c:538 backup/basebackup.c:1516 libpq/hba.c:629 #: postmaster/syslogger.c:1560 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3711 -#: replication/logical/reorderbuffer.c:4262 -#: replication/logical/reorderbuffer.c:5035 -#: replication/logical/snapbuild.c:1801 replication/logical/snapbuild.c:1911 +#: replication/logical/reorderbuffer.c:3840 +#: replication/logical/reorderbuffer.c:4391 +#: replication/logical/reorderbuffer.c:5164 +#: replication/logical/snapbuild.c:1809 replication/logical/snapbuild.c:1919 #: replication/slot.c:1952 replication/walsender.c:619 -#: replication/walsender.c:2760 storage/file/copydir.c:151 -#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 -#: storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:819 +#: replication/walsender.c:2764 storage/file/copydir.c:151 +#: storage/file/fd.c:754 storage/file/fd.c:3454 storage/file/fd.c:3684 +#: storage/file/fd.c:3774 storage/smgr/md.c:663 utils/cache/relmapper.c:819 #: utils/cache/relmapper.c:936 utils/error/elog.c:2119 #: utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 #: utils/init/miscinit.c:1792 utils/misc/guc.c:4656 utils/misc/guc.c:4706 @@ -181,7 +181,7 @@ msgstr "не удалось открыть файл \"%s\": %m" #: ../common/controldata_utils.c:232 ../common/controldata_utils.c:235 #: access/transam/twophase.c:1751 access/transam/twophase.c:1760 -#: access/transam/xlog.c:8791 access/transam/xlogfuncs.c:708 +#: access/transam/xlog.c:8830 access/transam/xlogfuncs.c:708 #: backup/basebackup_server.c:175 backup/basebackup_server.c:268 #: postmaster/postmaster.c:5575 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 @@ -195,12 +195,12 @@ msgstr "не удалось записать файл \"%s\": %m" #: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 #: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 #: access/transam/timeline.c:506 access/transam/twophase.c:1772 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3230 -#: access/transam/xlog.c:3962 access/transam/xlog.c:8181 -#: access/transam/xlog.c:8226 backup/basebackup_server.c:209 -#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1839 -#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:774 -#: storage/file/fd.c:3798 storage/smgr/md.c:1137 storage/smgr/md.c:1182 +#: access/transam/xlog.c:3036 access/transam/xlog.c:3231 +#: access/transam/xlog.c:3963 access/transam/xlog.c:8220 +#: access/transam/xlog.c:8265 backup/basebackup_server.c:209 +#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1847 +#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:771 +#: storage/file/fd.c:3795 storage/smgr/md.c:1137 storage/smgr/md.c:1182 #: storage/sync/sync.c:451 utils/misc/guc.c:4426 #, c-format msgid "could not fsync file \"%s\": %m" @@ -213,15 +213,16 @@ msgstr "не удалось синхронизировать с ФС файл \" #: ../common/md5_common.c:155 ../common/psprintf.c:143 #: ../common/scram-common.c:268 ../common/stringinfo.c:305 ../port/path.c:828 #: ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1412 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 -#: libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:524 -#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 -#: postmaster/postmaster.c:2539 postmaster/postmaster.c:4131 -#: postmaster/postmaster.c:5500 postmaster/postmaster.c:5871 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1351 +#: libpq/auth.c:1395 libpq/auth.c:1952 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:352 +#: postmaster/bgworker.c:934 postmaster/postmaster.c:2539 +#: postmaster/postmaster.c:4131 postmaster/postmaster.c:5500 +#: postmaster/postmaster.c:5871 #: replication/libpqwalreceiver/libpqwalreceiver.c:361 #: replication/logical/logical.c:209 replication/walsender.c:689 -#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 -#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1461 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:863 storage/file/fd.c:1394 +#: storage/file/fd.c:1555 storage/file/fd.c:2475 storage/ipc/procarray.c:1461 #: storage/ipc/procarray.c:2243 storage/ipc/procarray.c:2250 #: storage/ipc/procarray.c:2749 storage/ipc/procarray.c:3385 #: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 @@ -303,8 +304,8 @@ msgstr "попытка дублирования нулевого указате #: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 #: commands/copyfrom.c:1697 commands/copyto.c:706 commands/extension.c:3469 #: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 -#: replication/logical/snapbuild.c:1697 storage/file/fd.c:1922 -#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 +#: replication/logical/snapbuild.c:1705 storage/file/fd.c:1919 +#: storage/file/fd.c:2005 storage/file/fd.c:3508 utils/adt/dbsize.c:106 #: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 #: utils/adt/genfile.c:658 utils/adt/misc.c:340 #, c-format @@ -313,22 +314,22 @@ msgstr "не удалось получить информацию о файле #: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 #: commands/tablespace.c:734 commands/tablespace.c:744 -#: postmaster/postmaster.c:1566 storage/file/fd.c:2880 +#: postmaster/postmaster.c:1566 storage/file/fd.c:2877 #: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" #: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 -#: storage/file/fd.c:2892 +#: storage/file/fd.c:2889 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" #: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 #: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 -#: replication/logical/snapbuild.c:1858 replication/slot.c:723 -#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:792 +#: replication/logical/snapbuild.c:1866 replication/slot.c:723 +#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:789 #: utils/time/snapmgr.c:1284 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -338,75 +339,75 @@ msgstr "не удалось переименовать файл \"%s\" в \"%s\" msgid "internal error" msgstr "внутренняя ошибка" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:1147 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%s\"." -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:1150 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:1153 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"." -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:1156 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:1159 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:1162 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ожидалось \":\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:1165 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:1168 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:1170 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:1173 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:1176 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ожидалась строка, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:1179 #, c-format msgid "Token \"%s\" is invalid." msgstr "Ошибочный элемент \"%s\"." -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:1182 jsonpath_scan.l:597 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:1184 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:1187 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -414,19 +415,19 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:1190 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:1193 jsonpath_scan.l:630 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 +#: ../common/jsonapi.c:1195 jsonpath_scan.l:641 jsonpath_scan.l:651 #: jsonpath_scan.l:702 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -455,8 +456,8 @@ msgstr "подсказка: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 #: postmaster/postmaster.c:2213 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6779 -#: utils/misc/guc.c:6820 +#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6785 +#: utils/misc/guc.c:6826 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неверное значение для параметра \"%s\": \"%s\"" @@ -521,10 +522,10 @@ msgstr "не удалось получить код выхода от подпр #: access/transam/twophase.c:1711 access/transam/xlogarchive.c:120 #: access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 #: postmaster/syslogger.c:1537 replication/logical/origin.c:591 -#: replication/logical/reorderbuffer.c:4531 -#: replication/logical/snapbuild.c:1739 replication/logical/snapbuild.c:2173 -#: replication/slot.c:1936 storage/file/fd.c:832 storage/file/fd.c:3325 -#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 +#: replication/logical/reorderbuffer.c:4660 +#: replication/logical/snapbuild.c:1747 replication/logical/snapbuild.c:2181 +#: replication/slot.c:1936 storage/file/fd.c:829 storage/file/fd.c:3322 +#: storage/file/fd.c:3384 storage/file/reinit.c:262 storage/ipc/dsm.c:316 #: storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 #: utils/time/snapmgr.c:1608 #, c-format @@ -532,8 +533,8 @@ msgid "could not remove file \"%s\": %m" msgstr "не удалось стереть файл \"%s\": %m" #: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 -#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 -#: storage/file/fd.c:3726 +#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3314 +#: storage/file/fd.c:3723 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" @@ -573,7 +574,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../common/username.c:45 libpq/auth.c:1879 +#: ../common/username.c:45 libpq/auth.c:1887 msgid "user does not exist" msgstr "пользователь не существует" @@ -936,67 +937,72 @@ msgstr "превышен предел пользовательских типо msgid "RESET must not include values for parameters" msgstr "В RESET не должно передаваться значение параметров" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нераспознанное пространство имён параметров \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1214 +#: access/common/reloptions.c:1296 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "некорректное имя параметра \"%s\": имя не может содержать \"=\"" + +#: access/common/reloptions.c:1311 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы со свойством WITH OIDS не поддерживаются" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1479 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нераспознанный параметр \"%s\"" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1591 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр \"%s\" указан неоднократно" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1607 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неверное значение для логического параметра \"%s\": %s" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1619 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неверное значение для целочисленного параметра \"%s\": %s" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1625 access/common/reloptions.c:1645 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "значение %s вне допустимых пределов параметра \"%s\"" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1627 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Допускаются значения только от \"%d\" до \"%d\"." -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1639 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неверное значение для численного параметра \"%s\": %s" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1647 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Допускаются значения только от \"%f\" до \"%f\"." -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1669 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неверное значение для параметра-перечисления \"%s\": %s" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:2000 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "задать параметры хранения для секционированной таблицы нельзя" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:2001 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Задайте параметры хранения для её конечных секций." @@ -1178,7 +1184,7 @@ msgstr "" #: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:672 #: catalog/heap.c:678 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2022 commands/tablecmds.c:17752 commands/view.c:86 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17775 commands/view.c:86 #: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 #: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 #: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 @@ -1239,39 +1245,39 @@ msgid "" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2049 +#: access/heap/heapam.c:2084 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2568 +#: access/heap/heapam.c:2607 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2615 +#: access/heap/heapam.c:2654 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 +#: access/heap/heapam.c:3104 access/heap/heapam.c:6380 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3239 +#: access/heap/heapam.c:3280 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4791 access/heap/heapam.c:4829 +#: access/heap/heapam.c:5094 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam.c:6152 commands/trigger.c:3347 -#: executor/nodeModifyTable.c:2401 executor/nodeModifyTable.c:2492 +#: access/heap/heapam.c:6193 commands/trigger.c:3377 +#: executor/nodeModifyTable.c:2402 executor/nodeModifyTable.c:2493 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -1301,8 +1307,8 @@ msgstr "не удалось записать в файл \"%s\" (записан #: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:2974 access/transam/xlog.c:3165 -#: access/transam/xlog.c:3941 access/transam/xlog.c:8780 +#: access/transam/xlog.c:2975 access/transam/xlog.c:3166 +#: access/transam/xlog.c:3942 access/transam/xlog.c:8819 #: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 #: backup/basebackup_server.c:244 commands/dbcommands.c:495 #: postmaster/postmaster.c:4558 postmaster/postmaster.c:5562 @@ -1319,11 +1325,11 @@ msgstr "не удалось обрезать файл \"%s\" до нужного #: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3024 access/transam/xlog.c:3221 -#: access/transam/xlog.c:3953 commands/dbcommands.c:507 +#: access/transam/xlog.c:3025 access/transam/xlog.c:3222 +#: access/transam/xlog.c:3954 commands/dbcommands.c:507 #: postmaster/postmaster.c:4568 postmaster/postmaster.c:4578 #: replication/logical/origin.c:615 replication/logical/origin.c:657 -#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1815 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1823 #: replication/slot.c:1839 storage/file/buffile.c:545 #: storage/file/copydir.c:197 utils/init/miscinit.c:1656 #: utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4387 @@ -1626,8 +1632,8 @@ msgid "cannot access index \"%s\" while it is being reindexed" msgstr "индекс \"%s\" перестраивается, обращаться к нему нельзя" #: access/index/indexam.c:208 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17447 commands/tablecmds.c:19316 +#: commands/indexcmds.c:2884 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17470 commands/tablecmds.c:19347 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" @@ -1681,7 +1687,7 @@ msgstr "" "Причиной тому могло быть прерывание операции VACUUM в версии 9.3 или старее, " "до обновления. Этот индекс нужно перестроить (REINDEX)." -#: access/nbtree/nbtutils.c:2677 +#: access/nbtree/nbtutils.c:2683 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1689,12 +1695,12 @@ msgstr "" "размер строки индекса (%zu) больше предельного для btree версии %u размера " "(%zu) (индекс \"%s\")" -#: access/nbtree/nbtutils.c:2683 +#: access/nbtree/nbtutils.c:2689 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Строка индекса ссылается на кортеж (%u,%u) в отношении \"%s\"." -#: access/nbtree/nbtutils.c:2687 +#: access/nbtree/nbtutils.c:2693 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -2545,7 +2551,7 @@ msgstr "фиксировать подтранзакции во время пар msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одной транзакции не может быть больше 2^32-1 подтранзакций" -#: access/transam/xlog.c:1469 +#: access/transam/xlog.c:1470 #, c-format msgid "" "request to flush past end of generated WAL; request %X/%X, current position " @@ -2554,55 +2560,55 @@ msgstr "" "запрос на сброс данных за концом сгенерированного WAL; запрошена позиция %X/" "%X, текущая позиция %X/%X" -#: access/transam/xlog.c:2231 +#: access/transam/xlog.c:2232 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "не удалось записать в файл журнала %s (смещение: %u, длина: %zu): %m" -#: access/transam/xlog.c:3458 access/transam/xlogutils.c:833 -#: replication/walsender.c:2754 +#: access/transam/xlog.c:3459 access/transam/xlogutils.c:833 +#: replication/walsender.c:2758 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" -#: access/transam/xlog.c:3742 +#: access/transam/xlog.c:3743 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не удалось переименовать файл \"%s\": %m" -#: access/transam/xlog.c:3784 access/transam/xlog.c:3794 +#: access/transam/xlog.c:3785 access/transam/xlog.c:3795 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "требуемый каталог WAL \"%s\" не существует" -#: access/transam/xlog.c:3800 +#: access/transam/xlog.c:3801 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "создаётся отсутствующий каталог WAL \"%s\"" -#: access/transam/xlog.c:3803 commands/dbcommands.c:3192 +#: access/transam/xlog.c:3804 commands/dbcommands.c:3192 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не удалось создать отсутствующий каталог \"%s\": %m" -#: access/transam/xlog.c:3870 +#: access/transam/xlog.c:3871 #, c-format msgid "could not generate secret authorization token" msgstr "не удалось сгенерировать случайное число для аутентификации" -#: access/transam/xlog.c:4020 access/transam/xlog.c:4029 -#: access/transam/xlog.c:4053 access/transam/xlog.c:4060 -#: access/transam/xlog.c:4067 access/transam/xlog.c:4072 -#: access/transam/xlog.c:4079 access/transam/xlog.c:4086 -#: access/transam/xlog.c:4093 access/transam/xlog.c:4100 -#: access/transam/xlog.c:4107 access/transam/xlog.c:4114 -#: access/transam/xlog.c:4123 access/transam/xlog.c:4130 +#: access/transam/xlog.c:4021 access/transam/xlog.c:4030 +#: access/transam/xlog.c:4054 access/transam/xlog.c:4061 +#: access/transam/xlog.c:4068 access/transam/xlog.c:4073 +#: access/transam/xlog.c:4080 access/transam/xlog.c:4087 +#: access/transam/xlog.c:4094 access/transam/xlog.c:4101 +#: access/transam/xlog.c:4108 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4124 access/transam/xlog.c:4131 #: utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "файлы базы данных несовместимы с сервером" -#: access/transam/xlog.c:4021 +#: access/transam/xlog.c:4022 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2611,7 +2617,7 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d (0x%08x), но " "сервер скомпилирован с PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4025 +#: access/transam/xlog.c:4026 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2620,7 +2626,7 @@ msgstr "" "Возможно, проблема вызвана разным порядком байт. Кажется, вам надо выполнить " "initdb." -#: access/transam/xlog.c:4030 +#: access/transam/xlog.c:4031 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2629,18 +2635,18 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d, но сервер " "скомпилирован с PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4033 access/transam/xlog.c:4057 -#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 +#: access/transam/xlog.c:4034 access/transam/xlog.c:4058 +#: access/transam/xlog.c:4065 access/transam/xlog.c:4070 #, c-format msgid "It looks like you need to initdb." msgstr "Кажется, вам надо выполнить initdb." -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4045 #, c-format msgid "incorrect checksum in control file" msgstr "ошибка контрольной суммы в файле pg_control" -#: access/transam/xlog.c:4054 +#: access/transam/xlog.c:4055 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2649,7 +2655,7 @@ msgstr "" "Кластер баз данных был инициализирован с CATALOG_VERSION_NO %d, но сервер " "скомпилирован с CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4061 +#: access/transam/xlog.c:4062 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2658,7 +2664,7 @@ msgstr "" "Кластер баз данных был инициализирован с MAXALIGN %d, но сервер " "скомпилирован с MAXALIGN %d." -#: access/transam/xlog.c:4068 +#: access/transam/xlog.c:4069 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2667,7 +2673,7 @@ msgstr "" "Кажется, в кластере баз данных и в программе сервера используются разные " "форматы чисел с плавающей точкой." -#: access/transam/xlog.c:4073 +#: access/transam/xlog.c:4074 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2676,16 +2682,16 @@ msgstr "" "Кластер баз данных был инициализирован с BLCKSZ %d, но сервер скомпилирован " "с BLCKSZ %d." -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 -#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 -#: access/transam/xlog.c:4118 access/transam/xlog.c:4126 -#: access/transam/xlog.c:4133 +#: access/transam/xlog.c:4077 access/transam/xlog.c:4084 +#: access/transam/xlog.c:4091 access/transam/xlog.c:4098 +#: access/transam/xlog.c:4105 access/transam/xlog.c:4112 +#: access/transam/xlog.c:4119 access/transam/xlog.c:4127 +#: access/transam/xlog.c:4134 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Кажется, вам надо перекомпилировать сервер или выполнить initdb." -#: access/transam/xlog.c:4080 +#: access/transam/xlog.c:4081 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2694,7 +2700,7 @@ msgstr "" "Кластер баз данных был инициализирован с RELSEG_SIZE %d, но сервер " "скомпилирован с RELSEG_SIZE %d." -#: access/transam/xlog.c:4087 +#: access/transam/xlog.c:4088 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2703,7 +2709,7 @@ msgstr "" "Кластер баз данных был инициализирован с XLOG_BLCKSZ %d, но сервер " "скомпилирован с XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4094 +#: access/transam/xlog.c:4095 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2712,7 +2718,7 @@ msgstr "" "Кластер баз данных был инициализирован с NAMEDATALEN %d, но сервер " "скомпилирован с NAMEDATALEN %d." -#: access/transam/xlog.c:4101 +#: access/transam/xlog.c:4102 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2721,7 +2727,7 @@ msgstr "" "Кластер баз данных был инициализирован с INDEX_MAX_KEYS %d, но сервер " "скомпилирован с INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4108 +#: access/transam/xlog.c:4109 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2730,7 +2736,7 @@ msgstr "" "Кластер баз данных был инициализирован с TOAST_MAX_CHUNK_SIZE %d, но сервер " "скомпилирован с TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4115 +#: access/transam/xlog.c:4116 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2739,7 +2745,7 @@ msgstr "" "Кластер баз данных был инициализирован с LOBLKSIZE %d, но сервер " "скомпилирован с LOBLKSIZE %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4125 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2748,7 +2754,7 @@ msgstr "" "Кластер баз данных был инициализирован без USE_FLOAT8_BYVAL, но сервер " "скомпилирован с USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4132 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -2757,7 +2763,7 @@ msgstr "" "Кластер баз данных был инициализирован с USE_FLOAT8_BYVAL, но сервер был " "скомпилирован без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4140 +#: access/transam/xlog.c:4141 #, c-format msgid "" "WAL segment size must be a power of two between 1 MB and 1 GB, but the " @@ -2775,89 +2781,89 @@ msgstr[2] "" "размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 " "ГБ, но в управляющем файле указано значение: %d" -#: access/transam/xlog.c:4152 +#: access/transam/xlog.c:4153 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4157 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:4311 catalog/namespace.c:4335 +#: access/transam/xlog.c:4312 catalog/namespace.c:4335 #: commands/tablespace.c:1216 commands/user.c:2530 commands/variable.c:72 #: tcop/postgres.c:3676 utils/error/elog.c:2242 #, c-format msgid "List syntax is invalid." msgstr "Ошибка синтаксиса в списке." -#: access/transam/xlog.c:4357 commands/user.c:2546 commands/variable.c:173 +#: access/transam/xlog.c:4358 commands/user.c:2546 commands/variable.c:173 #: tcop/postgres.c:3692 utils/error/elog.c:2268 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "нераспознанное ключевое слово: \"%s\"." -#: access/transam/xlog.c:4771 +#: access/transam/xlog.c:4772 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не удалось записать начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:4779 +#: access/transam/xlog.c:4780 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не удалось сбросить на диск начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:4785 +#: access/transam/xlog.c:4786 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не удалось закрыть начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5002 +#: access/transam/xlog.c:5003 #, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "" "WAL был создан с параметром wal_level=minimal, продолжение восстановления " "невозможно" -#: access/transam/xlog.c:5003 +#: access/transam/xlog.c:5004 #, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." msgstr "Это происходит, если вы на время устанавливали wal_level=minimal." -#: access/transam/xlog.c:5004 +#: access/transam/xlog.c:5005 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "" "Используйте резервную копию, сделанную после переключения wal_level на любой " "уровень выше minimal." -#: access/transam/xlog.c:5068 +#: access/transam/xlog.c:5069 #, c-format msgid "control file contains invalid checkpoint location" msgstr "файл pg_control содержит неправильную позицию контрольной точки" -#: access/transam/xlog.c:5079 +#: access/transam/xlog.c:5080 #, c-format msgid "database system was shut down at %s" msgstr "система БД была выключена: %s" -#: access/transam/xlog.c:5085 +#: access/transam/xlog.c:5086 #, c-format msgid "database system was shut down in recovery at %s" msgstr "система БД была выключена в процессе восстановления: %s" -#: access/transam/xlog.c:5091 +#: access/transam/xlog.c:5092 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "выключение системы БД было прервано; последний момент работы: %s" -#: access/transam/xlog.c:5097 +#: access/transam/xlog.c:5098 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "работа системы БД была прервана во время восстановления: %s" -#: access/transam/xlog.c:5099 +#: access/transam/xlog.c:5100 #, c-format msgid "" "This probably means that some data is corrupted and you will have to use the " @@ -2866,14 +2872,14 @@ msgstr "" "Это скорее всего означает, что некоторые данные повреждены и вам придётся " "восстановить БД из последней резервной копии." -#: access/transam/xlog.c:5105 +#: access/transam/xlog.c:5106 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "работа системы БД была прервана в процессе восстановления, время в журнале: " "%s" -#: access/transam/xlog.c:5107 +#: access/transam/xlog.c:5108 #, c-format msgid "" "If this has occurred more than once some data might be corrupted and you " @@ -2882,22 +2888,22 @@ msgstr "" "Если это происходит постоянно, возможно, какие-то данные были испорчены и " "для восстановления стоит выбрать более раннюю точку." -#: access/transam/xlog.c:5113 +#: access/transam/xlog.c:5114 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "работа системы БД была прервана; последний момент работы: %s" -#: access/transam/xlog.c:5119 +#: access/transam/xlog.c:5120 #, c-format msgid "control file contains invalid database cluster state" msgstr "файл pg_control содержит неверный код состояния кластера" -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5505 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL закончился без признака окончания копирования" -#: access/transam/xlog.c:5505 +#: access/transam/xlog.c:5506 #, c-format msgid "" "All WAL generated while online backup was taken must be available at " @@ -2906,40 +2912,40 @@ msgstr "" "Все журналы WAL, созданные во время резервного копирования \"на ходу\", " "должны быть в наличии для восстановления." -#: access/transam/xlog.c:5508 +#: access/transam/xlog.c:5509 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL закончился до согласованной точки восстановления" -#: access/transam/xlog.c:5554 +#: access/transam/xlog.c:5555 #, c-format msgid "selected new timeline ID: %u" msgstr "выбранный ID новой линии времени: %u" -#: access/transam/xlog.c:5587 +#: access/transam/xlog.c:5588 #, c-format msgid "archive recovery complete" msgstr "восстановление архива завершено" -#: access/transam/xlog.c:6217 +#: access/transam/xlog.c:6218 #, c-format msgid "shutting down" msgstr "выключение" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6256 +#: access/transam/xlog.c:6257 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата точка перезапуска:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6268 +#: access/transam/xlog.c:6269 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата контрольная точка:%s%s%s%s%s%s%s%s" # well-spelled: синхр -#: access/transam/xlog.c:6333 +#: access/transam/xlog.c:6334 #, c-format msgid "" "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " @@ -2954,7 +2960,7 @@ msgstr "" "lsn=%X/%X, lsn redo=%X/%X" # well-spelled: синхр -#: access/transam/xlog.c:6356 +#: access/transam/xlog.c:6357 #, c-format msgid "" "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " @@ -2968,7 +2974,7 @@ msgstr "" "=%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB; " "lsn=%X/%X, lsn redo=%X/%X" -#: access/transam/xlog.c:6801 +#: access/transam/xlog.c:6812 #, c-format msgid "" "concurrent write-ahead log activity while database system is shutting down" @@ -2976,75 +2982,75 @@ msgstr "" "во время выключения системы баз данных отмечена активность в журнале " "предзаписи" -#: access/transam/xlog.c:7362 +#: access/transam/xlog.c:7399 #, c-format msgid "recovery restart point at %X/%X" msgstr "точка перезапуска восстановления в позиции %X/%X" -#: access/transam/xlog.c:7364 +#: access/transam/xlog.c:7401 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Последняя завершённая транзакция была выполнена в %s." -#: access/transam/xlog.c:7612 +#: access/transam/xlog.c:7651 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка восстановления \"%s\" создана в позиции %X/%X" -#: access/transam/xlog.c:7819 +#: access/transam/xlog.c:7858 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "" "резервное копирование \"на ходу\" было отменено, продолжить восстановление " "нельзя" -#: access/transam/xlog.c:7877 +#: access/transam/xlog.c:7916 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки выключения" -#: access/transam/xlog.c:7935 +#: access/transam/xlog.c:7974 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки активности" -#: access/transam/xlog.c:7964 +#: access/transam/xlog.c:8003 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи конец-" "восстановления" -#: access/transam/xlog.c:8231 +#: access/transam/xlog.c:8270 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" -#: access/transam/xlog.c:8236 +#: access/transam/xlog.c:8275 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:8321 access/transam/xlog.c:8644 +#: access/transam/xlog.c:8360 access/transam/xlog.c:8683 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "" "Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" -#: access/transam/xlog.c:8322 access/transam/xlog.c:8645 +#: access/transam/xlog.c:8361 access/transam/xlog.c:8684 #: access/transam/xlogfuncs.c:254 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "Установите wal_level \"replica\" или \"logical\" при запуске сервера." -#: access/transam/xlog.c:8327 +#: access/transam/xlog.c:8366 #, c-format msgid "backup label too long (max %d bytes)" msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:8448 +#: access/transam/xlog.c:8487 #, c-format msgid "" "WAL generated with full_page_writes=off was replayed since last restartpoint" @@ -3052,7 +3058,7 @@ msgstr "" "После последней точки перезапуска был воспроизведён WAL, созданный в режиме " "full_page_writes=off." -#: access/transam/xlog.c:8450 access/transam/xlog.c:8733 +#: access/transam/xlog.c:8489 access/transam/xlog.c:8772 #, c-format msgid "" "This means that the backup being taken on the standby is corrupt and should " @@ -3064,23 +3070,23 @@ msgstr "" "CHECKPOINT на ведущем сервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:8517 backup/basebackup.c:1355 utils/adt/misc.c:354 +#: access/transam/xlog.c:8556 backup/basebackup.c:1355 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: access/transam/xlog.c:8524 backup/basebackup.c:1360 utils/adt/misc.c:359 +#: access/transam/xlog.c:8563 backup/basebackup.c:1360 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: access/transam/xlog.c:8683 backup/basebackup.c:1221 +#: access/transam/xlog.c:8722 backup/basebackup.c:1221 #, c-format msgid "the standby was promoted during online backup" msgstr "" "ведомый сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:8684 backup/basebackup.c:1222 +#: access/transam/xlog.c:8723 backup/basebackup.c:1222 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3089,7 +3095,7 @@ msgstr "" "Это означает, что создаваемая резервная копия испорчена и использовать её не " "следует. Попробуйте резервное копирование \"на ходу\" ещё раз." -#: access/transam/xlog.c:8731 +#: access/transam/xlog.c:8770 #, c-format msgid "" "WAL generated with full_page_writes=off was replayed during online backup" @@ -3097,13 +3103,13 @@ msgstr "" "В процессе резервного копирования \"на ходу\" был воспроизведён WAL, " "созданный в режиме full_page_writes=off" -#: access/transam/xlog.c:8847 +#: access/transam/xlog.c:8886 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" "базовое копирование выполнено, ожидается архивация нужных сегментов WAL" -#: access/transam/xlog.c:8861 +#: access/transam/xlog.c:8900 #, c-format msgid "" "still waiting for all required WAL segments to be archived (%d seconds " @@ -3111,7 +3117,7 @@ msgid "" msgstr "" "продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8902 #, c-format msgid "" "Check that your archive_command is executing properly. You can safely " @@ -3122,12 +3128,12 @@ msgstr "" "копирования можно отменить безопасно, но резервная копия базы будет " "непригодна без всех сегментов WAL." -#: access/transam/xlog.c:8870 +#: access/transam/xlog.c:8909 #, c-format msgid "all required WAL segments have been archived" msgstr "все нужные сегменты WAL заархивированы" -#: access/transam/xlog.c:8874 +#: access/transam/xlog.c:8913 #, c-format msgid "" "WAL archiving is not enabled; you must ensure that all required WAL segments " @@ -3136,7 +3142,7 @@ msgstr "" "архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " "сегментов WAL другими средствами для получения резервной копии" -#: access/transam/xlog.c:8913 +#: access/transam/xlog.c:8952 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "" @@ -3297,52 +3303,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1136 +#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1146 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "" "неверная длина записи в позиции %X/%X: ожидалось минимум %u, получено %u" -#: access/transam/xlogreader.c:760 +#: access/transam/xlogreader.c:761 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: access/transam/xlogreader.c:773 +#: access/transam/xlogreader.c:774 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: access/transam/xlogreader.c:1144 +#: access/transam/xlogreader.c:1154 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: access/transam/xlogreader.c:1157 access/transam/xlogreader.c:1173 +#: access/transam/xlogreader.c:1167 access/transam/xlogreader.c:1183 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: access/transam/xlogreader.c:1211 +#: access/transam/xlogreader.c:1221 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: access/transam/xlogreader.c:1245 +#: access/transam/xlogreader.c:1255 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверное магическое число %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1302 +#: access/transam/xlogreader.c:1270 access/transam/xlogreader.c:1312 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверные информационные биты %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1276 +#: access/transam/xlogreader.c:1286 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -3351,7 +3357,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: access/transam/xlogreader.c:1284 +#: access/transam/xlogreader.c:1294 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -3360,7 +3366,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: access/transam/xlogreader.c:1290 +#: access/transam/xlogreader.c:1300 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -3369,12 +3375,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: access/transam/xlogreader.c:1322 +#: access/transam/xlogreader.c:1332 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "неожиданный pageaddr %X/%X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1348 +#: access/transam/xlogreader.c:1358 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -3383,23 +3389,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1754 +#: access/transam/xlogreader.c:1764 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: access/transam/xlogreader.c:1778 +#: access/transam/xlogreader.c:1788 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: access/transam/xlogreader.c:1785 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1821 +#: access/transam/xlogreader.c:1831 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -3408,21 +3414,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1837 +#: access/transam/xlogreader.c:1847 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1876 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -3431,41 +3437,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1882 +#: access/transam/xlogreader.c:1892 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: access/transam/xlogreader.c:1894 +#: access/transam/xlogreader.c:1904 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1961 +#: access/transam/xlogreader.c:1971 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: access/transam/xlogreader.c:1987 +#: access/transam/xlogreader.c:1997 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: access/transam/xlogreader.c:2071 +#: access/transam/xlogreader.c:2081 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: access/transam/xlogreader.c:2078 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: access/transam/xlogreader.c:2105 access/transam/xlogreader.c:2122 +#: access/transam/xlogreader.c:2115 access/transam/xlogreader.c:2132 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -3474,7 +3480,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: access/transam/xlogreader.c:2131 +#: access/transam/xlogreader.c:2141 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -3482,7 +3488,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: access/transam/xlogreader.c:2139 +#: access/transam/xlogreader.c:2149 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" @@ -4540,11 +4546,11 @@ msgstr "предложение IN SCHEMA нельзя использовать #: commands/tablecmds.c:8310 commands/tablecmds.c:8392 #: commands/tablecmds.c:8526 commands/tablecmds.c:8638 #: commands/tablecmds.c:12467 commands/tablecmds.c:12659 -#: commands/tablecmds.c:12820 commands/tablecmds.c:14015 -#: commands/tablecmds.c:16547 commands/trigger.c:949 parser/analyze.c:2529 +#: commands/tablecmds.c:12820 commands/tablecmds.c:14038 +#: commands/tablecmds.c:16570 commands/trigger.c:949 parser/analyze.c:2529 #: parser/parse_relation.c:737 parser/parse_target.c:1068 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3443 -#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2876 +#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2893 #: utils/adt/ruleutils.c:2793 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -4555,15 +4561,15 @@ msgstr "столбец \"%s\" в таблице \"%s\" не существует msgid "\"%s\" is an index" msgstr "\"%s\" - это индекс" -#: catalog/aclchk.c:1848 commands/tablecmds.c:14172 commands/tablecmds.c:17456 +#: catalog/aclchk.c:1848 commands/tablecmds.c:14195 commands/tablecmds.c:17479 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" - это составной тип" #: catalog/aclchk.c:1856 catalog/objectaddress.c:1401 commands/sequence.c:1178 -#: commands/tablecmds.c:254 commands/tablecmds.c:17420 utils/adt/acl.c:2084 -#: utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 -#: utils/adt/acl.c:2206 utils/adt/acl.c:2236 +#: commands/tablecmds.c:254 commands/tablecmds.c:17443 utils/adt/acl.c:2101 +#: utils/adt/acl.c:2131 utils/adt/acl.c:2163 utils/adt/acl.c:2195 +#: utils/adt/acl.c:2223 utils/adt/acl.c:2253 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" - это не последовательность" @@ -5098,13 +5104,13 @@ msgstr "удалить объект %s нельзя, так как от него #: catalog/dependency.c:1209 catalog/dependency.c:1216 #: catalog/dependency.c:1227 commands/tablecmds.c:1349 -#: commands/tablecmds.c:14659 commands/tablespace.c:466 commands/user.c:1303 -#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 +#: commands/tablecmds.c:14682 commands/tablespace.c:466 commands/user.c:1303 +#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:334 #: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1084 #: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 -#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6673 -#: utils/misc/guc.c:6707 utils/misc/guc.c:6741 utils/misc/guc.c:6784 -#: utils/misc/guc.c:6826 +#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6679 +#: utils/misc/guc.c:6713 utils/misc/guc.c:6747 utils/misc/guc.c:6790 +#: utils/misc/guc.c:6832 #, c-format msgid "%s" msgstr "%s" @@ -5282,7 +5288,7 @@ msgstr "слияние ограничения \"%s\" с унаследованн #: catalog/heap.c:2683 catalog/pg_constraint.c:812 commands/tablecmds.c:2686 #: commands/tablecmds.c:3213 commands/tablecmds.c:6926 -#: commands/tablecmds.c:15482 commands/tablecmds.c:15623 +#: commands/tablecmds.c:15505 commands/tablecmds.c:15646 #, c-format msgid "too many inheritance parents" msgstr "слишком много родителей в иерархии наследования" @@ -5442,12 +5448,12 @@ msgstr "DROP INDEX CONCURRENTLY должен быть первым действ msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3685 commands/indexcmds.c:3614 +#: catalog/index.c:3685 commands/indexcmds.c:3648 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 +#: catalog/index.c:3701 commands/indexcmds.c:3528 commands/indexcmds.c:3672 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -5466,7 +5472,7 @@ msgstr "" "пропускается" #: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5736 +#: commands/trigger.c:5766 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ссылки между базами не реализованы: \"%s.%s.%s\"" @@ -5550,7 +5556,7 @@ msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" #: catalog/namespace.c:2886 parser/parse_expr.c:839 parser/parse_target.c:1267 -#: gram.y:18576 gram.y:18616 +#: gram.y:18583 gram.y:18623 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" @@ -5609,19 +5615,19 @@ msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" #: catalog/objectaddress.c:1416 commands/tablecmds.c:260 -#: commands/tablecmds.c:17425 commands/view.c:119 +#: commands/tablecmds.c:17448 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" #: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 -#: commands/tablecmds.c:17430 +#: commands/tablecmds.c:17453 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" #: catalog/objectaddress.c:1430 commands/tablecmds.c:284 -#: commands/tablecmds.c:17435 +#: commands/tablecmds.c:17458 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - это не сторонняя таблица" @@ -5645,7 +5651,7 @@ msgstr "" #: catalog/objectaddress.c:1656 commands/functioncmds.c:138 #: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3691 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 -#: utils/adt/acl.c:4441 +#: utils/adt/acl.c:4458 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не существует" @@ -5665,8 +5671,9 @@ msgstr "функция %d (%s, %s) из семейства %s не сущест msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "сопоставление для пользователя \"%s\" на сервере \"%s\" не существует" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:710 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:710 #, c-format msgid "server \"%s\" does not exist" msgstr "сервер \"%s\" не существует" @@ -6444,7 +6451,7 @@ msgstr "" "отсоединения." #: catalog/pg_inherits.c:596 commands/tablecmds.c:4646 -#: commands/tablecmds.c:15738 +#: commands/tablecmds.c:15761 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -6783,12 +6790,12 @@ msgstr "" "изменить владельца объектов, принадлежащих роли %s, нельзя, так как они " "нужны системе баз данных" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:449 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "удалить сопоставление отношений для подписки \"%s\" не получилось" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:451 #, c-format msgid "" "Table synchronization for relation \"%s\" is in progress and is in state " @@ -6798,7 +6805,7 @@ msgstr "Выполняется синхронизация отношения \"% #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:458 #, c-format msgid "" "Use %s to enable subscription if not already enabled or use %s to drop the " @@ -6962,12 +6969,12 @@ msgstr "" msgid "event trigger \"%s\" already exists" msgstr "событийный триггер \"%s\" уже существует" -#: commands/alter.c:90 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка сторонних данных \"%s\" уже существует" -#: commands/alter.c:93 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" @@ -7072,7 +7079,7 @@ msgid "handler function is not specified" msgstr "не указана функция-обработчик" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 +#: commands/foreigncmds.c:500 commands/proclang.c:80 commands/trigger.c:709 #: parser/parse_clause.c:941 #, c-format msgid "function %s must return type %s" @@ -7203,7 +7210,7 @@ msgstr "кластеризовать временные таблицы друг msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:192 commands/tablecmds.c:14473 commands/tablecmds.c:16317 +#: commands/cluster.c:192 commands/tablecmds.c:14496 commands/tablecmds.c:16340 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" @@ -7218,7 +7225,7 @@ msgstr "кластеризовать разделяемый каталог не msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:513 commands/tablecmds.c:16327 +#: commands/cluster.c:513 commands/tablecmds.c:16350 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" @@ -7362,8 +7369,8 @@ msgstr "нельзя обновить версию правила сортиро #. translator: %s is an SQL ALTER command #: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 #: commands/tablecmds.c:7810 commands/tablecmds.c:7820 -#: commands/tablecmds.c:14175 commands/tablecmds.c:17458 -#: commands/tablecmds.c:17479 commands/typecmds.c:3637 commands/typecmds.c:3720 +#: commands/tablecmds.c:14198 commands/tablecmds.c:17481 +#: commands/tablecmds.c:17502 commands/typecmds.c:3637 commands/typecmds.c:3720 #: commands/typecmds.c:4013 #, c-format msgid "Use %s instead." @@ -8628,7 +8635,7 @@ msgstr "Используйте DROP AGGREGATE для удаления агрег #: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3739 #: commands/tablecmds.c:3897 commands/tablecmds.c:3949 -#: commands/tablecmds.c:16742 tcop/utility.c:1336 +#: commands/tablecmds.c:16765 tcop/utility.c:1336 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не существует, пропускается" @@ -8753,7 +8760,7 @@ msgstr "правило \"%s\" для отношения \"%s\" не сущест msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка сторонних данных \"%s\" не существует, пропускается" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "сервер \"%s\" не существует, пропускается" @@ -9191,68 +9198,68 @@ msgstr "" msgid "file \"%s\" is too large" msgstr "файл \"%s\" слишком большой" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "нераспознанный параметр \"%s\"" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "параметр \"%s\" указан неоднократно" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "нет прав для изменения владельца обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "" "Для смены владельца обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Владельцем обёртки сторонних данных должен быть суперпользователь." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:688 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:688 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "обёртка сторонних данных \"%s\" не существует" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "обёртка сторонних данных с OID %u не существует" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "сторонний сервер с OID %u не существует" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "нет прав для создания обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Для создания обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "нет прав для изменения обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Для изменения обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "" "changing the foreign-data wrapper handler can change behavior of existing " @@ -9261,7 +9268,7 @@ msgstr "" "при изменении обработчика в обёртке сторонних данных может измениться " "поведение существующих сторонних таблиц" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -9270,46 +9277,46 @@ msgstr "" "при изменении функции проверки в обёртке сторонних данных параметры " "зависимых объектов могут стать неверными" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" уже существует, пропускается" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует, " "пропускается" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" не существует" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" не существует, " "пропускается" -#: commands/foreigncmds.c:1507 foreign/foreign.c:401 +#: commands/foreigncmds.c:1518 foreign/foreign.c:401 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка сторонних данных \"%s\" не имеет обработчика" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "обёртка сторонних данных \"%s\" не поддерживает IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "импорт сторонней таблицы \"%s\"" @@ -9867,7 +9874,7 @@ msgstr "включаемые столбцы не поддерживают ука msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:2029 commands/tablecmds.c:17759 commands/typecmds.c:807 +#: commands/indexcmds.c:2029 commands/tablecmds.c:17782 commands/typecmds.c:807 #: parser/parse_expr.c:2730 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 #: utils/adt/misc.c:586 #, c-format @@ -9910,8 +9917,8 @@ msgstr "метод доступа \"%s\" не поддерживает сорт msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2211 commands/tablecmds.c:17784 -#: commands/tablecmds.c:17790 commands/typecmds.c:2301 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17807 +#: commands/tablecmds.c:17813 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" @@ -9944,69 +9951,69 @@ msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2682 +#: commands/indexcmds.c:2716 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нераспознанный параметр REINDEX: \"%s\"" -#: commands/indexcmds.c:2906 +#: commands/indexcmds.c:2940 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:2920 +#: commands/indexcmds.c:2954 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 -#: commands/indexcmds.c:3603 +#: commands/indexcmds.c:2999 commands/indexcmds.c:3509 +#: commands/indexcmds.c:3637 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:2988 +#: commands/indexcmds.c:3022 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:3082 +#: commands/indexcmds.c:3116 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:3115 +#: commands/indexcmds.c:3149 #, c-format msgid "cannot move system relations, skipping all" msgstr "переместить системные отношения нельзя, все они пропускаются" -#: commands/indexcmds.c:3161 +#: commands/indexcmds.c:3195 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3164 +#: commands/indexcmds.c:3198 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 +#: commands/indexcmds.c:3389 commands/indexcmds.c:4253 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 +#: commands/indexcmds.c:3541 commands/indexcmds.c:3593 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "" "перестроить нерабочий индекс \"%s.%s\" неблокирующим способом нельзя, он " "пропускается" -#: commands/indexcmds.c:3513 +#: commands/indexcmds.c:3547 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -10014,24 +10021,24 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3668 +#: commands/indexcmds.c:3702 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3689 +#: commands/indexcmds.c:3723 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 +#: commands/indexcmds.c:4234 commands/indexcmds.c:4246 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 +#: commands/indexcmds.c:4236 commands/indexcmds.c:4255 #, c-format msgid "%s." msgstr "%s." @@ -10048,7 +10055,7 @@ msgstr "" "CONCURRENTLY нельзя использовать, когда материализованное представление не " "наполнено" -#: commands/matview.c:199 gram.y:18313 +#: commands/matview.c:199 gram.y:18320 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметры %s и %s исключают друг друга" @@ -10377,8 +10384,8 @@ msgstr "атрибут оператора \"%s\" нельзя изменить" #: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 #: commands/tablecmds.c:1630 commands/tablecmds.c:2233 #: commands/tablecmds.c:3549 commands/tablecmds.c:6434 -#: commands/tablecmds.c:9294 commands/tablecmds.c:17346 -#: commands/tablecmds.c:17381 commands/trigger.c:323 commands/trigger.c:1339 +#: commands/tablecmds.c:9294 commands/tablecmds.c:17369 +#: commands/tablecmds.c:17404 commands/trigger.c:323 commands/trigger.c:1339 #: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 #: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format @@ -10433,7 +10440,7 @@ msgstr "" "HOLD" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2917 utils/adt/xml.c:3087 +#: executor/execCurrent.c:70 utils/adt/xml.c:2919 utils/adt/xml.c:3089 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не существует" @@ -10483,7 +10490,7 @@ msgstr "" "для создания дополнительного процедурного языка нужно быть суперпользователем" #: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 -#: postmaster/postmaster.c:1306 storage/file/fd.c:3911 +#: postmaster/postmaster.c:1306 storage/file/fd.c:3908 #: utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" @@ -10883,8 +10890,8 @@ msgstr "" msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1689 commands/tablecmds.c:14162 -#: commands/tablecmds.c:16762 +#: commands/sequence.c:1689 commands/tablecmds.c:14185 +#: commands/tablecmds.c:16785 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." @@ -11034,7 +11041,7 @@ msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Создавать подписки могут только роли с правами роли \"%s\"." #: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 -#: replication/logical/tablesync.c:1334 replication/logical/worker.c:4650 +#: replication/logical/tablesync.c:1360 replication/logical/worker.c:4650 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалось подключиться к серверу публикации: %s" @@ -11207,7 +11214,7 @@ msgstr "" "Убедитесь, что начальные данные, скопированные из таблиц публикации, " "поступили не из других источников." -#: commands/subscriptioncmds.c:2145 replication/logical/tablesync.c:893 +#: commands/subscriptioncmds.c:2145 replication/logical/tablesync.c:919 #: replication/pgoutput/pgoutput.c:1138 #, c-format msgid "" @@ -11319,7 +11326,7 @@ msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19359 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19390 #: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" @@ -11343,8 +11350,8 @@ msgstr "\"%s\" - это не тип" msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:282 commands/tablecmds.c:14001 -#: commands/tablecmds.c:16467 +#: commands/tablecmds.c:282 commands/tablecmds.c:14024 +#: commands/tablecmds.c:16490 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" @@ -11370,7 +11377,7 @@ msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:785 commands/tablecmds.c:15312 +#: commands/tablecmds.c:785 commands/tablecmds.c:15335 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" @@ -11447,7 +11454,7 @@ msgstr "опустошить стороннюю таблицу \"%s\" нельз msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2502 commands/tablecmds.c:15209 +#: commands/tablecmds.c:2502 commands/tablecmds.c:15232 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" @@ -11472,12 +11479,12 @@ msgstr "" "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2536 commands/tablecmds.c:15188 +#: commands/tablecmds.c:2536 commands/tablecmds.c:15211 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2546 commands/tablecmds.c:15196 +#: commands/tablecmds.c:2546 commands/tablecmds.c:15219 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" @@ -11817,12 +11824,12 @@ msgstr "добавить столбец в типизированную табл msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:6909 commands/tablecmds.c:15439 +#: commands/tablecmds.c:6909 commands/tablecmds.c:15462 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:6915 commands/tablecmds.c:15446 +#: commands/tablecmds.c:6915 commands/tablecmds.c:15469 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" @@ -11874,8 +11881,8 @@ msgstr "Не указывайте ключевое слово ONLY." #: commands/tablecmds.c:8013 commands/tablecmds.c:8072 #: commands/tablecmds.c:8191 commands/tablecmds.c:8330 #: commands/tablecmds.c:8400 commands/tablecmds.c:8534 -#: commands/tablecmds.c:12476 commands/tablecmds.c:14024 -#: commands/tablecmds.c:16556 +#: commands/tablecmds.c:12476 commands/tablecmds.c:14047 +#: commands/tablecmds.c:16579 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" @@ -12262,8 +12269,8 @@ msgstr "изменить тип столбца в типизированной msgid "cannot specify USING when altering type of generated column" msgstr "изменяя тип генерируемого столбца, нельзя указывать USING" -#: commands/tablecmds.c:12487 commands/tablecmds.c:17602 -#: commands/tablecmds.c:17692 commands/trigger.c:663 +#: commands/tablecmds.c:12487 commands/tablecmds.c:17625 +#: commands/tablecmds.c:17715 commands/trigger.c:663 #: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." @@ -12390,108 +12397,108 @@ msgstr "" "изменить тип столбца, задействованного в заданном для публикации предложении " "WHERE, нельзя" -#: commands/tablecmds.c:14132 commands/tablecmds.c:14144 +#: commands/tablecmds.c:14155 commands/tablecmds.c:14167 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:14134 commands/tablecmds.c:14146 +#: commands/tablecmds.c:14157 commands/tablecmds.c:14169 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:14160 +#: commands/tablecmds.c:14183 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:14185 +#: commands/tablecmds.c:14208 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "сменить владельца отношения \"%s\" нельзя" -#: commands/tablecmds.c:14547 +#: commands/tablecmds.c:14570 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:14624 +#: commands/tablecmds.c:14647 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "задать параметры отношения \"%s\" нельзя" -#: commands/tablecmds.c:14658 commands/view.c:445 +#: commands/tablecmds.c:14681 commands/view.c:445 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:14909 +#: commands/tablecmds.c:14932 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:14921 +#: commands/tablecmds.c:14944 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:15013 +#: commands/tablecmds.c:15036 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:15029 +#: commands/tablecmds.c:15052 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:15147 +#: commands/tablecmds.c:15170 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:15152 commands/tablecmds.c:15670 +#: commands/tablecmds.c:15175 commands/tablecmds.c:15693 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:15157 +#: commands/tablecmds.c:15180 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:15203 +#: commands/tablecmds.c:15226 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:15216 +#: commands/tablecmds.c:15239 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:15238 commands/tablecmds.c:18103 +#: commands/tablecmds.c:15261 commands/tablecmds.c:18126 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:15239 commands/tablecmds.c:18104 +#: commands/tablecmds.c:15262 commands/tablecmds.c:18127 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:15252 +#: commands/tablecmds.c:15275 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:15254 +#: commands/tablecmds.c:15277 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -12500,34 +12507,34 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:15457 +#: commands/tablecmds.c:15480 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "столбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:15466 +#: commands/tablecmds.c:15489 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:15471 +#: commands/tablecmds.c:15494 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть не генерируемым" -#: commands/tablecmds.c:15502 +#: commands/tablecmds.c:15525 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:15590 +#: commands/tablecmds.c:15613 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки " "\"%s\"" -#: commands/tablecmds.c:15598 +#: commands/tablecmds.c:15621 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -12536,7 +12543,7 @@ msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:15609 +#: commands/tablecmds.c:15632 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -12544,82 +12551,82 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:15648 +#: commands/tablecmds.c:15671 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:15734 +#: commands/tablecmds.c:15757 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "" "секция \"%s\" уже ожидает отсоединения от секционированной таблицы \"%s.%s\"" -#: commands/tablecmds.c:15763 commands/tablecmds.c:15811 +#: commands/tablecmds.c:15786 commands/tablecmds.c:15834 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:15817 +#: commands/tablecmds.c:15840 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:16045 +#: commands/tablecmds.c:16068 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:16075 +#: commands/tablecmds.c:16098 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:16086 +#: commands/tablecmds.c:16109 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:16095 +#: commands/tablecmds.c:16118 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:16109 +#: commands/tablecmds.c:16132 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:16161 +#: commands/tablecmds.c:16184 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:16335 +#: commands/tablecmds.c:16358 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:16341 +#: commands/tablecmds.c:16364 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс " "\"%s\"" -#: commands/tablecmds.c:16347 +#: commands/tablecmds.c:16370 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:16353 +#: commands/tablecmds.c:16376 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:16370 +#: commands/tablecmds.c:16393 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -12628,7 +12635,7 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:16377 +#: commands/tablecmds.c:16400 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -12637,13 +12644,13 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:16622 +#: commands/tablecmds.c:16645 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:16646 +#: commands/tablecmds.c:16669 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -12651,12 +12658,12 @@ msgstr "" "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:16648 +#: commands/tablecmds.c:16671 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:16693 +#: commands/tablecmds.c:16716 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -12665,7 +12672,7 @@ msgstr "" "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:16703 +#: commands/tablecmds.c:16726 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -12674,91 +12681,91 @@ msgstr "" "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:16761 +#: commands/tablecmds.c:16784 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:16866 +#: commands/tablecmds.c:16889 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:17290 +#: commands/tablecmds.c:17313 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - это не таблица и не материализованное представление" -#: commands/tablecmds.c:17440 +#: commands/tablecmds.c:17463 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:17470 +#: commands/tablecmds.c:17493 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "сменить схему индекса \"%s\" нельзя" -#: commands/tablecmds.c:17472 commands/tablecmds.c:17486 +#: commands/tablecmds.c:17495 commands/tablecmds.c:17509 #, c-format msgid "Change the schema of the table instead." msgstr "Однако возможно сменить владельца таблицы." -#: commands/tablecmds.c:17476 +#: commands/tablecmds.c:17499 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "сменить схему составного типа \"%s\" нельзя" -#: commands/tablecmds.c:17484 +#: commands/tablecmds.c:17507 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "сменить схему TOAST-таблицы \"%s\" нельзя" -#: commands/tablecmds.c:17516 +#: commands/tablecmds.c:17539 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:17582 +#: commands/tablecmds.c:17605 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:17590 +#: commands/tablecmds.c:17613 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:17601 commands/tablecmds.c:17691 +#: commands/tablecmds.c:17624 commands/tablecmds.c:17714 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:17674 +#: commands/tablecmds.c:17697 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:17721 +#: commands/tablecmds.c:17744 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" -#: commands/tablecmds.c:17730 +#: commands/tablecmds.c:17753 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:17751 +#: commands/tablecmds.c:17774 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:17786 +#: commands/tablecmds.c:17809 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -12767,7 +12774,7 @@ msgstr "" "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:17792 +#: commands/tablecmds.c:17815 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -12776,27 +12783,27 @@ msgstr "" "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:18043 +#: commands/tablecmds.c:18066 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:18049 +#: commands/tablecmds.c:18072 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:18065 +#: commands/tablecmds.c:18088 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18079 +#: commands/tablecmds.c:18102 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18113 +#: commands/tablecmds.c:18136 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -12804,7 +12811,7 @@ msgstr "" "подключить временное отношение в качестве секции постоянного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18121 +#: commands/tablecmds.c:18144 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -12812,92 +12819,92 @@ msgstr "" "подключить постоянное отношение в качестве секции временного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18129 +#: commands/tablecmds.c:18152 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:18136 +#: commands/tablecmds.c:18159 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:18156 +#: commands/tablecmds.c:18179 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:18159 +#: commands/tablecmds.c:18182 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:18171 +#: commands/tablecmds.c:18194 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:18173 +#: commands/tablecmds.c:18196 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Триггеры ROW с переходными таблицами для секций не поддерживаются." -#: commands/tablecmds.c:18352 +#: commands/tablecmds.c:18375 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:18355 +#: commands/tablecmds.c:18378 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:18672 +#: commands/tablecmds.c:18695 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " "умолчанию" -#: commands/tablecmds.c:18781 +#: commands/tablecmds.c:18804 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секционированная таблица \"%s\" была параллельно удалена" -#: commands/tablecmds.c:18787 +#: commands/tablecmds.c:18810 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19393 commands/tablecmds.c:19413 -#: commands/tablecmds.c:19434 commands/tablecmds.c:19453 -#: commands/tablecmds.c:19495 +#: commands/tablecmds.c:19424 commands/tablecmds.c:19444 +#: commands/tablecmds.c:19465 commands/tablecmds.c:19484 +#: commands/tablecmds.c:19526 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:19396 +#: commands/tablecmds.c:19427 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:19416 +#: commands/tablecmds.c:19447 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:19437 +#: commands/tablecmds.c:19468 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:19456 +#: commands/tablecmds.c:19487 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -12906,27 +12913,27 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:19498 +#: commands/tablecmds.c:19529 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:19734 +#: commands/tablecmds.c:19765 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:19741 +#: commands/tablecmds.c:19772 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablecmds.c:19767 +#: commands/tablecmds.c:19798 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:19777 +#: commands/tablecmds.c:19808 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" @@ -13295,18 +13302,18 @@ msgstr "триггер \"%s\" в отношении \"%s\" переименов msgid "permission denied: \"%s\" is a system trigger" msgstr "нет доступа: \"%s\" - это системный триггер" -#: commands/trigger.c:2386 +#: commands/trigger.c:2388 #, c-format msgid "trigger function %u returned null value" msgstr "триггерная функция %u вернула значение NULL" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 -#: commands/trigger.c:3270 +#: commands/trigger.c:2448 commands/trigger.c:2675 commands/trigger.c:2937 +#: commands/trigger.c:3300 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "триггер BEFORE STATEMENT не может возвращать значение" -#: commands/trigger.c:2522 +#: commands/trigger.c:2524 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " @@ -13314,7 +13321,7 @@ msgid "" msgstr "" "в триггере BEFORE FOR EACH ROW нельзя перемещать строку в другую секцию" -#: commands/trigger.c:2523 +#: commands/trigger.c:2525 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." @@ -13322,10 +13329,15 @@ msgstr "" "До выполнения триггера \"%s\" строка должна была находиться в секции \"%s." "%s\"." -#: commands/trigger.c:3348 executor/nodeModifyTable.c:1563 -#: executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2402 -#: executor/nodeModifyTable.c:2493 executor/nodeModifyTable.c:3054 -#: executor/nodeModifyTable.c:3193 +#: commands/trigger.c:2554 commands/trigger.c:2806 commands/trigger.c:3142 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "собрать переходные кортежи из дочерних сторонних таблиц нельзя" + +#: commands/trigger.c:3378 executor/nodeModifyTable.c:1564 +#: executor/nodeModifyTable.c:1638 executor/nodeModifyTable.c:2403 +#: executor/nodeModifyTable.c:2494 executor/nodeModifyTable.c:3055 +#: executor/nodeModifyTable.c:3194 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -13334,34 +13346,34 @@ msgstr "" "Возможно, для распространения изменений в другие строки следует использовать " "триггер AFTER вместо BEFORE." -#: commands/trigger.c:3389 executor/nodeLockRows.c:228 -#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:336 -#: executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2419 -#: executor/nodeModifyTable.c:2643 +#: commands/trigger.c:3419 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:337 +#: executor/nodeModifyTable.c:1580 executor/nodeModifyTable.c:2420 +#: executor/nodeModifyTable.c:2644 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалось сериализовать доступ из-за параллельного изменения" -#: commands/trigger.c:3397 executor/nodeModifyTable.c:1669 -#: executor/nodeModifyTable.c:2510 executor/nodeModifyTable.c:2667 -#: executor/nodeModifyTable.c:3072 +#: commands/trigger.c:3427 executor/nodeModifyTable.c:1670 +#: executor/nodeModifyTable.c:2511 executor/nodeModifyTable.c:2668 +#: executor/nodeModifyTable.c:3073 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" -#: commands/trigger.c:4606 +#: commands/trigger.c:4636 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя вызвать отложенный " "триггер" -#: commands/trigger.c:5787 +#: commands/trigger.c:5817 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не является откладываемым" -#: commands/trigger.c:5810 +#: commands/trigger.c:5840 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не существует" @@ -13861,7 +13873,7 @@ msgid "" msgstr "Создавать роли с атрибутом %s могут только роли с атрибутом %s." #: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 -#: utils/adt/acl.c:5401 utils/adt/acl.c:5407 gram.y:16733 gram.y:16779 +#: utils/adt/acl.c:5418 utils/adt/acl.c:5424 gram.y:16740 gram.y:16786 #, c-format msgid "role name \"%s\" is reserved" msgstr "имя роли \"%s\" зарезервировано" @@ -13970,8 +13982,8 @@ msgstr "использовать специальную роль в DROP ROLE н #: commands/user.c:1136 commands/user.c:1358 commands/variable.c:851 #: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 -#: utils/adt/acl.c:356 utils/adt/acl.c:376 utils/adt/acl.c:5256 -#: utils/adt/acl.c:5304 utils/adt/acl.c:5332 utils/adt/acl.c:5351 +#: utils/adt/acl.c:373 utils/adt/acl.c:393 utils/adt/acl.c:5273 +#: utils/adt/acl.c:5321 utils/adt/acl.c:5349 utils/adt/acl.c:5368 #: utils/adt/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" @@ -14188,12 +14200,12 @@ msgid "" msgstr "" "Только роли с правами роли \"%s\" могут отзывать права от имени этой роли." -#: commands/user.c:2492 utils/adt/acl.c:1309 +#: commands/user.c:2492 utils/adt/acl.c:1326 #, c-format msgid "dependent privileges exist" msgstr "существуют зависимые права" -#: commands/user.c:2493 utils/adt/acl.c:1310 +#: commands/user.c:2493 utils/adt/acl.c:1327 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Используйте CASCADE, чтобы отозвать и их." @@ -14273,42 +14285,42 @@ msgstr "ONLY_DATABASE_STATS нельзя задавать с другими па msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s нельзя выполнить в ходе VACUUM или ANALYZE" -#: commands/vacuum.c:735 +#: commands/vacuum.c:743 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "нет доступа для очистки отношения \"%s\", оно пропускается" -#: commands/vacuum.c:748 +#: commands/vacuum.c:756 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "нет доступа для анализа отношения \"%s\", оно пропускается" -#: commands/vacuum.c:826 commands/vacuum.c:923 +#: commands/vacuum.c:834 commands/vacuum.c:931 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очистка \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:831 +#: commands/vacuum.c:839 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очистка \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:847 commands/vacuum.c:928 +#: commands/vacuum.c:855 commands/vacuum.c:936 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "анализ \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:852 +#: commands/vacuum.c:860 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "анализ \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:1163 +#: commands/vacuum.c:1171 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "момент отсечки для удаления и замораживания кортежей далеко в прошлом" -#: commands/vacuum.c:1164 commands/vacuum.c:1169 +#: commands/vacuum.c:1172 commands/vacuum.c:1177 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -14320,42 +14332,42 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: commands/vacuum.c:1168 +#: commands/vacuum.c:1176 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "момент отсечки для замораживания мультитранзакций далеко в прошлом" -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1932 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "есть базы данных, которые не очищались на протяжении более чем 2 миллиардов " "транзакций" -#: commands/vacuum.c:1925 +#: commands/vacuum.c:1933 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Возможно, вы уже потеряли данные в результате зацикливания ID транзакций." -#: commands/vacuum.c:2094 +#: commands/vacuum.c:2109 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" пропускается --- очищать не таблицы или специальные системные таблицы " "нельзя" -#: commands/vacuum.c:2519 +#: commands/vacuum.c:2531 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "просканирован индекс \"%s\", удалено версий строк: %d" -#: commands/vacuum.c:2538 +#: commands/vacuum.c:2550 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "индекс \"%s\" теперь содержит версий строк: %.0f, в страницах: %u" -#: commands/vacuum.c:2542 +#: commands/vacuum.c:2554 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -14656,26 +14668,26 @@ msgstr "не найдено значение параметра %d" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 #: executor/execExprInterp.c:4246 executor/execExprInterp.c:4263 -#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:205 -#: executor/nodeModifyTable.c:224 executor/nodeModifyTable.c:241 -#: executor/nodeModifyTable.c:251 executor/nodeModifyTable.c:261 +#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:206 +#: executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:252 executor/nodeModifyTable.c:262 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип строки таблицы отличается от типа строки-результата запроса" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:206 +#: executor/execExpr.c:638 executor/nodeModifyTable.c:207 #, c-format msgid "Query has too many columns." msgstr "Запрос возвращает больше столбцов." -#: executor/execExpr.c:645 executor/nodeModifyTable.c:225 +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." #: executor/execExpr.c:651 executor/execExprInterp.c:4264 -#: executor/nodeModifyTable.c:252 +#: executor/nodeModifyTable.c:253 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "" @@ -15378,18 +15390,18 @@ msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение слиянием" -#: executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:243 #, c-format msgid "Query provides a value for a generated column at ordinal position %d." msgstr "" "Запрос выдаёт значение для генерируемого столбца (с порядковым номером %d)." -#: executor/nodeModifyTable.c:262 +#: executor/nodeModifyTable.c:263 #, c-format msgid "Query has too few columns." msgstr "Запрос возвращает меньше столбцов." -#: executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 +#: executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " @@ -15398,12 +15410,12 @@ msgstr "" "кортеж, который должен быть удалён, уже модифицирован в операции, вызванной " "текущей командой" -#: executor/nodeModifyTable.c:1791 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "invalid ON UPDATE specification" msgstr "неверное указание ON UPDATE" -#: executor/nodeModifyTable.c:1792 +#: executor/nodeModifyTable.c:1793 #, c-format msgid "" "The result tuple would appear in a different partition than the original " @@ -15412,7 +15424,7 @@ msgstr "" "Результирующий кортеж окажется перемещённым из секции исходного кортежа в " "другую." -#: executor/nodeModifyTable.c:2251 +#: executor/nodeModifyTable.c:2252 #, c-format msgid "" "cannot move tuple across partitions when a non-root ancestor of the source " @@ -15421,26 +15433,26 @@ msgstr "" "нельзя переместить кортеж между секциями, когда внешний ключ непосредственно " "ссылается на предка исходной секции, который не является корнем иерархии" -#: executor/nodeModifyTable.c:2252 +#: executor/nodeModifyTable.c:2253 #, c-format msgid "" "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" "Внешний ключ ссылается на предка \"%s\", а не на корневого предка \"%s\"." -#: executor/nodeModifyTable.c:2255 +#: executor/nodeModifyTable.c:2256 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Возможно, имеет смысл перенацелить внешний ключ на таблицу \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2621 executor/nodeModifyTable.c:3060 -#: executor/nodeModifyTable.c:3199 +#: executor/nodeModifyTable.c:2622 executor/nodeModifyTable.c:3061 +#: executor/nodeModifyTable.c:3200 #, c-format msgid "%s command cannot affect row a second time" msgstr "команда %s не может подействовать на строку дважды" -#: executor/nodeModifyTable.c:2623 +#: executor/nodeModifyTable.c:2624 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " @@ -15449,7 +15461,7 @@ msgstr "" "Проверьте, не содержат ли строки, которые должна добавить команда, " "дублирующиеся значения, подпадающие под ограничения." -#: executor/nodeModifyTable.c:3053 executor/nodeModifyTable.c:3192 +#: executor/nodeModifyTable.c:3054 executor/nodeModifyTable.c:3193 #, c-format msgid "" "tuple to be updated or deleted was already modified by an operation " @@ -15458,14 +15470,14 @@ msgstr "" "кортеж, который должен быть изменён или удалён, уже модифицирован в " "операции, вызванной текущей командой" -#: executor/nodeModifyTable.c:3062 executor/nodeModifyTable.c:3201 +#: executor/nodeModifyTable.c:3063 executor/nodeModifyTable.c:3202 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "" "Проверьте, не может ли какой-либо целевой строке соответствовать более одной " "исходной строки." -#: executor/nodeModifyTable.c:3151 +#: executor/nodeModifyTable.c:3152 #, c-format msgid "" "tuple to be deleted was already moved to another partition due to concurrent " @@ -15634,13 +15646,13 @@ msgstr "не удалось передать кортеж в очередь в msgid "user mapping not found for \"%s\"" msgstr "сопоставление пользователя для \"%s\" не найдено" -#: foreign/foreign.c:333 optimizer/plan/createplan.c:7102 +#: foreign/foreign.c:333 optimizer/plan/createplan.c:7104 #: optimizer/util/plancat.c:512 #, c-format msgid "access to non-system foreign table is restricted" msgstr "доступ к несистемным сторонним таблицам ограничен" -#: foreign/foreign.c:657 storage/file/fd.c:3931 +#: foreign/foreign.c:657 storage/file/fd.c:3928 #, c-format msgid "invalid option \"%s\"" msgstr "неверный параметр \"%s\"" @@ -15834,94 +15846,94 @@ msgstr "Некорректное подтверждение в последне msgid "Garbage found at the end of client-final-message." msgstr "Мусор в конце последнего сообщения клиента." -#: libpq/auth.c:271 +#: libpq/auth.c:279 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: не разрешённый компьютер" -#: libpq/auth.c:274 +#: libpq/auth.c:282 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (\"trust\")" -#: libpq/auth.c:277 +#: libpq/auth.c:285 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Ident)" -#: libpq/auth.c:280 +#: libpq/auth.c:288 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Peer)" -#: libpq/auth.c:285 +#: libpq/auth.c:293 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по паролю)" -#: libpq/auth.c:290 +#: libpq/auth.c:298 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (GSSAPI)" -#: libpq/auth.c:293 +#: libpq/auth.c:301 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (SSPI)" -#: libpq/auth.c:296 +#: libpq/auth.c:304 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (PAM)" -#: libpq/auth.c:299 +#: libpq/auth.c:307 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (BSD)" -#: libpq/auth.c:302 +#: libpq/auth.c:310 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (LDAP)" -#: libpq/auth.c:305 +#: libpq/auth.c:313 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по сертификату)" -#: libpq/auth.c:308 +#: libpq/auth.c:316 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (RADIUS)" -#: libpq/auth.c:311 +#: libpq/auth.c:319 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: неверный метод проверки" -#: libpq/auth.c:315 +#: libpq/auth.c:323 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Подключение соответствует строке %2$d в \"%1$s\": \"%3$s\"" -#: libpq/auth.c:359 +#: libpq/auth.c:367 #, c-format msgid "authentication identifier set more than once" msgstr "аутентификационный идентификатор указан повторно" -#: libpq/auth.c:360 +#: libpq/auth.c:368 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "предыдущий идентификатор: \"%s\"; новый: \"%s\"" -#: libpq/auth.c:370 +#: libpq/auth.c:378 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "соединение аутентифицировано: идентификатор=\"%s\" метод=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:418 #, c-format msgid "" "client certificates can only be checked if a root certificate store is " @@ -15930,25 +15942,25 @@ msgstr "" "сертификаты клиентов могут проверяться, только если доступно хранилище " "корневых сертификатов" -#: libpq/auth.c:421 +#: libpq/auth.c:429 #, c-format msgid "connection requires a valid client certificate" msgstr "для подключения требуется годный сертификат клиента" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:460 libpq/auth.c:506 msgid "GSS encryption" msgstr "Шифрование GSS" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "SSL encryption" msgstr "Шифрование SSL" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:465 libpq/auth.c:511 msgid "no encryption" msgstr "без шифрования" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:471 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -15957,7 +15969,7 @@ msgstr "" "пользователь \"%s\", \"%s\"" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:478 #, c-format msgid "" "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database " @@ -15966,38 +15978,38 @@ msgstr "" "pg_hba.conf отвергает подключение: компьютер \"%s\", пользователь \"%s\", " "база данных \"%s\", %s" -#: libpq/auth.c:508 +#: libpq/auth.c:516 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "IP-адрес клиента разрешается в \"%s\", соответствует прямому преобразованию." -#: libpq/auth.c:511 +#: libpq/auth.c:519 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "IP-адрес клиента разрешается в \"%s\", прямое преобразование не проверялось." -#: libpq/auth.c:514 +#: libpq/auth.c:522 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "IP-адрес клиента разрешается в \"%s\", это не соответствует прямому " "преобразованию." -#: libpq/auth.c:517 +#: libpq/auth.c:525 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "" "Преобразовать имя клиентского компьютера \"%s\" в IP-адрес не удалось: %s." -#: libpq/auth.c:522 +#: libpq/auth.c:530 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Получить имя компьютера из IP-адреса клиента не удалось: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:538 #, c-format msgid "" "no pg_hba.conf entry for replication connection from host \"%s\", user " @@ -16007,29 +16019,29 @@ msgstr "" "компьютера \"%s\" для пользователя \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:546 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "в pg_hba.conf нет записи для компьютера \"%s\", пользователя \"%s\", базы " "\"%s\", %s" -#: libpq/auth.c:711 +#: libpq/auth.c:719 #, c-format msgid "expected password response, got message type %d" msgstr "ожидался ответ с паролем, но получено сообщение %d" -#: libpq/auth.c:732 +#: libpq/auth.c:740 #, c-format msgid "invalid password packet size" msgstr "неверный размер пакета с паролем" -#: libpq/auth.c:750 +#: libpq/auth.c:758 #, c-format msgid "empty password returned by client" msgstr "клиент возвратил пустой пароль" -#: libpq/auth.c:877 libpq/hba.c:1727 +#: libpq/auth.c:885 libpq/hba.c:1727 #, c-format msgid "" "MD5 authentication is not supported when \"db_user_namespace\" is enabled" @@ -16037,215 +16049,215 @@ msgstr "" "проверка подлинности MD5 не поддерживается, когда включён режим " "\"db_user_namespace\"" -#: libpq/auth.c:883 +#: libpq/auth.c:891 #, c-format msgid "could not generate random MD5 salt" msgstr "не удалось сгенерировать случайную соль для MD5" -#: libpq/auth.c:934 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:942 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "не удалось задать переменную окружения: %m" -#: libpq/auth.c:973 +#: libpq/auth.c:981 #, c-format msgid "expected GSS response, got message type %d" msgstr "ожидался ответ GSS, но получено сообщение %d" -#: libpq/auth.c:1039 +#: libpq/auth.c:1047 msgid "accepting GSS security context failed" msgstr "принять контекст безопасности GSS не удалось" -#: libpq/auth.c:1080 +#: libpq/auth.c:1088 msgid "retrieving GSS user name failed" msgstr "получить имя пользователя GSS не удалось" -#: libpq/auth.c:1226 +#: libpq/auth.c:1234 msgid "could not acquire SSPI credentials" msgstr "не удалось получить удостоверение SSPI" -#: libpq/auth.c:1251 +#: libpq/auth.c:1259 #, c-format msgid "expected SSPI response, got message type %d" msgstr "ожидался ответ SSPI, но получено сообщение %d" -#: libpq/auth.c:1329 +#: libpq/auth.c:1337 msgid "could not accept SSPI security context" msgstr "принять контекст безопасности SSPI не удалось" -#: libpq/auth.c:1370 +#: libpq/auth.c:1378 msgid "could not get token from SSPI security context" msgstr "не удалось получить маркер из контекста безопасности SSPI" -#: libpq/auth.c:1506 libpq/auth.c:1525 +#: libpq/auth.c:1514 libpq/auth.c:1533 #, c-format msgid "could not translate name" msgstr "не удалось преобразовать имя" -#: libpq/auth.c:1538 +#: libpq/auth.c:1546 #, c-format msgid "realm name too long" msgstr "имя области слишком длинное" -#: libpq/auth.c:1553 +#: libpq/auth.c:1561 #, c-format msgid "translated account name too long" msgstr "преобразованное имя учётной записи слишком длинное" -#: libpq/auth.c:1732 +#: libpq/auth.c:1740 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не удалось создать сокет для подключения к серверу Ident: %m" -#: libpq/auth.c:1747 +#: libpq/auth.c:1755 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не удалось привязаться к локальному адресу \"%s\": %m" -#: libpq/auth.c:1759 +#: libpq/auth.c:1767 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не удалось подключиться к серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1781 +#: libpq/auth.c:1789 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось отправить запрос серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1798 +#: libpq/auth.c:1806 #, c-format msgid "" "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось получить ответ от сервера Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1808 +#: libpq/auth.c:1816 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неверно форматированный ответ от сервера Ident: \"%s\"" -#: libpq/auth.c:1861 +#: libpq/auth.c:1869 #, c-format msgid "peer authentication is not supported on this platform" msgstr "проверка подлинности peer в этой ОС не поддерживается" -#: libpq/auth.c:1865 +#: libpq/auth.c:1873 #, c-format msgid "could not get peer credentials: %m" msgstr "не удалось получить данные пользователя через механизм peer: %m" -#: libpq/auth.c:1877 +#: libpq/auth.c:1885 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "найти локального пользователя по идентификатору (%ld) не удалось: %s" -#: libpq/auth.c:1979 +#: libpq/auth.c:1987 #, c-format msgid "error from underlying PAM layer: %s" msgstr "ошибка в нижележащем слое PAM: %s" -#: libpq/auth.c:1990 +#: libpq/auth.c:1998 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "неподдерживаемое сообщение ответа PAM %d/\"%s\"" -#: libpq/auth.c:2047 +#: libpq/auth.c:2055 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не удалось создать аутентификатор PAM: %s" -#: libpq/auth.c:2058 +#: libpq/auth.c:2066 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "ошибка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2090 +#: libpq/auth.c:2098 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "ошибка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2102 +#: libpq/auth.c:2110 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "ошибка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2115 +#: libpq/auth.c:2123 #, c-format msgid "pam_authenticate failed: %s" msgstr "ошибка в pam_authenticate: %s" -#: libpq/auth.c:2128 +#: libpq/auth.c:2136 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "ошибка в pam_acct_mgmt: %s" -#: libpq/auth.c:2139 +#: libpq/auth.c:2147 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не удалось освободить аутентификатор PAM: %s" -#: libpq/auth.c:2219 +#: libpq/auth.c:2227 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не удалось инициализировать LDAP (код ошибки: %d)" -#: libpq/auth.c:2256 +#: libpq/auth.c:2264 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не удалось извлечь имя домена из ldapbasedn" -#: libpq/auth.c:2264 +#: libpq/auth.c:2272 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "для аутентификации LDAP не удалось найти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2266 +#: libpq/auth.c:2274 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Задайте имя сервера LDAP явным образом." -#: libpq/auth.c:2318 +#: libpq/auth.c:2326 #, c-format msgid "could not initialize LDAP: %s" msgstr "не удалось инициализировать LDAP: %s" -#: libpq/auth.c:2328 +#: libpq/auth.c:2336 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps с текущей библиотекой LDAP не поддерживается" -#: libpq/auth.c:2336 +#: libpq/auth.c:2344 #, c-format msgid "could not initialize LDAP: %m" msgstr "не удалось инициализировать LDAP: %m" -#: libpq/auth.c:2346 +#: libpq/auth.c:2354 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не удалось задать версию протокола LDAP: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2370 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не удалось начать сеанс LDAP TLS: %s" -#: libpq/auth.c:2439 +#: libpq/auth.c:2447 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-сервер не задан и значение ldapbasedn не определено" -#: libpq/auth.c:2446 +#: libpq/auth.c:2454 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не определён" -#: libpq/auth.c:2508 +#: libpq/auth.c:2516 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "недопустимый символ в имени пользователя для проверки подлинности LDAP" -#: libpq/auth.c:2525 +#: libpq/auth.c:2533 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -16254,28 +16266,28 @@ msgstr "" "не удалось выполнить начальную привязку LDAP для ldapbinddn \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2555 +#: libpq/auth.c:2563 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "" "не удалось выполнить LDAP-поиск по фильтру \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2571 +#: libpq/auth.c:2579 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "в LDAP нет пользователя \"%s\"" -#: libpq/auth.c:2572 +#: libpq/auth.c:2580 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" не вернул результатов" -#: libpq/auth.c:2576 +#: libpq/auth.c:2584 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "пользователь LDAP \"%s\" не уникален" -#: libpq/auth.c:2577 +#: libpq/auth.c:2585 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" @@ -16284,7 +16296,7 @@ msgstr[0] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" msgstr[1] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записи." msgstr[2] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записей." -#: libpq/auth.c:2597 +#: libpq/auth.c:2605 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" @@ -16292,24 +16304,24 @@ msgstr "" "не удалось получить dn для первого результата, соответствующего \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2618 +#: libpq/auth.c:2626 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "" "не удалось отвязаться после поиска пользователя \"%s\" на сервере \"%s\"" -#: libpq/auth.c:2649 +#: libpq/auth.c:2657 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "" "ошибка при регистрации в LDAP пользователя \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2681 +#: libpq/auth.c:2689 #, c-format msgid "LDAP diagnostics: %s" msgstr "Диагностика LDAP: %s" -#: libpq/auth.c:2719 +#: libpq/auth.c:2727 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -16318,7 +16330,7 @@ msgstr "" "ошибка проверки подлинности пользователя \"%s\" по сертификату: сертификат " "клиента не содержит имя пользователя" -#: libpq/auth.c:2740 +#: libpq/auth.c:2748 #, c-format msgid "" "certificate authentication failed for user \"%s\": unable to retrieve " @@ -16327,7 +16339,7 @@ msgstr "" "пользователь \"%s\" не прошёл проверку подлинности по сертификату: не " "удалось получить DN субъекта" -#: libpq/auth.c:2763 +#: libpq/auth.c:2771 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": DN " @@ -16336,7 +16348,7 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается DN" -#: libpq/auth.c:2768 +#: libpq/auth.c:2776 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " @@ -16345,99 +16357,99 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается CN" -#: libpq/auth.c:2870 +#: libpq/auth.c:2878 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не определён" -#: libpq/auth.c:2877 +#: libpq/auth.c:2885 #, c-format msgid "RADIUS secret not specified" msgstr "секрет RADIUS не определён" # well-spelled: симв -#: libpq/auth.c:2891 +#: libpq/auth.c:2899 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "проверка подлинности RADIUS не поддерживает пароли длиннее %d симв." -#: libpq/auth.c:2993 libpq/hba.c:2369 +#: libpq/auth.c:3001 libpq/hba.c:2369 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не удалось преобразовать имя сервера RADIUS \"%s\" в адрес: %s" -#: libpq/auth.c:3007 +#: libpq/auth.c:3015 #, c-format msgid "could not generate random encryption vector" msgstr "не удалось сгенерировать случайный вектор шифрования" -#: libpq/auth.c:3044 +#: libpq/auth.c:3052 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "не удалось вычислить MD5-хеш пароля: %s" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не удалось создать сокет RADIUS: %m" -#: libpq/auth.c:3087 +#: libpq/auth.c:3095 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не удалось привязаться к локальному сокету RADIUS: %m" -#: libpq/auth.c:3097 +#: libpq/auth.c:3105 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не удалось отправить пакет RADIUS: %m" -#: libpq/auth.c:3131 libpq/auth.c:3157 +#: libpq/auth.c:3139 libpq/auth.c:3165 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "превышено время ожидания ответа RADIUS от %s" -#: libpq/auth.c:3150 +#: libpq/auth.c:3158 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не удалось проверить состояние сокета RADIUS: %m" -#: libpq/auth.c:3180 +#: libpq/auth.c:3188 #, c-format msgid "could not read RADIUS response: %m" msgstr "не удалось прочитать ответ RADIUS: %m" -#: libpq/auth.c:3188 +#: libpq/auth.c:3196 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "ответ RADIUS от %s был отправлен с неверного порта: %d" -#: libpq/auth.c:3196 +#: libpq/auth.c:3204 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "слишком короткий ответ RADIUS от %s: %d" -#: libpq/auth.c:3203 +#: libpq/auth.c:3211 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "в ответе RADIUS от %s испорчена длина: %d (фактическая длина %d)" -#: libpq/auth.c:3211 +#: libpq/auth.c:3219 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "пришёл ответ RADIUS от %s на другой запрос: %d (ожидался %d)" -#: libpq/auth.c:3236 +#: libpq/auth.c:3244 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "не удалось вычислить MD5-хеш для принятого пакета: %s" -#: libpq/auth.c:3246 +#: libpq/auth.c:3254 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "ответ RADIUS от %s содержит неверную подпись MD5" -#: libpq/auth.c:3264 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "ответ RADIUS от %s содержит неверный код (%d) для пользователя \"%s\"" @@ -16553,44 +16565,39 @@ msgstr "" "он принадлежит пользователю сервера, либо u=rw,g=r (0640) или более строгие, " "если он принадлежит root." -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "сервер попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "ошибка развёртывания сообщения в GSSAPI" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "входящее сообщение GSSAPI не защищено" -#: libpq/be-secure-gssapi.c:575 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %d)" - -#: libpq/be-secure-gssapi.c:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "принять контекст безопасности GSSAPI не удалось" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" @@ -17809,7 +17816,7 @@ msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение " "слиянием или хеш-соединение" -#: optimizer/plan/createplan.c:7124 parser/parse_merge.c:187 +#: optimizer/plan/createplan.c:7126 parser/parse_merge.c:187 #: parser/parse_merge.c:194 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -21163,32 +21170,32 @@ msgid "could not fork autovacuum worker process: %m" msgstr "не удалось породить рабочий процесс автоочистки: %m" # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2355 +#: postmaster/autovacuum.c:2370 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: удаление устаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2591 +#: postmaster/autovacuum.c:2613 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматическая очистка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2594 +#: postmaster/autovacuum.c:2616 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматический анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2788 +#: postmaster/autovacuum.c:2812 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей записи для отношения \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3402 +#: postmaster/autovacuum.c:3439 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3403 +#: postmaster/autovacuum.c:3440 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." @@ -21277,7 +21284,7 @@ msgid "" "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Возможно, стоит увеличить параметр \"max_worker_processes\"." -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:434 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -21285,17 +21292,17 @@ msgstr[0] "контрольные точки происходят слишком msgstr[1] "контрольные точки происходят слишком часто (через %d сек.)" msgstr[2] "контрольные точки происходят слишком часто (через %d сек.)" -#: postmaster/checkpointer.c:435 +#: postmaster/checkpointer.c:438 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Возможно, стоит увеличить параметр \"max_wal_size\"." -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1065 #, c-format msgid "checkpoint request failed" msgstr "сбой при запросе контрольной точки" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1066 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Смотрите подробности в протоколе сервера." @@ -22255,19 +22262,19 @@ msgstr "" "для логического декодирования на ведомом сервере требуется wal_level >= " "logical на ведущем" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:344 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "нельзя запустить процессы-обработчики логической репликации при " "max_replication_slots = 0" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:437 #, c-format msgid "out of logical replication worker slots" msgstr "недостаточно слотов для процессов логической репликации" -#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 +#: replication/logical/launcher.c:438 replication/logical/launcher.c:512 #: replication/slot.c:1297 storage/lmgr/lock.c:998 storage/lmgr/lock.c:1036 #: storage/lmgr/lock.c:2831 storage/lmgr/lock.c:4216 storage/lmgr/lock.c:4281 #: storage/lmgr/lock.c:4631 storage/lmgr/predicate.c:2418 @@ -22276,18 +22283,18 @@ msgstr "недостаточно слотов для процессов логи msgid "You might need to increase %s." msgstr "Возможно, следует увеличить параметр %s." -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:511 #, c-format msgid "out of background worker slots" msgstr "недостаточно слотов для фоновых рабочих процессов" -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:718 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "" "слот обработчика логической репликации %d пуст, подключиться к нему нельзя" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:727 #, c-format msgid "" "logical replication worker slot %d is already used by another worker, cannot " @@ -22566,19 +22573,19 @@ msgstr "" msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логической репликации \"%s.%s\" не существует" -#: replication/logical/reorderbuffer.c:3941 +#: replication/logical/reorderbuffer.c:4070 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:4287 -#: replication/logical/reorderbuffer.c:4312 +#: replication/logical/reorderbuffer.c:4416 +#: replication/logical/reorderbuffer.c:4441 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать файл подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:4291 -#: replication/logical/reorderbuffer.c:4316 +#: replication/logical/reorderbuffer.c:4420 +#: replication/logical/reorderbuffer.c:4445 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -22586,13 +22593,13 @@ msgstr "" "не удалось прочитать файл подкачки буфера пересортировки (прочитано байт: " "%d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:4566 +#: replication/logical/reorderbuffer.c:4695 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "" "ошибка при удалении файла \"%s\" в процессе удаления pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5062 +#: replication/logical/reorderbuffer.c:5191 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d, требовалось: %d)" @@ -22615,63 +22622,63 @@ msgstr[1] "" msgstr[2] "" "экспортирован снимок логического декодирования: \"%s\" (ид. транзакций: %u)" -#: replication/logical/snapbuild.c:1431 replication/logical/snapbuild.c:1528 -#: replication/logical/snapbuild.c:2044 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1536 +#: replication/logical/snapbuild.c:2052 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "процесс логического декодирования достиг точки согласованности в %X/%X" -#: replication/logical/snapbuild.c:1433 +#: replication/logical/snapbuild.c:1441 #, c-format msgid "There are no running transactions." msgstr "Больше активных транзакций нет." -#: replication/logical/snapbuild.c:1480 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "" "процесс логического декодирования нашёл начальную стартовую точку в %X/%X" -#: replication/logical/snapbuild.c:1482 replication/logical/snapbuild.c:1506 +#: replication/logical/snapbuild.c:1490 replication/logical/snapbuild.c:1514 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Ожидание транзакций (примерно %d), старее %u до конца." -#: replication/logical/snapbuild.c:1504 +#: replication/logical/snapbuild.c:1512 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "" "при логическом декодировании найдена начальная точка согласованности в %X/%X" -#: replication/logical/snapbuild.c:1530 +#: replication/logical/snapbuild.c:1538 #, c-format msgid "There are no old transactions anymore." msgstr "Больше старых транзакций нет." -#: replication/logical/snapbuild.c:1931 +#: replication/logical/snapbuild.c:1939 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/logical/snapbuild.c:1937 +#: replication/logical/snapbuild.c:1945 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную версию (%u вместо %u)" -#: replication/logical/snapbuild.c:1978 +#: replication/logical/snapbuild.c:1986 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "в файле состояния snapbuild \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/logical/snapbuild.c:2046 +#: replication/logical/snapbuild.c:2054 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логическое декодирование начнётся с сохранённого снимка." -#: replication/logical/snapbuild.c:2153 +#: replication/logical/snapbuild.c:2161 #, c-format msgid "could not parse file name \"%s\"" msgstr "не удалось разобрать имя файла \"%s\"" @@ -22685,7 +22692,7 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" закончил обработку" -#: replication/logical/tablesync.c:639 +#: replication/logical/tablesync.c:665 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will restart so " @@ -22694,25 +22701,25 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "перезапущен, чтобы можно было включить режим two_phase" -#: replication/logical/tablesync.c:814 replication/logical/tablesync.c:956 +#: replication/logical/tablesync.c:840 replication/logical/tablesync.c:982 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о таблице \"%s.%s\" с сервера публикации: %s" -#: replication/logical/tablesync.c:821 +#: replication/logical/tablesync.c:847 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблица \"%s.%s\" не найдена на сервере публикации" -#: replication/logical/tablesync.c:879 +#: replication/logical/tablesync.c:905 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о списке столбцов таблицы \"%s.%s\" с сервера " "публикации: %s" -#: replication/logical/tablesync.c:1058 +#: replication/logical/tablesync.c:1084 #, c-format msgid "" "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: " @@ -22721,25 +22728,25 @@ msgstr "" "не удалось получить информацию о предложении WHERE таблицы \"%s.%s\" с " "сервера публикации: %s" -#: replication/logical/tablesync.c:1217 +#: replication/logical/tablesync.c:1243 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1418 +#: replication/logical/tablesync.c:1444 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось начать транзакцию на сервере публикации: " "%s" -#: replication/logical/tablesync.c:1460 +#: replication/logical/tablesync.c:1486 #, c-format msgid "replication origin \"%s\" already exists" msgstr "источник репликации \"%s\" уже существует" -#: replication/logical/tablesync.c:1493 replication/logical/worker.c:2376 +#: replication/logical/tablesync.c:1519 replication/logical/worker.c:2376 #, c-format msgid "" "user \"%s\" cannot replicate into relation with row-level security enabled: " @@ -22748,7 +22755,7 @@ msgstr "" "пользователь \"%s\" не может реплицировать данные в отношение с включённой " "защитой на уровне строк: \"%s\"" -#: replication/logical/tablesync.c:1506 +#: replication/logical/tablesync.c:1532 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" @@ -22888,29 +22895,29 @@ msgstr "" msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/logical/worker.c:4791 +#: replication/logical/worker.c:4807 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "подписка \"%s\" была отключена из-за ошибки" -#: replication/logical/worker.c:4839 +#: replication/logical/worker.c:4855 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации начинает пропускать транзакцию с LSN %X/%X" -#: replication/logical/worker.c:4853 +#: replication/logical/worker.c:4869 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации завершил пропуск транзакции с LSN %X/%X" -#: replication/logical/worker.c:4935 +#: replication/logical/worker.c:4957 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "значение skip-LSN для подписки \"%s\" очищено" -#: replication/logical/worker.c:4936 +#: replication/logical/worker.c:4958 #, c-format msgid "" "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " @@ -22919,7 +22926,7 @@ msgstr "" "Позиция завершения удалённой транзакции в WAL (LSN) %X/%X не совпала со " "значением skip-LSN %X/%X." -#: replication/logical/worker.c:4962 +#: replication/logical/worker.c:4986 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22928,7 +22935,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\"" -#: replication/logical/worker.c:4966 +#: replication/logical/worker.c:4990 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22937,7 +22944,7 @@ msgstr "" "обработка внешних данных из источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u" -#: replication/logical/worker.c:4971 +#: replication/logical/worker.c:4995 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22946,7 +22953,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:4982 +#: replication/logical/worker.c:5006 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22956,7 +22963,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u" -#: replication/logical/worker.c:4989 +#: replication/logical/worker.c:5013 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22967,7 +22974,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:5000 +#: replication/logical/worker.c:5024 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22978,7 +22985,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " "\"%s\", в транзакции %u" -#: replication/logical/worker.c:5008 +#: replication/logical/worker.c:5032 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23572,7 +23579,7 @@ msgstr "неверный тип сообщения резервного серв msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2453 +#: replication/walsender.c:2457 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процесса передачи журнала из-за тайм-аута репликации" @@ -24198,105 +24205,105 @@ msgstr "ошибка удаления набора файлов \"%s\": %m" msgid "could not truncate file \"%s\": %m" msgstr "не удалось обрезать файл \"%s\": %m" -#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 +#: storage/file/fd.c:534 storage/file/fd.c:606 storage/file/fd.c:642 #, c-format msgid "could not flush dirty data: %m" msgstr "не удалось сбросить грязные данные: %m" -#: storage/file/fd.c:567 +#: storage/file/fd.c:564 #, c-format msgid "could not determine dirty data size: %m" msgstr "не удалось определить размер грязных данных: %m" -#: storage/file/fd.c:619 +#: storage/file/fd.c:616 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ошибка в munmap() при сбросе данных на диск: %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:934 #, c-format msgid "getrlimit failed: %m" msgstr "ошибка в getrlimit(): %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1024 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостаточно дескрипторов файлов для запуска серверного процесса" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1025 #, c-format msgid "System allows %d, server needs at least %d." msgstr "Система может выделить: %d, серверу требуется минимум: %d." -#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 -#: storage/file/fd.c:2825 +#: storage/file/fd.c:1113 storage/file/fd.c:2562 storage/file/fd.c:2671 +#: storage/file/fd.c:2822 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "нехватка дескрипторов файлов: %m; освободите их и повторите попытку" -#: storage/file/fd.c:1490 +#: storage/file/fd.c:1487 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "временный файл: путь \"%s\", размер %lu" -#: storage/file/fd.c:1629 +#: storage/file/fd.c:1626 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "не удалось создать временный каталог \"%s\": %m" -#: storage/file/fd.c:1636 +#: storage/file/fd.c:1633 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "не удалось создать временный подкаталог \"%s\": %m" -#: storage/file/fd.c:1833 +#: storage/file/fd.c:1830 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "не удалось создать временный файл \"%s\": %m" -#: storage/file/fd.c:1869 +#: storage/file/fd.c:1866 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: storage/file/fd.c:1910 +#: storage/file/fd.c:1907 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "ошибка удаления временного файла \"%s\": %m" -#: storage/file/fd.c:1998 +#: storage/file/fd.c:1995 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ошибка удаления файла \"%s\": %m" -#: storage/file/fd.c:2185 +#: storage/file/fd.c:2182 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "размер временного файла превышает предел temp_file_limit (%d КБ)" -#: storage/file/fd.c:2541 storage/file/fd.c:2600 +#: storage/file/fd.c:2538 storage/file/fd.c:2597 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "превышен предел maxAllocatedDescs (%d) при попытке открыть файл \"%s\"" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2642 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке выполнить команду \"%s\"" -#: storage/file/fd.c:2801 +#: storage/file/fd.c:2798 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке открыть каталог \"%s\"" -#: storage/file/fd.c:3331 +#: storage/file/fd.c:3328 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "в каталоге временных файлов обнаружен неуместный файл: \"%s\"" -#: storage/file/fd.c:3449 +#: storage/file/fd.c:3446 #, c-format msgid "" "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" @@ -24304,12 +24311,12 @@ msgstr "" "синхронизация каталога данных (syncfs), прошло времени: %ld.%02d с, текущий " "путь: %s" -#: storage/file/fd.c:3463 +#: storage/file/fd.c:3460 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" -#: storage/file/fd.c:3676 +#: storage/file/fd.c:3673 #, c-format msgid "" "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: " @@ -24318,7 +24325,7 @@ msgstr "" "синхронизация каталога данных (подготовка к fsync), прошло времени: %ld.%02d " "с, текущий путь: %s" -#: storage/file/fd.c:3708 +#: storage/file/fd.c:3705 #, c-format msgid "" "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" @@ -24326,12 +24333,12 @@ msgstr "" "синхронизация каталога данных (fsync), прошло времени: %ld.%02d с, текущий " "путь: %s" -#: storage/file/fd.c:3897 +#: storage/file/fd.c:3894 #, c-format msgid "debug_io_direct is not supported on this platform." msgstr "Параметр debug_io_direct на этой платформе не поддерживается." -#: storage/file/fd.c:3944 +#: storage/file/fd.c:3941 #, c-format msgid "" "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" @@ -24339,7 +24346,7 @@ msgstr "" "режим debug_io_direct не поддерживается для WAL из-за слишком маленького " "размера XLOG_BLCKSZ" -#: storage/file/fd.c:3951 +#: storage/file/fd.c:3948 #, c-format msgid "debug_io_direct is not supported for data because BLCKSZ is too small" msgstr "" @@ -24696,108 +24703,108 @@ msgstr "обнаружена взаимоблокировка" msgid "See server log for query details." msgstr "Подробности запроса смотрите в протоколе сервера." -#: storage/lmgr/lmgr.c:853 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при изменении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:856 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при удалении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокировке кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокировке изменённой версии (%u,%u) кортежа в отношении \"%s\"" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при добавлении кортежа индекса (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "при проверке уникальности кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "при перепроверке изменённого кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "при проверке ограничения-исключения для кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1212 #, c-format msgid "relation %u of database %u" msgstr "отношение %u базы данных %u" -#: storage/lmgr/lmgr.c:1212 +#: storage/lmgr/lmgr.c:1218 #, c-format msgid "extension of relation %u of database %u" msgstr "расширение отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1218 +#: storage/lmgr/lmgr.c:1224 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid базы %u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1229 #, c-format msgid "page %u of relation %u of database %u" msgstr "страница %u отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1230 +#: storage/lmgr/lmgr.c:1236 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1244 #, c-format msgid "transaction %u" msgstr "транзакция %u" -#: storage/lmgr/lmgr.c:1243 +#: storage/lmgr/lmgr.c:1249 #, c-format msgid "virtual transaction %d/%u" msgstr "виртуальная транзакция %d/%u" -#: storage/lmgr/lmgr.c:1249 +#: storage/lmgr/lmgr.c:1255 #, c-format msgid "speculative token %u of transaction %u" msgstr "спекулятивный маркер %u транзакции %u" -#: storage/lmgr/lmgr.c:1255 +#: storage/lmgr/lmgr.c:1261 #, c-format msgid "object %u of class %u of database %u" msgstr "объект %u класса %u базы данных %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, c-format msgid "user lock [%u,%u,%u]" msgstr "пользовательская блокировка [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1270 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендательная блокировка [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1278 +#: storage/lmgr/lmgr.c:1284 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "удалённая транзакция %u подписки %u в базе данных %u" -#: storage/lmgr/lmgr.c:1285 +#: storage/lmgr/lmgr.c:1291 #, c-format msgid "unrecognized locktag type %d" msgstr "нераспознанный тип блокировки %d" @@ -25464,12 +25471,12 @@ msgstr "" "число форматов результатов в сообщении Bind (%d) не равно числу столбцов в " "запросе (%d)" -#: tcop/pquery.c:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "курсор может сканировать только вперёд" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Добавьте в его объявление SCROLL, чтобы он мог перемещаться назад." @@ -25671,7 +25678,7 @@ msgid "invalid regular expression: %s" msgstr "неверное регулярное выражение: %s" #: tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 -#: tsearch/spell.c:1015 tsearch/spell.c:1081 gram.y:18130 gram.y:18147 +#: tsearch/spell.c:1015 tsearch/spell.c:1081 gram.y:18137 gram.y:18154 #, c-format msgid "syntax error" msgstr "ошибка синтаксиса" @@ -25829,102 +25836,102 @@ msgstr "вызвана функция, которая была удалена" msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "сбрасывается существующая статистика вида %s, db=%u, oid=%u" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/adt/acl.c:194 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "слишком длинный идентификатор" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:195 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Идентификатор должен быть короче %d байт." -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:283 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нераспознанное ключевое слово: \"%s\"" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:284 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключевым словом ACL должно быть \"group\" или \"user\"." -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:292 #, c-format msgid "missing name" msgstr "отсутствует имя" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:293 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключевыми словами \"group\" или \"user\" должно следовать имя." -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, c-format msgid "missing \"=\" sign" msgstr "отсутствует знак \"=\"" -#: utils/adt/acl.c:341 +#: utils/adt/acl.c:358 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неверный символ режима: должен быть один из \"%s\"" -#: utils/adt/acl.c:371 +#: utils/adt/acl.c:388 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" должно следовать имя" -#: utils/adt/acl.c:383 +#: utils/adt/acl.c:400 #, c-format msgid "defaulting grantor to user ID %u" msgstr "назначившим права считается пользователь с ID %u" -#: utils/adt/acl.c:569 +#: utils/adt/acl.c:586 #, c-format msgid "ACL array contains wrong data type" msgstr "Массив ACL содержит неверный тип данных" -#: utils/adt/acl.c:573 +#: utils/adt/acl.c:590 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Массивы ACL должны быть одномерными" -#: utils/adt/acl.c:577 +#: utils/adt/acl.c:594 #, c-format msgid "ACL arrays must not contain null values" msgstr "Массивы ACL не должны содержать значения null" -#: utils/adt/acl.c:606 +#: utils/adt/acl.c:623 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "лишний мусор в конце спецификации ACL" -#: utils/adt/acl.c:1248 +#: utils/adt/acl.c:1265 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "привилегию назначения прав нельзя вернуть тому, кто назначил её вам" -#: utils/adt/acl.c:1564 +#: utils/adt/acl.c:1581 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert больше не поддерживается" -#: utils/adt/acl.c:1574 +#: utils/adt/acl.c:1591 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove больше не поддерживается" -#: utils/adt/acl.c:1693 +#: utils/adt/acl.c:1710 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нераспознанный тип прав: \"%s\"" -#: utils/adt/acl.c:3476 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3493 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "функция \"%s\" не существует" -#: utils/adt/acl.c:5023 +#: utils/adt/acl.c:5040 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "нужны права для выполнения SET ROLE \"%s\"" @@ -25950,7 +25957,7 @@ msgstr "тип входных данных не является массиво #: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 #: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 #: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 -#: utils/adt/int8.c:1272 utils/adt/numeric.c:1916 utils/adt/numeric.c:4403 +#: utils/adt/int8.c:1272 utils/adt/numeric.c:1917 utils/adt/numeric.c:4404 #: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 #: utils/adt/varlena.c:3134 @@ -26310,8 +26317,8 @@ msgstr "преобразование кодировки из %s в ASCII не п #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 #: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 -#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7151 -#: utils/adt/numeric.c:7354 utils/adt/numeric.c:8301 utils/adt/numutils.c:357 +#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7152 +#: utils/adt/numeric.c:7355 utils/adt/numeric.c:8302 utils/adt/numutils.c:357 #: utils/adt/numutils.c:619 utils/adt/numutils.c:881 utils/adt/numutils.c:920 #: utils/adt/numutils.c:942 utils/adt/numutils.c:1006 utils/adt/numutils.c:1028 #: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 @@ -26332,10 +26339,10 @@ msgstr "денежное значение вне диапазона" #: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 #: utils/adt/int8.c:515 utils/adt/int8.c:573 utils/adt/int8.c:958 #: utils/adt/int8.c:1038 utils/adt/int8.c:1100 utils/adt/int8.c:1180 -#: utils/adt/numeric.c:3190 utils/adt/numeric.c:3213 utils/adt/numeric.c:3298 -#: utils/adt/numeric.c:3316 utils/adt/numeric.c:3412 utils/adt/numeric.c:8850 -#: utils/adt/numeric.c:9163 utils/adt/numeric.c:9511 utils/adt/numeric.c:9627 -#: utils/adt/numeric.c:11138 utils/adt/timestamp.c:3442 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8851 +#: utils/adt/numeric.c:9164 utils/adt/numeric.c:9512 utils/adt/numeric.c:9628 +#: utils/adt/numeric.c:11139 utils/adt/timestamp.c:3442 #, c-format msgid "division by zero" msgstr "деление на ноль" @@ -26382,7 +26389,7 @@ msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%s\"" #: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 -#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2533 +#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2535 #, c-format msgid "date out of range" msgstr "дата вне диапазона" @@ -26453,8 +26460,8 @@ msgstr "единица \"%s\" для типа %s не распознана" #: utils/adt/timestamp.c:5609 utils/adt/timestamp.c:5696 #: utils/adt/timestamp.c:5737 utils/adt/timestamp.c:5741 #: utils/adt/timestamp.c:5795 utils/adt/timestamp.c:5799 -#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2555 -#: utils/adt/xml.c:2562 utils/adt/xml.c:2582 utils/adt/xml.c:2589 +#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2557 +#: utils/adt/xml.c:2564 utils/adt/xml.c:2584 utils/adt/xml.c:2591 #, c-format msgid "timestamp out of range" msgstr "timestamp вне диапазона" @@ -26471,7 +26478,7 @@ msgstr "значение поля типа time вне диапазона: %d:%0 #: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 #: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 -#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2594 +#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2595 #: utils/adt/timestamp.c:3513 utils/adt/timestamp.c:3540 #: utils/adt/timestamp.c:3571 #, c-format @@ -26662,34 +26669,34 @@ msgstr "\"%s\" вне диапазона для типа double precision" #: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 #: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 #: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 -#: utils/adt/int8.c:1293 utils/adt/numeric.c:4515 utils/adt/numeric.c:4520 +#: utils/adt/int8.c:1293 utils/adt/numeric.c:4516 utils/adt/numeric.c:4521 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1453 utils/adt/numeric.c:3708 utils/adt/numeric.c:10042 +#: utils/adt/float.c:1453 utils/adt/numeric.c:3709 utils/adt/numeric.c:10043 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1521 utils/adt/numeric.c:3996 utils/adt/numeric.c:4108 +#: utils/adt/float.c:1521 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1525 utils/adt/numeric.c:4000 utils/adt/numeric.c:10933 +#: utils/adt/float.c:1525 utils/adt/numeric.c:4001 utils/adt/numeric.c:10934 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "отрицательное число в дробной степени даёт комплексный результат" -#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3908 -#: utils/adt/numeric.c:10713 +#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10714 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3846 -#: utils/adt/numeric.c:3903 utils/adt/numeric.c:10717 +#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10718 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычислить логарифм отрицательного числа нельзя" @@ -26708,22 +26715,22 @@ msgstr "введённое значение вне диапазона" msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "параметр setseed %g вне допустимого диапазона [-1,1]" -#: utils/adt/float.c:4095 utils/adt/numeric.c:1856 +#: utils/adt/float.c:4095 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:4100 utils/adt/numeric.c:1867 +#: utils/adt/float.c:4100 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижняя и верхняя границы не могут быть NaN" -#: utils/adt/float.c:4106 utils/adt/numeric.c:1872 +#: utils/adt/float.c:4106 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижняя и верхняя границы должны быть конечными" -#: utils/adt/float.c:4172 utils/adt/numeric.c:1886 +#: utils/adt/float.c:4172 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижняя граница не может равняться верхней" @@ -27106,7 +27113,7 @@ msgstr "размер шага не может быть нулевым" #: utils/adt/int8.c:1010 utils/adt/int8.c:1024 utils/adt/int8.c:1057 #: utils/adt/int8.c:1071 utils/adt/int8.c:1085 utils/adt/int8.c:1116 #: utils/adt/int8.c:1138 utils/adt/int8.c:1152 utils/adt/int8.c:1166 -#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4474 +#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4475 #: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 #: utils/adt/varbit.c:1676 #, c-format @@ -27161,7 +27168,7 @@ msgstr "массив должен иметь два столбца" msgid "mismatched array dimensions" msgstr "неподходящие размерности массива" -#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1958 +#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1964 #, c-format msgid "duplicate JSON object key value" msgstr "повторяющиеся ключи в объекте JSON" @@ -27228,23 +27235,23 @@ msgstr "привести объект jsonb к типу %s нельзя" msgid "cannot cast jsonb array or object to type %s" msgstr "привести массив или объект jsonb к типу %s нельзя" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:755 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "число пар объекта jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:796 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "число элементов массива jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1679 utils/adt/jsonb_util.c:1699 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "общий размер элементов массива jsonb превышает предел (%d байт)" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1760 utils/adt/jsonb_util.c:1795 +#: utils/adt/jsonb_util.c:1815 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "общий размер элементов объекта jsonb превышает предел (%d байт)" @@ -27709,12 +27716,12 @@ msgstr "недетерминированные правила сортировк msgid "LIKE pattern must not end with escape character" msgstr "шаблон LIKE не должен заканчиваться защитным символом" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "неверный защитный символ" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "Защитный символ должен быть пустым или состоять из одного байта." @@ -27930,10 +27937,10 @@ msgstr "результат вне диапазона" msgid "cannot subtract inet values of different sizes" msgstr "нельзя вычитать значения inet разного размера" -#: utils/adt/numeric.c:792 utils/adt/numeric.c:3658 utils/adt/numeric.c:7146 -#: utils/adt/numeric.c:7349 utils/adt/numeric.c:7821 utils/adt/numeric.c:10516 -#: utils/adt/numeric.c:10991 utils/adt/numeric.c:11085 -#: utils/adt/numeric.c:11220 +#: utils/adt/numeric.c:792 utils/adt/numeric.c:3659 utils/adt/numeric.c:7147 +#: utils/adt/numeric.c:7350 utils/adt/numeric.c:7822 utils/adt/numeric.c:10517 +#: utils/adt/numeric.c:10992 utils/adt/numeric.c:11086 +#: utils/adt/numeric.c:11221 #, c-format msgid "value overflows numeric format" msgstr "значение переполняет формат numeric" @@ -27998,34 +28005,34 @@ msgstr "размер шага не может быть NaN" msgid "step size cannot be infinity" msgstr "размер шага не может быть бесконечностью" -#: utils/adt/numeric.c:3648 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:4381 utils/adt/numeric.c:4461 utils/adt/numeric.c:4502 -#: utils/adt/numeric.c:4698 +#: utils/adt/numeric.c:4382 utils/adt/numeric.c:4462 utils/adt/numeric.c:4503 +#: utils/adt/numeric.c:4699 #, c-format msgid "cannot convert NaN to %s" msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:4385 utils/adt/numeric.c:4465 utils/adt/numeric.c:4506 -#: utils/adt/numeric.c:4702 +#: utils/adt/numeric.c:4386 utils/adt/numeric.c:4466 utils/adt/numeric.c:4507 +#: utils/adt/numeric.c:4703 #, c-format msgid "cannot convert infinity to %s" msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:4711 +#: utils/adt/numeric.c:4712 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:7911 utils/adt/numeric.c:7962 +#: utils/adt/numeric.c:7912 utils/adt/numeric.c:7963 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:7912 +#: utils/adt/numeric.c:7913 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -28034,7 +28041,7 @@ msgstr "" "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." -#: utils/adt/numeric.c:7963 +#: utils/adt/numeric.c:7964 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "" @@ -28361,7 +28368,7 @@ msgstr "Слишком много запятых." msgid "Junk after right parenthesis or bracket." msgstr "Мусор после правой скобки." -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:2023 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "ошибка в регулярном выражении: %s" @@ -28380,15 +28387,15 @@ msgstr "" "Если вы хотите вызвать regexp_replace() с параметром start, явно приведите " "четвёртый аргумент к целочисленному типу." -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 -#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 -#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 -#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1109 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1182 utils/adt/regexp.c:1191 +#: utils/adt/regexp.c:1200 utils/adt/regexp.c:1880 utils/adt/regexp.c:1889 +#: utils/adt/regexp.c:1898 utils/misc/guc.c:6674 utils/misc/guc.c:6708 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неверное значение параметра \"%s\": %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:940 #, c-format msgid "" "SQL regular expression may not contain more than two escape-double-quote " @@ -28398,19 +28405,19 @@ msgstr "" "(экранированных кавычек)" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 -#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 -#: utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1120 utils/adt/regexp.c:1211 utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1337 utils/adt/regexp.c:1725 utils/adt/regexp.c:1780 +#: utils/adt/regexp.c:1909 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s не поддерживает режим \"global\"" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1339 #, c-format msgid "Use the regexp_matches function instead." msgstr "Вместо неё используйте функцию regexp_matches." -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1527 #, c-format msgid "too many regular expression matches" msgstr "слишком много совпадений для регулярного выражения" @@ -28436,8 +28443,8 @@ msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10110 -#: utils/adt/ruleutils.c:10323 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10120 +#: utils/adt/ruleutils.c:10333 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -29167,32 +29174,32 @@ msgstr "ошибка в XML-комментарии" msgid "not an XML document" msgstr "не XML-документ" -#: utils/adt/xml.c:987 utils/adt/xml.c:1010 +#: utils/adt/xml.c:999 utils/adt/xml.c:1022 #, c-format msgid "invalid XML processing instruction" msgstr "неправильная XML-инструкция обработки (PI)" -#: utils/adt/xml.c:988 +#: utils/adt/xml.c:1000 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "назначением XML-инструкции обработки (PI) не может быть \"%s\"." -#: utils/adt/xml.c:1011 +#: utils/adt/xml.c:1023 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-инструкция обработки (PI) не может содержать \"?>\"." -#: utils/adt/xml.c:1090 +#: utils/adt/xml.c:1102 #, c-format msgid "xmlvalidate is not implemented" msgstr "функция xmlvalidate не реализована" -#: utils/adt/xml.c:1146 +#: utils/adt/xml.c:1158 #, c-format msgid "could not initialize XML library" msgstr "не удалось инициализировать библиотеку XML" -#: utils/adt/xml.c:1147 +#: utils/adt/xml.c:1159 #, c-format msgid "" "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." @@ -29200,12 +29207,12 @@ msgstr "" "В libxml2 оказался несовместимый тип char: sizeof(char)=%zu, " "sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1233 +#: utils/adt/xml.c:1245 #, c-format msgid "could not set up XML error handler" msgstr "не удалось установить обработчик XML-ошибок" -#: utils/adt/xml.c:1234 +#: utils/adt/xml.c:1246 #, c-format msgid "" "This probably indicates that the version of libxml2 being used is not " @@ -29214,99 +29221,99 @@ msgstr "" "Возможно, это означает, что используемая версия libxml2 несовместима с " "заголовочными файлами libxml2, с которыми был собран PostgreSQL." -#: utils/adt/xml.c:2262 +#: utils/adt/xml.c:2264 msgid "Invalid character value." msgstr "Неверный символ." -#: utils/adt/xml.c:2265 +#: utils/adt/xml.c:2267 msgid "Space required." msgstr "Требуется пробел." -#: utils/adt/xml.c:2268 +#: utils/adt/xml.c:2270 msgid "standalone accepts only 'yes' or 'no'." msgstr "значениями атрибута standalone могут быть только 'yes' и 'no'." -#: utils/adt/xml.c:2271 +#: utils/adt/xml.c:2273 msgid "Malformed declaration: missing version." msgstr "Ошибочное объявление: не указана версия." -#: utils/adt/xml.c:2274 +#: utils/adt/xml.c:2276 msgid "Missing encoding in text declaration." msgstr "В объявлении не указана кодировка." -#: utils/adt/xml.c:2277 +#: utils/adt/xml.c:2279 msgid "Parsing XML declaration: '?>' expected." msgstr "Ошибка при разборе XML-объявления: ожидается '?>'." -#: utils/adt/xml.c:2280 +#: utils/adt/xml.c:2282 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Нераспознанный код ошибки libxml: %d." -#: utils/adt/xml.c:2534 +#: utils/adt/xml.c:2536 #, c-format msgid "XML does not support infinite date values." msgstr "XML не поддерживает бесконечность в датах." -#: utils/adt/xml.c:2556 utils/adt/xml.c:2583 +#: utils/adt/xml.c:2558 utils/adt/xml.c:2585 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML не поддерживает бесконечность в timestamp." -#: utils/adt/xml.c:2999 +#: utils/adt/xml.c:3001 #, c-format msgid "invalid query" msgstr "неверный запрос" -#: utils/adt/xml.c:3091 +#: utils/adt/xml.c:3093 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "портал \"%s\" не возвращает кортежи" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4345 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неправильный массив с сопоставлениями пространств имён XML" -#: utils/adt/xml.c:4344 +#: utils/adt/xml.c:4346 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Массив должен быть двухмерным и содержать 2 элемента по второй оси." -#: utils/adt/xml.c:4368 +#: utils/adt/xml.c:4370 #, c-format msgid "empty XPath expression" msgstr "пустое выражение XPath" -#: utils/adt/xml.c:4420 +#: utils/adt/xml.c:4422 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ни префикс, ни URI пространства имён не может быть null" -#: utils/adt/xml.c:4427 +#: utils/adt/xml.c:4429 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "не удалось зарегистрировать пространство имён XML с префиксом \"%s\" и URI " "\"%s\"" -#: utils/adt/xml.c:4776 +#: utils/adt/xml.c:4778 #, c-format msgid "DEFAULT namespace is not supported" msgstr "пространство имён DEFAULT не поддерживается" -#: utils/adt/xml.c:4805 +#: utils/adt/xml.c:4807 #, c-format msgid "row path filter must not be empty string" msgstr "путь отбираемых строк не должен быть пустым" -#: utils/adt/xml.c:4839 +#: utils/adt/xml.c:4841 #, c-format msgid "column path filter must not be empty string" msgstr "путь отбираемого столбца не должен быть пустым" -#: utils/adt/xml.c:4986 +#: utils/adt/xml.c:4988 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее столбец, возвратило более одного значения" @@ -30121,7 +30128,7 @@ msgstr "ошибка в bind_textdomain_codeset" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "неверная последовательность байт для кодировки \"%s\": %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1766 #, c-format msgid "" "character with byte sequence %s in encoding \"%s\" has no equivalent in " @@ -30313,7 +30320,7 @@ msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" нельзя изменить сейчас" #: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 -#: utils/misc/guc.c:6604 +#: utils/misc/guc.c:6610 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "нет прав для изменения параметра \"%s\"" @@ -30396,7 +30403,7 @@ msgstr "параметр \"%s\" нельзя установить" msgid "could not parse setting for parameter \"%s\"" msgstr "не удалось разобрать значение параметра \"%s\"" -#: utils/misc/guc.c:6736 +#: utils/misc/guc.c:6742 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неверное значение параметра \"%s\": %g" @@ -33480,99 +33487,104 @@ msgstr "" msgid "unrecognized column option \"%s\"" msgstr "нераспознанный параметр столбца \"%s\"" -#: gram.y:14109 +#: gram.y:13888 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "имя параметра \"%s\" не может использоваться в XMLTABLE" + +#: gram.y:14116 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "тип float должен иметь точность минимум 1 бит" -#: gram.y:14118 +#: gram.y:14125 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "тип float должен иметь точность меньше 54 бит" -#: gram.y:14621 +#: gram.y:14628 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неверное число параметров в левой части выражения OVERLAPS" -#: gram.y:14626 +#: gram.y:14633 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неверное число параметров в правой части выражения OVERLAPS" -#: gram.y:14803 +#: gram.y:14810 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "предикат UNIQUE ещё не реализован" -#: gram.y:15219 +#: gram.y:15226 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ORDER BY с WITHIN GROUP можно указать только один раз" -#: gram.y:15224 +#: gram.y:15231 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT нельзя использовать с WITHIN GROUP" -#: gram.y:15229 +#: gram.y:15236 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC нельзя использовать с WITHIN GROUP" -#: gram.y:15863 gram.y:15887 +#: gram.y:15870 gram.y:15894 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "началом рамки не может быть UNBOUNDED FOLLOWING" -#: gram.y:15868 +#: gram.y:15875 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "" "рамка, начинающаяся со следующей строки, не может заканчиваться текущей" -#: gram.y:15892 +#: gram.y:15899 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "концом рамки не может быть UNBOUNDED PRECEDING" -#: gram.y:15898 +#: gram.y:15905 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "" "рамка, начинающаяся с текущей строки, не может иметь предшествующих строк" -#: gram.y:15905 +#: gram.y:15912 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "" "рамка, начинающаяся со следующей строки, не может иметь предшествующих строк" -#: gram.y:16666 +#: gram.y:16673 #, c-format msgid "type modifier cannot have parameter name" msgstr "параметр функции-модификатора типа должен быть безымянным" -#: gram.y:16672 +#: gram.y:16679 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "модификатор типа не может включать ORDER BY" -#: gram.y:16740 gram.y:16747 gram.y:16754 +#: gram.y:16747 gram.y:16754 gram.y:16761 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s нельзя использовать здесь как имя роли" -#: gram.y:16844 gram.y:18301 +#: gram.y:16851 gram.y:18308 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES нельзя задать без предложения ORDER BY" -#: gram.y:17980 gram.y:18167 +#: gram.y:17987 gram.y:18174 msgid "improper use of \"*\"" msgstr "недопустимое использование \"*\"" -#: gram.y:18231 +#: gram.y:18238 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " @@ -33581,70 +33593,70 @@ msgstr "" "сортирующая агрегатная функция с непосредственным аргументом VARIADIC должна " "иметь один агрегатный аргумент VARIADIC того же типа данных" -#: gram.y:18268 +#: gram.y:18275 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "ORDER BY можно указать только один раз" -#: gram.y:18279 +#: gram.y:18286 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "OFFSET можно указать только один раз" -#: gram.y:18288 +#: gram.y:18295 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "LIMIT можно указать только один раз" -#: gram.y:18297 +#: gram.y:18304 #, c-format msgid "multiple limit options not allowed" msgstr "параметры LIMIT можно указать только один раз" -#: gram.y:18324 +#: gram.y:18331 #, c-format msgid "multiple WITH clauses not allowed" msgstr "WITH можно указать только один раз" -#: gram.y:18517 +#: gram.y:18524 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "в табличных функциях не может быть аргументов OUT и INOUT" -#: gram.y:18650 +#: gram.y:18657 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "COLLATE можно указать только один раз" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18688 gram.y:18701 +#: gram.y:18695 gram.y:18708 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "ограничения %s не могут иметь характеристики DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18714 +#: gram.y:18721 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "ограничения %s не могут иметь характеристики NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18727 +#: gram.y:18734 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "ограничения %s не могут иметь характеристики NO INHERIT" -#: gram.y:18749 +#: gram.y:18756 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нераспознанная стратегия секционирования \"%s\"" -#: gram.y:18773 +#: gram.y:18780 #, c-format msgid "invalid publication object list" msgstr "неверный список объектов публикации" -#: gram.y:18774 +#: gram.y:18781 #, c-format msgid "" "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " @@ -33653,22 +33665,22 @@ msgstr "" "Перед именем отдельной таблицы или схемы нужно указать TABLE либо TABLES IN " "SCHEMA." -#: gram.y:18790 +#: gram.y:18797 #, c-format msgid "invalid table name" msgstr "неверное имя таблицы" -#: gram.y:18811 +#: gram.y:18818 #, c-format msgid "WHERE clause not allowed for schema" msgstr "предложение WHERE не допускается для схемы" -#: gram.y:18818 +#: gram.y:18825 #, c-format msgid "column specification not allowed for schema" msgstr "указание столбца не допускается для схемы" -#: gram.y:18832 +#: gram.y:18839 #, c-format msgid "invalid schema name" msgstr "неверное имя схемы" @@ -33918,6 +33930,10 @@ msgstr "нестандартное использование спецсимво msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#, c-format +#~ msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +#~ msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %d)" + #, c-format #~ msgid "Please report this to <%s>." #~ msgstr "Пожалуйста, напишите об этой ошибке по адресу <%s>." @@ -36439,9 +36455,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "cannot copy to foreign table \"%s\"" #~ msgstr "копировать в стороннюю таблицу \"%s\" нельзя" -#~ msgid "cannot route inserted tuples to a foreign table" -#~ msgstr "направить вставляемые кортежи в стороннюю таблицу нельзя" - #~ msgid "unrecognized function attribute \"%s\" ignored" #~ msgstr "нераспознанный атрибут функции \"%s\" --- игнорируется" diff --git a/src/backend/po/sv.po b/src/backend/po/sv.po index 7ca9b9da582..cc56b9a67dd 100644 --- a/src/backend/po/sv.po +++ b/src/backend/po/sv.po @@ -23,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-12 14:03+0000\n" -"PO-Revision-Date: 2025-02-12 20:52+0100\n" +"POT-Creation-Date: 2025-08-09 05:32+0000\n" +"PO-Revision-Date: 2025-08-09 20:15+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -98,14 +98,14 @@ msgstr "kunde inte öppna filen \"%s\" för läsning: %m" #: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1347 access/transam/xlog.c:3196 -#: access/transam/xlog.c:3999 access/transam/xlogrecovery.c:1225 +#: access/transam/twophase.c:1347 access/transam/xlog.c:3197 +#: access/transam/xlog.c:4000 access/transam/xlogrecovery.c:1225 #: access/transam/xlogrecovery.c:1317 access/transam/xlogrecovery.c:1354 #: access/transam/xlogrecovery.c:1414 backup/basebackup.c:1846 #: commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5055 -#: replication/logical/snapbuild.c:2040 replication/slot.c:1980 -#: replication/slot.c:2021 replication/walsender.c:643 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5184 +#: replication/logical/snapbuild.c:2087 replication/slot.c:1980 +#: replication/slot.c:2021 replication/walsender.c:646 #: storage/file/buffile.c:470 storage/file/copydir.c:185 #: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:830 #, c-format @@ -113,10 +113,10 @@ msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" #: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 -#: access/transam/xlog.c:3201 access/transam/xlog.c:4004 +#: access/transam/xlog.c:3202 access/transam/xlog.c:4005 #: backup/basebackup.c:1850 replication/logical/origin.c:750 -#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2045 -#: replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:648 +#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2092 +#: replication/slot.c:1984 replication/slot.c:2025 replication/walsender.c:651 #: utils/cache/relmapper.c:834 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -127,17 +127,17 @@ msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" #: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 #: access/transam/timeline.c:392 access/transam/timeline.c:438 #: access/transam/timeline.c:512 access/transam/twophase.c:1359 -#: access/transam/twophase.c:1778 access/transam/xlog.c:3042 -#: access/transam/xlog.c:3236 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3377 access/transam/xlog.c:3969 -#: access/transam/xlog.c:4888 commands/copyfrom.c:1747 commands/copyto.c:332 +#: access/transam/twophase.c:1778 access/transam/xlog.c:3043 +#: access/transam/xlog.c:3237 access/transam/xlog.c:3242 +#: access/transam/xlog.c:3378 access/transam/xlog.c:3970 +#: access/transam/xlog.c:4889 commands/copyfrom.c:1747 commands/copyto.c:332 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5107 -#: replication/logical/snapbuild.c:1807 replication/logical/snapbuild.c:1931 -#: replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:658 -#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 -#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:842 +#: replication/logical/reorderbuffer.c:5236 +#: replication/logical/snapbuild.c:1854 replication/logical/snapbuild.c:1978 +#: replication/slot.c:1871 replication/slot.c:2032 replication/walsender.c:661 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:779 +#: storage/file/fd.c:3697 storage/file/fd.c:3803 utils/cache/relmapper.c:842 #: utils/cache/relmapper.c:957 #, c-format msgid "could not close file \"%s\": %m" @@ -165,20 +165,20 @@ msgstr "" #: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 #: access/transam/timeline.c:111 access/transam/timeline.c:251 #: access/transam/timeline.c:348 access/transam/twophase.c:1303 -#: access/transam/xlog.c:2949 access/transam/xlog.c:3112 -#: access/transam/xlog.c:3151 access/transam/xlog.c:3344 -#: access/transam/xlog.c:3989 access/transam/xlogrecovery.c:4214 +#: access/transam/xlog.c:2950 access/transam/xlog.c:3113 +#: access/transam/xlog.c:3152 access/transam/xlog.c:3345 +#: access/transam/xlog.c:3990 access/transam/xlogrecovery.c:4214 #: access/transam/xlogrecovery.c:4317 access/transam/xlogutils.c:838 #: backup/basebackup.c:538 backup/basebackup.c:1516 libpq/hba.c:629 #: postmaster/syslogger.c:1560 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3711 -#: replication/logical/reorderbuffer.c:4262 -#: replication/logical/reorderbuffer.c:5035 -#: replication/logical/snapbuild.c:1762 replication/logical/snapbuild.c:1872 -#: replication/slot.c:1952 replication/walsender.c:616 -#: replication/walsender.c:2731 storage/file/copydir.c:151 -#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 -#: storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:819 +#: replication/logical/reorderbuffer.c:3840 +#: replication/logical/reorderbuffer.c:4391 +#: replication/logical/reorderbuffer.c:5164 +#: replication/logical/snapbuild.c:1809 replication/logical/snapbuild.c:1919 +#: replication/slot.c:1952 replication/walsender.c:619 +#: replication/walsender.c:2764 storage/file/copydir.c:151 +#: storage/file/fd.c:754 storage/file/fd.c:3454 storage/file/fd.c:3684 +#: storage/file/fd.c:3774 storage/smgr/md.c:663 utils/cache/relmapper.c:819 #: utils/cache/relmapper.c:936 utils/error/elog.c:2119 #: utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 #: utils/init/miscinit.c:1792 utils/misc/guc.c:4656 utils/misc/guc.c:4706 @@ -188,7 +188,7 @@ msgstr "kunde inte öppna fil \"%s\": %m" #: ../common/controldata_utils.c:232 ../common/controldata_utils.c:235 #: access/transam/twophase.c:1751 access/transam/twophase.c:1760 -#: access/transam/xlog.c:8791 access/transam/xlogfuncs.c:708 +#: access/transam/xlog.c:8830 access/transam/xlogfuncs.c:708 #: backup/basebackup_server.c:175 backup/basebackup_server.c:268 #: postmaster/postmaster.c:5575 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 @@ -202,12 +202,12 @@ msgstr "kunde inte skriva fil \"%s\": %m" #: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 #: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 #: access/transam/timeline.c:506 access/transam/twophase.c:1772 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3230 -#: access/transam/xlog.c:3962 access/transam/xlog.c:8181 -#: access/transam/xlog.c:8226 backup/basebackup_server.c:209 -#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1800 -#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:774 -#: storage/file/fd.c:3798 storage/smgr/md.c:1137 storage/smgr/md.c:1182 +#: access/transam/xlog.c:3036 access/transam/xlog.c:3231 +#: access/transam/xlog.c:3963 access/transam/xlog.c:8220 +#: access/transam/xlog.c:8265 backup/basebackup_server.c:209 +#: commands/dbcommands.c:515 replication/logical/snapbuild.c:1847 +#: replication/slot.c:1857 replication/slot.c:1962 storage/file/fd.c:771 +#: storage/file/fd.c:3795 storage/smgr/md.c:1137 storage/smgr/md.c:1182 #: storage/sync/sync.c:451 utils/misc/guc.c:4426 #, c-format msgid "could not fsync file \"%s\": %m" @@ -220,21 +220,22 @@ msgstr "kunde inte fsync:a fil \"%s\": %m" #: ../common/md5_common.c:155 ../common/psprintf.c:143 #: ../common/scram-common.c:268 ../common/stringinfo.c:305 ../port/path.c:828 #: ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1412 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 -#: libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:524 -#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 -#: postmaster/postmaster.c:2539 postmaster/postmaster.c:4131 -#: postmaster/postmaster.c:5500 postmaster/postmaster.c:5871 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1351 +#: libpq/auth.c:1395 libpq/auth.c:1952 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:352 +#: postmaster/bgworker.c:934 postmaster/postmaster.c:2539 +#: postmaster/postmaster.c:4131 postmaster/postmaster.c:5500 +#: postmaster/postmaster.c:5871 #: replication/libpqwalreceiver/libpqwalreceiver.c:361 -#: replication/logical/logical.c:209 replication/walsender.c:686 -#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 -#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1461 +#: replication/logical/logical.c:209 replication/walsender.c:689 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:863 storage/file/fd.c:1394 +#: storage/file/fd.c:1555 storage/file/fd.c:2475 storage/ipc/procarray.c:1461 #: storage/ipc/procarray.c:2243 storage/ipc/procarray.c:2250 #: storage/ipc/procarray.c:2749 storage/ipc/procarray.c:3385 #: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 #: utils/adt/formatting.c:1935 utils/adt/pg_locale.c:496 -#: utils/adt/pg_locale.c:660 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 -#: utils/hash/dynahash.c:614 utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 +#: utils/adt/pg_locale.c:660 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:515 +#: utils/hash/dynahash.c:615 utils/hash/dynahash.c:1112 utils/mb/mbutils.c:402 #: utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 #: utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 #: utils/misc/guc.c:4404 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 @@ -310,8 +311,8 @@ msgstr "kan inte duplicera null-pekare (internt fel)\n" #: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 #: commands/copyfrom.c:1697 commands/copyto.c:706 commands/extension.c:3469 #: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 -#: replication/logical/snapbuild.c:1658 storage/file/fd.c:1922 -#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 +#: replication/logical/snapbuild.c:1705 storage/file/fd.c:1919 +#: storage/file/fd.c:2005 storage/file/fd.c:3508 utils/adt/dbsize.c:106 #: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 #: utils/adt/genfile.c:658 utils/adt/misc.c:340 #, c-format @@ -320,22 +321,22 @@ msgstr "kunde inte göra stat() på fil \"%s\": %m" #: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 #: commands/tablespace.c:734 commands/tablespace.c:744 -#: postmaster/postmaster.c:1566 storage/file/fd.c:2880 +#: postmaster/postmaster.c:1566 storage/file/fd.c:2877 #: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" #: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 -#: storage/file/fd.c:2892 +#: storage/file/fd.c:2889 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" #: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 #: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 -#: replication/logical/snapbuild.c:1819 replication/slot.c:723 -#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:792 +#: replication/logical/snapbuild.c:1866 replication/slot.c:723 +#: replication/slot.c:1743 replication/slot.c:1885 storage/file/fd.c:789 #: utils/time/snapmgr.c:1284 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -345,89 +346,89 @@ msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" msgid "internal error" msgstr "internt fel" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:1147 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-sekvens \"\\%s\" är ogiltig." -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:1150 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Tecken med värde 0x%02x måste escape:as." -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:1153 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Förväntade slut på indata, men hittade \"%s\"." -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:1156 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:1159 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:1162 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Förväntade sig \":\" men hittade \"%s\"." -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:1165 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Förväntade JSON-värde, men hittade \"%s\"." -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:1168 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:1170 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:1173 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:1176 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Förväntade sträng, men hittade \"%s\"." -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:1179 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token \"%s\" är ogiltig." -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:1182 jsonpath_scan.l:597 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:1184 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" måste följas av fyra hexdecimala siffror." -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:1187 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:1190 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Escape-värde för unicode kan inte översättas till serverns kodning %s." -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:1193 jsonpath_scan.l:630 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodes övre surrogathalva får inte komma efter en övre surrogathalva." -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 +#: ../common/jsonapi.c:1195 jsonpath_scan.l:641 jsonpath_scan.l:651 #: jsonpath_scan.l:702 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -456,8 +457,8 @@ msgstr "tips: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 #: postmaster/postmaster.c:2213 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6779 -#: utils/misc/guc.c:6820 +#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6785 +#: utils/misc/guc.c:6826 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" @@ -521,10 +522,10 @@ msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" #: access/transam/twophase.c:1711 access/transam/xlogarchive.c:120 #: access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 #: postmaster/syslogger.c:1537 replication/logical/origin.c:591 -#: replication/logical/reorderbuffer.c:4531 -#: replication/logical/snapbuild.c:1700 replication/logical/snapbuild.c:2134 -#: replication/slot.c:1936 storage/file/fd.c:832 storage/file/fd.c:3325 -#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 +#: replication/logical/reorderbuffer.c:4660 +#: replication/logical/snapbuild.c:1747 replication/logical/snapbuild.c:2181 +#: replication/slot.c:1936 storage/file/fd.c:829 storage/file/fd.c:3322 +#: storage/file/fd.c:3384 storage/file/reinit.c:262 storage/ipc/dsm.c:316 #: storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 #: utils/time/snapmgr.c:1608 #, c-format @@ -532,8 +533,8 @@ msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" #: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 -#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 -#: storage/file/fd.c:3726 +#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3314 +#: storage/file/fd.c:3723 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "kunde inte ta bort katalog \"%s\": %m" @@ -571,7 +572,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "kunde inte slå upp effektivt användar-id %ld: %s" -#: ../common/username.c:45 libpq/auth.c:1879 +#: ../common/username.c:45 libpq/auth.c:1887 msgid "user does not exist" msgstr "användaren finns inte" @@ -738,8 +739,8 @@ msgstr "kunde inte öppna föräldratabell för index \"%s\"" msgid "index \"%s\" is not valid" msgstr "index \"%s\" är inte giltigt" -#: access/brin/brin_bloom.c:752 access/brin/brin_bloom.c:794 -#: access/brin/brin_minmax_multi.c:2985 access/brin/brin_minmax_multi.c:3122 +#: access/brin/brin_bloom.c:754 access/brin/brin_bloom.c:796 +#: access/brin/brin_minmax_multi.c:2976 access/brin/brin_minmax_multi.c:3113 #: statistics/dependencies.c:663 statistics/dependencies.c:716 #: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 #: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 @@ -750,7 +751,7 @@ msgstr "kan inte acceptera ett värde av type %s" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2002 +#: access/gist/gist.c:1469 access/spgist/spgdoinsert.c:2002 #: access/spgist/spgdoinsert.c:2279 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" @@ -888,67 +889,72 @@ msgstr "överskriden gräns för användardefinierade relationsparametertyper" msgid "RESET must not include values for parameters" msgstr "RESET får inte ha med värden på parametrar" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "okänd parameternamnrymd \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1214 +#: access/common/reloptions.c:1296 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "ogiltigt flaggnamn \"%s\": får inte innehålla \"=\"" + +#: access/common/reloptions.c:1311 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "tabeller deklarerade med WITH OIDS stöds inte" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1479 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "okänd parameter \"%s\"" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1591 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "parameter \"%s\" angiven mer än en gång" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1607 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ogiltigt värde för booleansk flagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1619 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ogiltigt värde för heltalsflagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1625 access/common/reloptions.c:1645 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "värdet %s är utanför sitt intervall för flaggan \"%s\"" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1627 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Giltiga värden är mellan \"%d\" och \"%d\"." -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1639 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ogiltigt värde för flyttalsflagga \"%s\": %s" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1647 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Giltiga värden är mellan \"%f\" och \"%f\"." -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1669 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ogiltigt värde för enum-flagga \"%s\": %s" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:2000 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "kan inte ange lagringsparametrar för partitionerad tabell" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:2001 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Ange lagringsparametrar för dess löv-partition istället." @@ -964,7 +970,7 @@ msgid "This functionality requires the server to be built with lz4 support." msgstr "Denna funktionalitet kräver att servern byggts med lz4-stöd." #: access/common/tupdesc.c:837 commands/tablecmds.c:7025 -#: commands/tablecmds.c:13203 +#: commands/tablecmds.c:13244 #, c-format msgid "too many array dimensions" msgstr "för många array-dimensioner" @@ -1005,18 +1011,18 @@ msgstr "kan inte flytta temporära index tillhörande andra sessioner" msgid "failed to re-find tuple within index \"%s\"" msgstr "misslyckades att återfinna tuple i index \"%s\"" -#: access/gin/ginscan.c:431 +#: access/gin/ginscan.c:436 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "gamla GIN-index stöder inte hela-index-scan eller sökningar efter null" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "För att fixa detta, kör REINDEX INDEX \"%s\"." #: access/gin/ginutil.c:146 executor/execExpr.c:2177 -#: utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 +#: utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6741 #: utils/adt/rowtypes.c:984 #, c-format msgid "could not identify a comparison function for type %s" @@ -1058,7 +1064,7 @@ msgstr "Detta orsakas av en inkomplett siduppdelning under krashåterställning msgid "Please REINDEX it." msgstr "Var vänlig och kör REINDEX på det." -#: access/gist/gist.c:1195 +#: access/gist/gist.c:1202 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "lagar ofärdig split i index \"%s\", block %u" @@ -1101,9 +1107,9 @@ msgstr "operatorfamiljen \"%s\" för accessmetod %s innehåller en inkorrekt ORD msgid "could not determine which collation to use for string hashing" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för sträng-hashning" -#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:671 -#: catalog/heap.c:677 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2022 commands/tablecmds.c:17711 commands/view.c:86 +#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:336 catalog/heap.c:672 +#: catalog/heap.c:678 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17775 commands/view.c:86 #: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 #: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 #: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 @@ -1158,39 +1164,39 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion för op msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar mellan-typ-operator(er)" -#: access/heap/heapam.c:2049 +#: access/heap/heapam.c:2084 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "kan inte lägga till tupler i en parellell arbetare" -#: access/heap/heapam.c:2568 +#: access/heap/heapam.c:2607 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "kan inte radera tupler under en parallell operation" -#: access/heap/heapam.c:2615 +#: access/heap/heapam.c:2654 #, c-format msgid "attempted to delete invisible tuple" msgstr "försökte ta bort en osynlig tuple" -#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 +#: access/heap/heapam.c:3104 access/heap/heapam.c:6380 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "kan inte uppdatera tupler under en parallell operation" -#: access/heap/heapam.c:3239 +#: access/heap/heapam.c:3280 #, c-format msgid "attempted to update invisible tuple" msgstr "försökte uppdatera en osynlig tuple" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4791 access/heap/heapam.c:4829 +#: access/heap/heapam.c:5094 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "kunde inte låsa rad i relationen \"%s\"" -#: access/heap/heapam.c:6152 commands/trigger.c:3347 -#: executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 +#: access/heap/heapam.c:6193 commands/trigger.c:3377 +#: executor/nodeModifyTable.c:2402 executor/nodeModifyTable.c:2493 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "tupel som skall uppdateras hade redan ändrats av en operation som triggats av aktuellt kommando" @@ -1212,8 +1218,8 @@ msgstr "kunde inte skriva till fil \"%s\", skrev %d av %d: %m." #: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:2974 access/transam/xlog.c:3165 -#: access/transam/xlog.c:3941 access/transam/xlog.c:8780 +#: access/transam/xlog.c:2975 access/transam/xlog.c:3166 +#: access/transam/xlog.c:3942 access/transam/xlog.c:8819 #: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 #: backup/basebackup_server.c:244 commands/dbcommands.c:495 #: postmaster/postmaster.c:4558 postmaster/postmaster.c:5562 @@ -1230,11 +1236,11 @@ msgstr "kunde inte trunkera fil \"%s\" till %u: %m" #: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3024 access/transam/xlog.c:3221 -#: access/transam/xlog.c:3953 commands/dbcommands.c:507 +#: access/transam/xlog.c:3025 access/transam/xlog.c:3222 +#: access/transam/xlog.c:3954 commands/dbcommands.c:507 #: postmaster/postmaster.c:4568 postmaster/postmaster.c:4578 #: replication/logical/origin.c:615 replication/logical/origin.c:657 -#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1776 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1823 #: replication/slot.c:1839 storage/file/buffile.c:545 #: storage/file/copydir.c:197 utils/init/miscinit.c:1656 #: utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4387 @@ -1480,8 +1486,8 @@ msgid "cannot access index \"%s\" while it is being reindexed" msgstr "kan inte använda index \"%s\" som håller på att indexeras om" #: access/index/indexam.c:208 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17406 commands/tablecmds.c:19275 +#: commands/indexcmds.c:2884 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17470 commands/tablecmds.c:19347 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" är inte ett index" @@ -1527,17 +1533,17 @@ msgstr "index \"%s\" innehåller en halvdöd intern sida" msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Detta kan ha orsakats av en avbruten VACUUM i version 9.3 eller äldre, innan uppdatering. Vänligen REINDEX:era det." -#: access/nbtree/nbtutils.c:2677 +#: access/nbtree/nbtutils.c:2683 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "indexradstorlek %zu överstiger btree version %u maximum %zu för index \"%s\"" -#: access/nbtree/nbtutils.c:2683 +#: access/nbtree/nbtutils.c:2689 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexrad refererar tupel (%u,%u) i relation \"%s\"." -#: access/nbtree/nbtutils.c:2687 +#: access/nbtree/nbtutils.c:2693 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -2022,7 +2028,7 @@ msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "beräknad CRC-checksumma matchar inte värdet som är lagrat i filen \"%s\"" #: access/transam/twophase.c:1413 access/transam/xlogrecovery.c:590 -#: replication/logical/logical.c:210 replication/walsender.c:687 +#: replication/logical/logical.c:210 replication/walsender.c:690 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Misslyckades vid allokering av en WAL-läs-processor." @@ -2249,443 +2255,443 @@ msgstr "kan inte commit:a subtransaktioner undert en parallell operation" msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "kan inte ha mer än 2^32-1 undertransaktioner i en transaktion" -#: access/transam/xlog.c:1469 +#: access/transam/xlog.c:1470 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "förfrågan att flush:a efter slutet av genererad WAL; efterfrågad %X/%X, aktuell position %X/%X" -#: access/transam/xlog.c:2231 +#: access/transam/xlog.c:2232 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "kunde inte skriva till loggfil %s vid offset %u, längd %zu: %m" -#: access/transam/xlog.c:3458 access/transam/xlogutils.c:833 -#: replication/walsender.c:2725 +#: access/transam/xlog.c:3459 access/transam/xlogutils.c:833 +#: replication/walsender.c:2758 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "efterfrågat WAL-segment %s har redan tagits bort" -#: access/transam/xlog.c:3742 +#: access/transam/xlog.c:3743 #, c-format msgid "could not rename file \"%s\": %m" msgstr "kunde inte byta namn på fil \"%s\": %m" -#: access/transam/xlog.c:3784 access/transam/xlog.c:3794 +#: access/transam/xlog.c:3785 access/transam/xlog.c:3795 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "krävd WAL-katalog \"%s\" finns inte" -#: access/transam/xlog.c:3800 +#: access/transam/xlog.c:3801 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "skapar saknad WAL-katalog \"%s\"" -#: access/transam/xlog.c:3803 commands/dbcommands.c:3192 +#: access/transam/xlog.c:3804 commands/dbcommands.c:3192 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "kunde inte skapa saknad katalog \"%s\": %m" -#: access/transam/xlog.c:3870 +#: access/transam/xlog.c:3871 #, c-format msgid "could not generate secret authorization token" msgstr "kunde inte generera hemligt auktorisationstoken" -#: access/transam/xlog.c:4020 access/transam/xlog.c:4029 -#: access/transam/xlog.c:4053 access/transam/xlog.c:4060 -#: access/transam/xlog.c:4067 access/transam/xlog.c:4072 -#: access/transam/xlog.c:4079 access/transam/xlog.c:4086 -#: access/transam/xlog.c:4093 access/transam/xlog.c:4100 -#: access/transam/xlog.c:4107 access/transam/xlog.c:4114 -#: access/transam/xlog.c:4123 access/transam/xlog.c:4130 +#: access/transam/xlog.c:4021 access/transam/xlog.c:4030 +#: access/transam/xlog.c:4054 access/transam/xlog.c:4061 +#: access/transam/xlog.c:4068 access/transam/xlog.c:4073 +#: access/transam/xlog.c:4080 access/transam/xlog.c:4087 +#: access/transam/xlog.c:4094 access/transam/xlog.c:4101 +#: access/transam/xlog.c:4108 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4124 access/transam/xlog.c:4131 #: utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "databasfilerna är inkompatibla med servern" -#: access/transam/xlog.c:4021 +#: access/transam/xlog.c:4022 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d (0x%08x), men servern kompilerades med PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4025 +#: access/transam/xlog.c:4026 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Detta kan orsakas av en felaktig byte-ordning. Du behöver troligen köra initdb." -#: access/transam/xlog.c:4030 +#: access/transam/xlog.c:4031 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d, men servern kompilerades med PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4033 access/transam/xlog.c:4057 -#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 +#: access/transam/xlog.c:4034 access/transam/xlog.c:4058 +#: access/transam/xlog.c:4065 access/transam/xlog.c:4070 #, c-format msgid "It looks like you need to initdb." msgstr "Du behöver troligen köra initdb." -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4045 #, c-format msgid "incorrect checksum in control file" msgstr "ogiltig kontrollsumma kontrollfil" -#: access/transam/xlog.c:4054 +#: access/transam/xlog.c:4055 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Databasklustret initierades med CATALOG_VERSION_NO %d, men servern kompilerades med CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4061 +#: access/transam/xlog.c:4062 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Databasklustret initierades med MAXALIGN %d, men servern kompilerades med MAXALIGN %d." -#: access/transam/xlog.c:4068 +#: access/transam/xlog.c:4069 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Databasklustret verkar använda en annan flyttalsrepresentation än vad serverprogrammet gör." -#: access/transam/xlog.c:4073 +#: access/transam/xlog.c:4074 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Databasklustret initierades med BLCKSZ %d, men servern kompilerades med BLCKSZ %d." -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 -#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 -#: access/transam/xlog.c:4118 access/transam/xlog.c:4126 -#: access/transam/xlog.c:4133 +#: access/transam/xlog.c:4077 access/transam/xlog.c:4084 +#: access/transam/xlog.c:4091 access/transam/xlog.c:4098 +#: access/transam/xlog.c:4105 access/transam/xlog.c:4112 +#: access/transam/xlog.c:4119 access/transam/xlog.c:4127 +#: access/transam/xlog.c:4134 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Det verkar som om du måste kompilera om eller köra initdb." -#: access/transam/xlog.c:4080 +#: access/transam/xlog.c:4081 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Databasklustret initierades med RELSEG_SIZE %d, men servern kompilerades med RELSEG_SIZE %d." -#: access/transam/xlog.c:4087 +#: access/transam/xlog.c:4088 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Databasklustret initierades med XLOG_BLCKSZ %d, men servern kompilerades med XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4094 +#: access/transam/xlog.c:4095 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Databasklustret initierades med NAMEDATALEN %d, men servern kompilerades med NAMEDATALEN %d." -#: access/transam/xlog.c:4101 +#: access/transam/xlog.c:4102 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Databasklustret initierades med INDEX_MAX_KEYS %d, men servern kompilerades med INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4108 +#: access/transam/xlog.c:4109 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Databasklustret initierades med TOAST_MAX_CHUNK_SIZE %d, men servern kompilerades med TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4115 +#: access/transam/xlog.c:4116 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Databasklustret initierades med LOBLKSIZE %d, men servern kompilerades med LOBLKSIZE %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4125 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades utan USE_FLOAT8_BYVAL, men servern kompilerades med USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4132 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades med USE_FLOAT8_BYVAL, men servern kompilerades utan USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4140 +#: access/transam/xlog.c:4141 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte" -#: access/transam/xlog.c:4152 +#: access/transam/xlog.c:4153 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" måste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4157 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" måste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:4311 catalog/namespace.c:4335 +#: access/transam/xlog.c:4312 catalog/namespace.c:4335 #: commands/tablespace.c:1216 commands/user.c:2530 commands/variable.c:72 #: tcop/postgres.c:3676 utils/error/elog.c:2242 #, c-format msgid "List syntax is invalid." msgstr "List-syntaxen är ogiltig." -#: access/transam/xlog.c:4357 commands/user.c:2546 commands/variable.c:173 +#: access/transam/xlog.c:4358 commands/user.c:2546 commands/variable.c:173 #: tcop/postgres.c:3692 utils/error/elog.c:2268 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Okänt nyckelord: \"%s\"" -#: access/transam/xlog.c:4771 +#: access/transam/xlog.c:4772 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "kunde inte skriva bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:4779 +#: access/transam/xlog.c:4780 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "kunde inte fsync:a bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:4785 +#: access/transam/xlog.c:4786 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "kunde inte stänga bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:5002 +#: access/transam/xlog.c:5003 #, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "WAL genererades med wal_level=minimal, kan inte fortsätta återställande" -#: access/transam/xlog.c:5003 +#: access/transam/xlog.c:5004 #, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." msgstr "Detta händer om du temporärt sätter wal_level=minimal på servern." -#: access/transam/xlog.c:5004 +#: access/transam/xlog.c:5005 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "Använd en backup som är tagen efter att inställningen wal_level satts till ett högre värde än minimal." -#: access/transam/xlog.c:5068 +#: access/transam/xlog.c:5069 #, c-format msgid "control file contains invalid checkpoint location" msgstr "kontrollfil innehåller ogiltig checkpoint-position" -#: access/transam/xlog.c:5079 +#: access/transam/xlog.c:5080 #, c-format msgid "database system was shut down at %s" msgstr "databassystemet stängdes ner vid %s" -#: access/transam/xlog.c:5085 +#: access/transam/xlog.c:5086 #, c-format msgid "database system was shut down in recovery at %s" msgstr "databassystemet stängdes ner under återställning vid %s" -#: access/transam/xlog.c:5091 +#: access/transam/xlog.c:5092 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "nedstängning av databasen avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:5097 +#: access/transam/xlog.c:5098 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "databassystemet avbröts under återställning vid %s" -#: access/transam/xlog.c:5099 +#: access/transam/xlog.c:5100 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Det betyder troligen att en del data är förstörd och du behöver återställa databasen från den senaste backup:en." -#: access/transam/xlog.c:5105 +#: access/transam/xlog.c:5106 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "databassystemet avbröts under återställning vid loggtid %s" -#: access/transam/xlog.c:5107 +#: access/transam/xlog.c:5108 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Om detta har hänt mer än en gång så kan data vara korrupt och du kanske måste återställa till ett tidigare återställningsmål." -#: access/transam/xlog.c:5113 +#: access/transam/xlog.c:5114 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "databassystemet avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:5119 +#: access/transam/xlog.c:5120 #, c-format msgid "control file contains invalid database cluster state" msgstr "kontrollfil innehåller ogiltigt databasklustertillstånd" -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5505 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL slutar före sluttiden av online-backup:en" -#: access/transam/xlog.c:5505 +#: access/transam/xlog.c:5506 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Alla genererade WAL under tiden online-backup:en togs måste vara tillgängliga vid återställning." -#: access/transam/xlog.c:5508 +#: access/transam/xlog.c:5509 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL avslutas innan konstistent återställningspunkt" -#: access/transam/xlog.c:5554 +#: access/transam/xlog.c:5555 #, c-format msgid "selected new timeline ID: %u" msgstr "valt nytt tidslinje-ID: %u" -#: access/transam/xlog.c:5587 +#: access/transam/xlog.c:5588 #, c-format msgid "archive recovery complete" msgstr "arkivåterställning klar" -#: access/transam/xlog.c:6217 +#: access/transam/xlog.c:6218 #, c-format msgid "shutting down" msgstr "stänger ner" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6256 +#: access/transam/xlog.c:6257 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "restartpoint startar:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6268 +#: access/transam/xlog.c:6269 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "checkpoint startar:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6333 +#: access/transam/xlog.c:6334 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "restartpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB; lsn=%X/%X, redo-lsn=%X/%X" -#: access/transam/xlog.c:6356 +#: access/transam/xlog.c:6357 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "checkpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB; lsn=%X/%X, redo-lsn=%X/%X" -#: access/transam/xlog.c:6801 +#: access/transam/xlog.c:6812 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "samtidig write-ahead-logg-aktivitet när databassystemet stängs ner" -#: access/transam/xlog.c:7362 +#: access/transam/xlog.c:7399 #, c-format msgid "recovery restart point at %X/%X" msgstr "återställningens omstartspunkt vid %X/%X" -#: access/transam/xlog.c:7364 +#: access/transam/xlog.c:7401 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:7612 +#: access/transam/xlog.c:7651 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "återställningspunkt \"%s\" skapad vid %X/%X" -#: access/transam/xlog.c:7819 +#: access/transam/xlog.c:7858 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "online-backup avbröts, återställning kan inte fortsätta" -#: access/transam/xlog.c:7877 +#: access/transam/xlog.c:7916 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för nedstängning" -#: access/transam/xlog.c:7935 +#: access/transam/xlog.c:7974 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för online" -#: access/transam/xlog.c:7964 +#: access/transam/xlog.c:8003 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i post för slutet av återställning" -#: access/transam/xlog.c:8231 +#: access/transam/xlog.c:8270 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" -#: access/transam/xlog.c:8236 +#: access/transam/xlog.c:8275 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "kunde inte fdatasync:a fil \"%s\": %m" -#: access/transam/xlog.c:8321 access/transam/xlog.c:8644 +#: access/transam/xlog.c:8360 access/transam/xlog.c:8683 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "WAL-nivå inte tillräcklig för att kunna skapa en online-backup" -#: access/transam/xlog.c:8322 access/transam/xlog.c:8645 +#: access/transam/xlog.c:8361 access/transam/xlog.c:8684 #: access/transam/xlogfuncs.c:254 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "wal_level måste vara satt till \"replica\" eller \"logical\" vid serverstart." -#: access/transam/xlog.c:8327 +#: access/transam/xlog.c:8366 #, c-format msgid "backup label too long (max %d bytes)" msgstr "backup-etikett för lång (max %d byte)" -#: access/transam/xlog.c:8448 +#: access/transam/xlog.c:8487 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "WAL skapad med full_page_writes=off har återspelats sedab senaste omstartpunkten" -#: access/transam/xlog.c:8450 access/transam/xlog.c:8733 +#: access/transam/xlog.c:8489 access/transam/xlog.c:8772 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." msgstr "Det betyder att backup:en som tas på standby:en är trasig och inte skall användas. Slå på full_page_writes och kör CHECKPOINT på primären och försök sedan ta en ny online-backup igen." -#: access/transam/xlog.c:8517 backup/basebackup.c:1355 utils/adt/misc.c:354 +#: access/transam/xlog.c:8556 backup/basebackup.c:1355 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: access/transam/xlog.c:8524 backup/basebackup.c:1360 utils/adt/misc.c:359 +#: access/transam/xlog.c:8563 backup/basebackup.c:1360 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "mål för symbolisk länk \"%s\" är för lång" -#: access/transam/xlog.c:8683 backup/basebackup.c:1221 +#: access/transam/xlog.c:8722 backup/basebackup.c:1221 #, c-format msgid "the standby was promoted during online backup" msgstr "standby:en befordrades under online-backup" -#: access/transam/xlog.c:8684 backup/basebackup.c:1222 +#: access/transam/xlog.c:8723 backup/basebackup.c:1222 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Det betyder att backupen som tas är trasig och inte skall användas. Försök ta en ny online-backup." -#: access/transam/xlog.c:8731 +#: access/transam/xlog.c:8770 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "WAL skapad med full_page_writes=off återspelades under online-backup" -#: access/transam/xlog.c:8847 +#: access/transam/xlog.c:8886 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "base_backup klar, väntar på att de WAL-segment som krävs blir arkiverade" -#: access/transam/xlog.c:8861 +#: access/transam/xlog.c:8900 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "väntar fortfarande på att alla krävda WAL-segments skall bli arkiverade (%d sekunder har gått)" -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8902 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Kontrollera att ditt archive_command kör som det skall. Du kan avbryta denna backup på ett säkert sätt men databasbackup:en kommer inte vara användbart utan att alla WAL-segment finns." -#: access/transam/xlog.c:8870 +#: access/transam/xlog.c:8909 #, c-format msgid "all required WAL segments have been archived" msgstr "alla krävda WAL-segments har arkiverats" -#: access/transam/xlog.c:8874 +#: access/transam/xlog.c:8913 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL-arkivering är inte påslagen; du måste se till att alla krävda WAL-segment har kopierats på annat sätt för att backup:en skall vara komplett" -#: access/transam/xlog.c:8913 +#: access/transam/xlog.c:8952 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "avbryter backup på grund av att backend:en stoppades innan pg_backup_stop anropades" @@ -2832,147 +2838,147 @@ msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1136 +#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1146 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: access/transam/xlogreader.c:760 +#: access/transam/xlogreader.c:761 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: access/transam/xlogreader.c:773 +#: access/transam/xlogreader.c:774 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: access/transam/xlogreader.c:1144 +#: access/transam/xlogreader.c:1154 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: access/transam/xlogreader.c:1157 access/transam/xlogreader.c:1173 +#: access/transam/xlogreader.c:1167 access/transam/xlogreader.c:1183 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: access/transam/xlogreader.c:1211 +#: access/transam/xlogreader.c:1221 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: access/transam/xlogreader.c:1245 +#: access/transam/xlogreader.c:1255 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1302 +#: access/transam/xlogreader.c:1270 access/transam/xlogreader.c:1312 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1276 +#: access/transam/xlogreader.c:1286 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: access/transam/xlogreader.c:1284 +#: access/transam/xlogreader.c:1294 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud" -#: access/transam/xlogreader.c:1290 +#: access/transam/xlogreader.c:1300 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud" -#: access/transam/xlogreader.c:1322 +#: access/transam/xlogreader.c:1332 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1348 +#: access/transam/xlogreader.c:1358 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1754 +#: access/transam/xlogreader.c:1764 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" -#: access/transam/xlogreader.c:1778 +#: access/transam/xlogreader.c:1788 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: access/transam/xlogreader.c:1785 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: access/transam/xlogreader.c:1821 +#: access/transam/xlogreader.c:1831 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1837 +#: access/transam/xlogreader.c:1847 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1876 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X" -#: access/transam/xlogreader.c:1882 +#: access/transam/xlogreader.c:1892 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: access/transam/xlogreader.c:1894 +#: access/transam/xlogreader.c:1904 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: access/transam/xlogreader.c:1961 +#: access/transam/xlogreader.c:1971 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: access/transam/xlogreader.c:1987 +#: access/transam/xlogreader.c:1997 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "kunde inte hitta backup-block med ID %d i WAL-post" -#: access/transam/xlogreader.c:2071 +#: access/transam/xlogreader.c:2081 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet" -#: access/transam/xlogreader.c:2078 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d" -#: access/transam/xlogreader.c:2105 access/transam/xlogreader.c:2122 +#: access/transam/xlogreader.c:2115 access/transam/xlogreader.c:2132 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: access/transam/xlogreader.c:2131 +#: access/transam/xlogreader.c:2141 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: access/transam/xlogreader.c:2139 +#: access/transam/xlogreader.c:2149 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "kunde inte packa upp avbild vid %X/%X, block %d" @@ -3903,19 +3909,19 @@ msgstr "kan inte använda IN SCHEMA-klausul samtidigt som GRANT/REVOKE ON SCHEMA #: catalog/aclchk.c:1596 catalog/catalog.c:661 catalog/objectaddress.c:1561 #: catalog/pg_publication.c:533 commands/analyze.c:390 commands/copy.c:837 -#: commands/sequence.c:1673 commands/tablecmds.c:7411 commands/tablecmds.c:7567 -#: commands/tablecmds.c:7617 commands/tablecmds.c:7691 -#: commands/tablecmds.c:7761 commands/tablecmds.c:7877 -#: commands/tablecmds.c:7971 commands/tablecmds.c:8030 -#: commands/tablecmds.c:8119 commands/tablecmds.c:8149 -#: commands/tablecmds.c:8277 commands/tablecmds.c:8359 -#: commands/tablecmds.c:8493 commands/tablecmds.c:8605 -#: commands/tablecmds.c:12426 commands/tablecmds.c:12618 -#: commands/tablecmds.c:12779 commands/tablecmds.c:13974 -#: commands/tablecmds.c:16506 commands/trigger.c:949 parser/analyze.c:2529 +#: commands/sequence.c:1673 commands/tablecmds.c:7444 commands/tablecmds.c:7600 +#: commands/tablecmds.c:7650 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7794 commands/tablecmds.c:7910 +#: commands/tablecmds.c:8004 commands/tablecmds.c:8063 +#: commands/tablecmds.c:8152 commands/tablecmds.c:8182 +#: commands/tablecmds.c:8310 commands/tablecmds.c:8392 +#: commands/tablecmds.c:8526 commands/tablecmds.c:8638 +#: commands/tablecmds.c:12467 commands/tablecmds.c:12659 +#: commands/tablecmds.c:12820 commands/tablecmds.c:14038 +#: commands/tablecmds.c:16570 commands/trigger.c:949 parser/analyze.c:2529 #: parser/parse_relation.c:737 parser/parse_target.c:1068 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3443 -#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2876 +#: parser/parse_utilcmd.c:3479 parser/parse_utilcmd.c:3521 utils/adt/acl.c:2893 #: utils/adt/ruleutils.c:2793 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -3926,15 +3932,15 @@ msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" msgid "\"%s\" is an index" msgstr "\"%s\" är ett index" -#: catalog/aclchk.c:1848 commands/tablecmds.c:14131 commands/tablecmds.c:17415 +#: catalog/aclchk.c:1848 commands/tablecmds.c:14195 commands/tablecmds.c:17479 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" är en composite-typ" #: catalog/aclchk.c:1856 catalog/objectaddress.c:1401 commands/sequence.c:1178 -#: commands/tablecmds.c:254 commands/tablecmds.c:17379 utils/adt/acl.c:2084 -#: utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 -#: utils/adt/acl.c:2206 utils/adt/acl.c:2236 +#: commands/tablecmds.c:254 commands/tablecmds.c:17443 utils/adt/acl.c:2101 +#: utils/adt/acl.c:2131 utils/adt/acl.c:2163 utils/adt/acl.c:2195 +#: utils/adt/acl.c:2223 utils/adt/acl.c:2253 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" är inte en sekvens" @@ -4448,13 +4454,13 @@ msgstr "kan inte ta bort %s eftersom andra objekt beror på den" #: catalog/dependency.c:1209 catalog/dependency.c:1216 #: catalog/dependency.c:1227 commands/tablecmds.c:1349 -#: commands/tablecmds.c:14618 commands/tablespace.c:466 commands/user.c:1303 -#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 -#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 +#: commands/tablecmds.c:14682 commands/tablespace.c:466 commands/user.c:1303 +#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:334 +#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1084 #: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 -#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6673 -#: utils/misc/guc.c:6707 utils/misc/guc.c:6741 utils/misc/guc.c:6784 -#: utils/misc/guc.c:6826 +#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6679 +#: utils/misc/guc.c:6713 utils/misc/guc.c:6747 utils/misc/guc.c:6790 +#: utils/misc/guc.c:6832 #, c-format msgid "%s" msgstr "%s" @@ -4487,66 +4493,66 @@ msgstr "konstant av typen %s kan inte användas här" msgid "column %d of relation \"%s\" does not exist" msgstr "kolumn %d i relation \"%s\" finns inte" -#: catalog/heap.c:324 +#: catalog/heap.c:325 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "rättighet saknas för att skapa \"%s.%s\"" -#: catalog/heap.c:326 +#: catalog/heap.c:327 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Systemkatalogändringar är för tillfället inte tillåtna." -#: catalog/heap.c:466 commands/tablecmds.c:2388 commands/tablecmds.c:3061 +#: catalog/heap.c:467 commands/tablecmds.c:2388 commands/tablecmds.c:3061 #: commands/tablecmds.c:6994 #, c-format msgid "tables can have at most %d columns" msgstr "tabeller kan ha som mest %d kolumner" -#: catalog/heap.c:484 commands/tablecmds.c:7301 +#: catalog/heap.c:485 commands/tablecmds.c:7334 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "kolumnnamn \"%s\" står i konflikt med ett systemkolumnnamn" -#: catalog/heap.c:500 +#: catalog/heap.c:501 #, c-format msgid "column name \"%s\" specified more than once" msgstr "kolumnnamn \"%s\" angiven mer än en gång" #. translator: first %s is an integer not a name -#: catalog/heap.c:578 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "partitionsnyckelkolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:583 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "kolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:614 +#: catalog/heap.c:615 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "composite-typ %s kan inte vara en del av sig själv" #. translator: first %s is an integer not a name -#: catalog/heap.c:669 +#: catalog/heap.c:670 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "ingen jämförelse kunde härledas för partitionsnyckelkolumn %s med jämförelsetyp %s" -#: catalog/heap.c:675 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:676 commands/createas.c:203 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "ingen jämförelse kunde härledas för kolumn \"%s\" med jämförelsetyp %s" -#: catalog/heap.c:1151 catalog/index.c:887 commands/createas.c:408 +#: catalog/heap.c:1152 catalog/index.c:887 commands/createas.c:408 #: commands/tablecmds.c:4018 #, c-format msgid "relation \"%s\" already exists" msgstr "relationen \"%s\" finns redan" -#: catalog/heap.c:1167 catalog/pg_type.c:434 catalog/pg_type.c:782 +#: catalog/heap.c:1168 catalog/pg_type.c:434 catalog/pg_type.c:782 #: catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 #: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 #: commands/typecmds.c:1575 commands/typecmds.c:2546 @@ -4554,132 +4560,132 @@ msgstr "relationen \"%s\" finns redan" msgid "type \"%s\" already exists" msgstr "typen \"%s\" existerar redan" -#: catalog/heap.c:1168 +#: catalog/heap.c:1169 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "En relation har en associerad typ med samma namn så du måste använda ett namn som inte krockar med någon existerande typ." -#: catalog/heap.c:1208 +#: catalog/heap.c:1209 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "relfile-nummervärde för toast är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:1219 +#: catalog/heap.c:1220 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "pg_class heap OID-värde är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:1229 +#: catalog/heap.c:1230 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "relfile-nummervärde är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:2129 +#: catalog/heap.c:2184 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "kan inte lägga till NO INHERIT-villkor till partitionerad tabell \"%s\"" -#: catalog/heap.c:2404 +#: catalog/heap.c:2454 #, c-format msgid "check constraint \"%s\" already exists" msgstr "check-villkor \"%s\" finns redan" -#: catalog/heap.c:2574 catalog/index.c:901 catalog/pg_constraint.c:682 -#: commands/tablecmds.c:8980 +#: catalog/heap.c:2624 catalog/index.c:901 catalog/pg_constraint.c:683 +#: commands/tablecmds.c:9013 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "integritetsvillkor \"%s\" för relation \"%s\" finns redan" -#: catalog/heap.c:2581 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med icke-ärvt villkor på relation \"%s\"" -#: catalog/heap.c:2592 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med ärvt villkor på relation \"%s\"" -#: catalog/heap.c:2602 +#: catalog/heap.c:2652 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "villkor \"%s\" står i konflikt med NOT VALID-villkor på relation \"%s\"" -#: catalog/heap.c:2607 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "slår samman villkor \"%s\" med ärvd definition" -#: catalog/heap.c:2633 catalog/pg_constraint.c:811 commands/tablecmds.c:2686 +#: catalog/heap.c:2683 catalog/pg_constraint.c:812 commands/tablecmds.c:2686 #: commands/tablecmds.c:3213 commands/tablecmds.c:6926 -#: commands/tablecmds.c:15441 commands/tablecmds.c:15582 +#: commands/tablecmds.c:15505 commands/tablecmds.c:15646 #, c-format msgid "too many inheritance parents" msgstr "för många föräldrar i arv" -#: catalog/heap.c:2717 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "kan inte använda genererad kolumn \"%s\" i kolumngenereringsuttryck" -#: catalog/heap.c:2719 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "En genererad kolumn kan inte referera till en annan genererad kolumn." -#: catalog/heap.c:2725 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "kan inte använda hela-raden-variabel i kolumngenereringsuttryck" -#: catalog/heap.c:2726 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Detta skulle leda till att den genererade kolumnen beror på sitt eget värde." -#: catalog/heap.c:2781 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "genereringsuttryck är inte immutable" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1292 +#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1292 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "kolumn \"%s\" har typ %s men default-uttryck har typen %s" -#: catalog/heap.c:2814 commands/prepare.c:334 parser/analyze.c:2753 +#: catalog/heap.c:2864 commands/prepare.c:334 parser/analyze.c:2753 #: parser/parse_target.c:593 parser/parse_target.c:883 #: parser/parse_target.c:893 rewrite/rewriteHandler.c:1297 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Du måste skriva om eller typomvandla uttrycket." -#: catalog/heap.c:2861 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "bara tabell \"%s\" kan refereras i check-villkoret" -#: catalog/heap.c:3167 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "inget stöd för kombinationen ON COMMIT och främmande nyckel" -#: catalog/heap.c:3168 +#: catalog/heap.c:3218 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabell \"%s\" refererar till \"%s\", men de har inte samma ON COMMIT-inställning." -#: catalog/heap.c:3173 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kan inte trunkera en tabell som refererars till i ett främmande nyckelvillkor" -#: catalog/heap.c:3174 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabell \"%s\" refererar till \"%s\"." -#: catalog/heap.c:3176 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunkera tabellen \"%s\" samtidigt, eller använd TRUNCATE ... CASCADE." @@ -4755,12 +4761,12 @@ msgstr "DROP INDEX CONCURRENTLY måste vara första operationen i transaktion" msgid "cannot reindex temporary tables of other sessions" msgstr "kan inte omindexera temporära tabeller som tillhör andra sessioner" -#: catalog/index.c:3685 commands/indexcmds.c:3614 +#: catalog/index.c:3685 commands/indexcmds.c:3648 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "kan inte omindexera angivet index i TOAST-tabell" -#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 +#: catalog/index.c:3701 commands/indexcmds.c:3528 commands/indexcmds.c:3672 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -4777,7 +4783,7 @@ msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "kan inte omindexera ogiltigt index \"%s.%s\" på TOAST-tabell, hoppar över" #: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5736 +#: commands/trigger.c:5766 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "referenser till andra databaser är inte implementerat: \"%s.%s.%s\"" @@ -4860,7 +4866,7 @@ msgstr "textsökkonfiguration \"%s\" finns inte" msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: catalog/namespace.c:2886 gram.y:18576 gram.y:18616 parser/parse_expr.c:839 +#: catalog/namespace.c:2886 gram.y:18583 gram.y:18623 parser/parse_expr.c:839 #: parser/parse_target.c:1267 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -4914,25 +4920,25 @@ msgstr "kan inte skapa temporära tabeller under en parallell operation" #: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 #: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2220 -#: commands/tablecmds.c:12554 +#: commands/tablecmds.c:12595 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" är inte en tabell" #: catalog/objectaddress.c:1416 commands/tablecmds.c:260 -#: commands/tablecmds.c:17384 commands/view.c:119 +#: commands/tablecmds.c:17448 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" är inte en vy" #: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 -#: commands/tablecmds.c:17389 +#: commands/tablecmds.c:17453 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" är inte en materialiserad vy" #: catalog/objectaddress.c:1430 commands/tablecmds.c:284 -#: commands/tablecmds.c:17394 +#: commands/tablecmds.c:17458 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" är inte en främmande tabell" @@ -4955,7 +4961,7 @@ msgstr "standardvärde för kolumn \"%s\" i relation \"%s\" existerar inte" #: catalog/objectaddress.c:1656 commands/functioncmds.c:138 #: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3691 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 -#: utils/adt/acl.c:4441 +#: utils/adt/acl.c:4458 #, c-format msgid "type \"%s\" does not exist" msgstr "typen \"%s\" existerar inte" @@ -4975,8 +4981,9 @@ msgstr "funktion %d (%s, %s) för %s finns inte" msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "användarmappning för användare \"%s\" på server \"%s\" finns inte" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:710 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:710 #, c-format msgid "server \"%s\" does not exist" msgstr "server \"%s\" finns inte" @@ -5613,17 +5620,17 @@ msgstr "jämförelse \"%s\" finns redan" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "jämförelse \"%s\" för kodning \"%s\" finns redan" -#: catalog/pg_constraint.c:690 +#: catalog/pg_constraint.c:691 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "villkor \"%s\" för domän %s finns redan" -#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 +#: catalog/pg_constraint.c:891 catalog/pg_constraint.c:984 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "integritetsvillkor \"%s\" för tabell \"%s\" existerar inte" -#: catalog/pg_constraint.c:1083 +#: catalog/pg_constraint.c:1084 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "villkor \"%s\" för domänen %s finns inte" @@ -5709,7 +5716,7 @@ msgid "The partition is being detached concurrently or has an unfinished detach. msgstr "Partitionen kopplas loss parallellt eller har en bortkoppling som inte är slutförd." #: catalog/pg_inherits.c:596 commands/tablecmds.c:4646 -#: commands/tablecmds.c:15697 +#: commands/tablecmds.c:15761 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Använd ALTER TABLE ... DETACH PARTITION ... FINALIZE för att slutföra den pågående bortkopplingsoperationen." @@ -6020,12 +6027,12 @@ msgstr "kan inte ta bort objekt ägda av %s eftersom de krävs av databassysteme msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "kan inte byta ägare på objekt som ägs av %s då dessa krävas av databassystemet" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:449 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "kunde inte slänga relationsmappning för prenumeration \"%s\"" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:451 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Tabellsynkronisering för relation \"%s\" pågår och är i läget \"%c\"." @@ -6033,7 +6040,7 @@ msgstr "Tabellsynkronisering för relation \"%s\" pågår och är i läget \"%c\ #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:458 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Använd %s för att slå på prenumerationen om den inte redan är på eller använd %s för att slänga prenumerationen." @@ -6179,12 +6186,12 @@ msgstr "parameter \"%s\" måste vara READ_ONLY, SHAREABLE eller READ_WRITE" msgid "event trigger \"%s\" already exists" msgstr "händelsetrigger \"%s\" finns redan" -#: commands/alter.c:90 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "främmande data-omvandlare \"%s\" finns redan" -#: commands/alter.c:93 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "servern \"%s\" finns redan" @@ -6285,7 +6292,7 @@ msgid "handler function is not specified" msgstr "hanterarfunktion ej angiven" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 +#: commands/foreigncmds.c:500 commands/proclang.c:80 commands/trigger.c:709 #: parser/parse_clause.c:941 #, c-format msgid "function %s must return type %s" @@ -6391,7 +6398,7 @@ msgstr "kan inte klustra temporära tabeller för andra sessioner" msgid "there is no previously clustered index for table \"%s\"" msgstr "det finns inget tidigare klustrat index för tabell \"%s\"" -#: commands/cluster.c:192 commands/tablecmds.c:14432 commands/tablecmds.c:16276 +#: commands/cluster.c:192 commands/tablecmds.c:14496 commands/tablecmds.c:16340 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "index \"%s\" för tabell \"%s\" finns inte" @@ -6406,7 +6413,7 @@ msgstr "kan inte klustra en delad katalog" msgid "cannot vacuum temporary tables of other sessions" msgstr "kan inte städa temporära tabeller för andra sessioner" -#: commands/cluster.c:513 commands/tablecmds.c:16286 +#: commands/cluster.c:513 commands/tablecmds.c:16350 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" är inte ett index för tabell \"%s\"" @@ -6466,12 +6473,12 @@ msgid "collation attribute \"%s\" not recognized" msgstr "jämförelsesattribut \"%s\" känns inte igen" #: commands/collationcmds.c:125 commands/collationcmds.c:131 -#: commands/define.c:389 commands/tablecmds.c:7952 +#: commands/define.c:389 commands/tablecmds.c:7985 #: replication/pgoutput/pgoutput.c:316 replication/pgoutput/pgoutput.c:339 #: replication/pgoutput/pgoutput.c:353 replication/pgoutput/pgoutput.c:363 #: replication/pgoutput/pgoutput.c:373 replication/pgoutput/pgoutput.c:383 -#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:996 -#: replication/walsender.c:1018 replication/walsender.c:1028 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:999 +#: replication/walsender.c:1021 replication/walsender.c:1031 #, c-format msgid "conflicting or redundant options" msgstr "motstridiga eller redundanta inställningar" @@ -6540,9 +6547,9 @@ msgstr "kan inte refresha versionen på standardjämförelse" #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command #: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 -#: commands/tablecmds.c:7777 commands/tablecmds.c:7787 -#: commands/tablecmds.c:14134 commands/tablecmds.c:17417 -#: commands/tablecmds.c:17438 commands/typecmds.c:3637 commands/typecmds.c:3720 +#: commands/tablecmds.c:7810 commands/tablecmds.c:7820 +#: commands/tablecmds.c:14198 commands/tablecmds.c:17481 +#: commands/tablecmds.c:17502 commands/typecmds.c:3637 commands/typecmds.c:3720 #: commands/typecmds.c:4013 #, c-format msgid "Use %s instead." @@ -7682,7 +7689,7 @@ msgstr "Använd DROP AGGREGATE för att ta bort aggregatfunktioner." #: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3739 #: commands/tablecmds.c:3897 commands/tablecmds.c:3949 -#: commands/tablecmds.c:16701 tcop/utility.c:1336 +#: commands/tablecmds.c:16765 tcop/utility.c:1336 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "relation \"%s\" finns inte, hoppar över" @@ -7807,7 +7814,7 @@ msgstr "regel \"%s\" för relation \"%s\" finns inte, hoppar över" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "främmande data-omvandlare \"%s\" finns inte, hoppar över" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "servern \"%s\" finns inte, hoppar över" @@ -8202,112 +8209,112 @@ msgstr "kan inte lägga till schema \"%s\" till utökningen \"%s\" eftersom sche msgid "file \"%s\" is too large" msgstr "filen \"%s\" är för stor" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "flaggan \"%s\" hittades inte" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "flaggan \"%s\" angiven mer än en gång" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att byta ägare på främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "Måste vara superuser för att byta ägare på en främmande data-omvandlare." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Ägaren av en främmande data-omvandlare måste vara en superuser." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:688 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:688 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "främmande data-omvandlare \"%s\" finns inte" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "främmande data-omvandlare med OID %u finns inte" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "främmande server med OID %u finns inte" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att skapa främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Måste vara superuser för att skapa främmande data-omvandlare." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att ändra främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Måste vara superuser för att ändra främmande data-omvandlare." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "att ändra främmande data-omvandlares hanterare kan byta beteende på existerande främmande tabeller" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "att ändra främmande data-omvandlares validator kan göra att flaggor för beroende objekt invalideras" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "server \"%s\" finns redan, hoppar över" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "användarmappning för \"%s\" finns redan för server \"%s\", hoppar över" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "användarmappning för \"%s\" finns redan för server \"%s\"" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "användarmappning för \"%s\" finns inte för servern \"%s\"" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "användarmappning för \"%s\" finns inte för servern \"%s\", hoppar över" -#: commands/foreigncmds.c:1507 foreign/foreign.c:401 +#: commands/foreigncmds.c:1518 foreign/foreign.c:401 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "främmande data-omvandlare \"%s\" har ingen hanterare" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "främmande data-omvandlare \"%s\" stöder inte IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "importerar främmande tabell \"%s\"" @@ -8826,8 +8833,8 @@ msgstr "inkluderad kolumn stöder inte NULLS FIRST/LAST-flaggor" msgid "could not determine which collation to use for index expression" msgstr "kunde inte bestämma vilken jämförelse (collation) som skulle användas för indexuttryck" -#: commands/indexcmds.c:2029 commands/tablecmds.c:17718 commands/typecmds.c:807 -#: parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 +#: commands/indexcmds.c:2029 commands/tablecmds.c:17782 commands/typecmds.c:807 +#: parser/parse_expr.c:2730 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 #: utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" @@ -8863,8 +8870,8 @@ msgstr "accessmetod \"%s\" stöder inte ASC/DESC-flaggor" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "accessmetod \"%s\" stöder inte NULLS FIRST/LAST-flaggor" -#: commands/indexcmds.c:2211 commands/tablecmds.c:17743 -#: commands/tablecmds.c:17749 commands/typecmds.c:2301 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17807 +#: commands/tablecmds.c:17813 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "datatyp %s har ingen standardoperatorklass för accessmetod \"%s\"" @@ -8890,83 +8897,83 @@ msgstr "operatorklass \"%s\" accepterar inte datatypen %s" msgid "there are multiple default operator classes for data type %s" msgstr "det finns flera standardoperatorklasser för datatypen %s" -#: commands/indexcmds.c:2682 +#: commands/indexcmds.c:2716 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "okänd REINDEX-flagga \"%s\"" -#: commands/indexcmds.c:2906 +#: commands/indexcmds.c:2940 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "tabell \"%s\" har inga index som kan reindexeras parallellt" -#: commands/indexcmds.c:2920 +#: commands/indexcmds.c:2954 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "tabell \"%s\" har inga index som kan omindexeras" -#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 -#: commands/indexcmds.c:3603 +#: commands/indexcmds.c:2999 commands/indexcmds.c:3509 +#: commands/indexcmds.c:3637 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "kan inte omindexera systemkataloger parallellt" -#: commands/indexcmds.c:2988 +#: commands/indexcmds.c:3022 #, c-format msgid "can only reindex the currently open database" msgstr "kan bara omindexera den aktiva databasen" -#: commands/indexcmds.c:3082 +#: commands/indexcmds.c:3116 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla" -#: commands/indexcmds.c:3115 +#: commands/indexcmds.c:3149 #, c-format msgid "cannot move system relations, skipping all" msgstr "kan inte flytta systemrelationer, hoppar över alla" -#: commands/indexcmds.c:3161 +#: commands/indexcmds.c:3195 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "vid omindexering av partitionerad tabell \"%s.%s\"" -#: commands/indexcmds.c:3164 +#: commands/indexcmds.c:3198 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "vid omindexering av partitionerat index \"%s.%s\"" -#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 +#: commands/indexcmds.c:3389 commands/indexcmds.c:4253 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "tabell \"%s.%s\" omindexerades" -#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 +#: commands/indexcmds.c:3541 commands/indexcmds.c:3593 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "kan inte parallellt omindexera ogiltigt index \"%s.%s\", hoppar över" -#: commands/indexcmds.c:3513 +#: commands/indexcmds.c:3547 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "kan inte parallellt omindexera uteslutningsvillkorsindex \"%s.%s\", hoppar över" -#: commands/indexcmds.c:3668 +#: commands/indexcmds.c:3702 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "kan inte parallellt omindexera denna sorts relation" -#: commands/indexcmds.c:3689 +#: commands/indexcmds.c:3723 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "kan inte flytta ickedelad relation till tabellutryumme \"%s\"" -#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 +#: commands/indexcmds.c:4234 commands/indexcmds.c:4246 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "index \"%s.%s\" omindexerades" -#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 +#: commands/indexcmds.c:4236 commands/indexcmds.c:4255 #, c-format msgid "%s." msgstr "%s." @@ -8981,7 +8988,7 @@ msgstr "kan inte låsa relationen \"%s\"" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY kan inte användas när den materialiserade vyn inte är populerad" -#: commands/matview.c:199 gram.y:18313 +#: commands/matview.c:199 gram.y:18320 #, c-format msgid "%s and %s options cannot be used together" msgstr "flaggorna %s och %s kan inte användas ihop" @@ -9281,8 +9288,8 @@ msgstr "operatorattribut \"%s\" kan inte ändras" #: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 #: commands/tablecmds.c:1630 commands/tablecmds.c:2233 #: commands/tablecmds.c:3549 commands/tablecmds.c:6434 -#: commands/tablecmds.c:9261 commands/tablecmds.c:17305 -#: commands/tablecmds.c:17340 commands/trigger.c:323 commands/trigger.c:1339 +#: commands/tablecmds.c:9294 commands/tablecmds.c:17369 +#: commands/tablecmds.c:17404 commands/trigger.c:323 commands/trigger.c:1339 #: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 #: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format @@ -9335,7 +9342,7 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "kan inte skapa en WITH HOLD-markör i en säkerhetsbegränsad operation" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2917 utils/adt/xml.c:3087 +#: executor/execCurrent.c:70 utils/adt/xml.c:2919 utils/adt/xml.c:3089 #, c-format msgid "cursor \"%s\" does not exist" msgstr "markör \"%s\" existerar inte" @@ -9381,7 +9388,7 @@ msgid "must be superuser to create custom procedural language" msgstr "måste vara en superuser för att skapa ett eget procedurspråk" #: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 -#: postmaster/postmaster.c:1306 storage/file/fd.c:3911 +#: postmaster/postmaster.c:1306 storage/file/fd.c:3908 #: utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" @@ -9733,8 +9740,8 @@ msgstr "tabellen måste vara i samma schema som tabellen den är länkad till" msgid "cannot change ownership of identity sequence" msgstr "kan inte byta ägare på identitetssekvens" -#: commands/sequence.c:1689 commands/tablecmds.c:14121 -#: commands/tablecmds.c:16721 +#: commands/sequence.c:1689 commands/tablecmds.c:14185 +#: commands/tablecmds.c:16785 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sekvens \"%s\" är länkad till tabell \"%s\"" @@ -9804,12 +9811,12 @@ msgstr "duplicerade kolumnnamn i statistikdefinition" msgid "duplicate expression in statistics definition" msgstr "duplicerade uttryck i statistikdefinition" -#: commands/statscmds.c:619 commands/tablecmds.c:8256 +#: commands/statscmds.c:619 commands/tablecmds.c:8289 #, c-format msgid "statistics target %d is too low" msgstr "statistikmålet %d är för lågt" -#: commands/statscmds.c:627 commands/tablecmds.c:8264 +#: commands/statscmds.c:627 commands/tablecmds.c:8297 #, c-format msgid "lowering statistics target to %d" msgstr "minskar statistikmålet till %d" @@ -9871,7 +9878,7 @@ msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Bara roller med rättigheter från rollen \"%s\" får skapa prenumerationer" #: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 -#: replication/logical/tablesync.c:1334 replication/logical/worker.c:4640 +#: replication/logical/tablesync.c:1360 replication/logical/worker.c:4650 #, c-format msgid "could not connect to the publisher: %s" msgstr "kunde inte ansluta till publicerare: %s" @@ -9973,66 +9980,66 @@ msgstr "kunde inte slänga replikeringsslotten \"%s\" på publicerare: %s" msgid "subscription with OID %u does not exist" msgstr "prenumeration med OID %u existerar inte" -#: commands/subscriptioncmds.c:1995 commands/subscriptioncmds.c:2120 +#: commands/subscriptioncmds.c:1998 commands/subscriptioncmds.c:2123 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "kunde inte ta emot lista med replikerade tabeller från publiceraren: %s" -#: commands/subscriptioncmds.c:2031 +#: commands/subscriptioncmds.c:2034 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" msgstr "prenumeration \"%s\" begärde copy_data med origin = NONE men kan kopiera data från en annan källa" -#: commands/subscriptioncmds.c:2033 +#: commands/subscriptioncmds.c:2036 #, c-format msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." msgstr[0] "Prenumerationen som skapas läser från publlicering (%s) som innehåller tabell som skrivs till från andra prenumerationer." msgstr[1] "Prenumerationen som skapas läser från publliceringar (%s) som innehåller tabell som skrivs till från andra prenumerationer." -#: commands/subscriptioncmds.c:2036 +#: commands/subscriptioncmds.c:2039 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "Kontrollera att den initiala datan som kopieras från publicerade tabeller inte kom från andra källor." -#: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:893 +#: commands/subscriptioncmds.c:2145 replication/logical/tablesync.c:919 #: replication/pgoutput/pgoutput.c:1138 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "kunde inte ha olika kolumnlistor för tabellen \"%s.%s\" i olika publiceringar" -#: commands/subscriptioncmds.c:2192 +#: commands/subscriptioncmds.c:2195 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "kunde inte ansluta till publicerare vid försök att slänga replikeringsslot \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2195 +#: commands/subscriptioncmds.c:2198 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Använd %s för att stänga av prenumerationen och sedan %s för att dissociera den från slotten." -#: commands/subscriptioncmds.c:2226 +#: commands/subscriptioncmds.c:2229 #, c-format msgid "publication name \"%s\" used more than once" msgstr "publiceringsnamn \"%s\" använt mer än en gång" -#: commands/subscriptioncmds.c:2270 +#: commands/subscriptioncmds.c:2273 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "publicering \"%s\" finns redan i prenumerationen \"%s\"" -#: commands/subscriptioncmds.c:2284 +#: commands/subscriptioncmds.c:2287 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "publicering \"%s\" finns inte i prenumerationen \"%s\"" -#: commands/subscriptioncmds.c:2295 +#: commands/subscriptioncmds.c:2298 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "kan inte slänga alla publiceringar från en prenumeration" -#: commands/subscriptioncmds.c:2352 +#: commands/subscriptioncmds.c:2355 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s kräver ett booleskt värde eller \"parallel\"" @@ -10093,7 +10100,7 @@ msgstr "materialiserad vy \"%s\" finns inte, hoppar över" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Använd DROP MATERIALIZED VIEW för att ta bort en materialiserad vy." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19318 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19390 #: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" @@ -10117,8 +10124,8 @@ msgstr "\"%s\" är inte en typ" msgid "Use DROP TYPE to remove a type." msgstr "Använd DROP TYPE för att ta bort en typ." -#: commands/tablecmds.c:282 commands/tablecmds.c:13960 -#: commands/tablecmds.c:16426 +#: commands/tablecmds.c:282 commands/tablecmds.c:14024 +#: commands/tablecmds.c:16490 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "främmande tabell \"%s\" finns inte" @@ -10142,7 +10149,7 @@ msgstr "ON COMMIT kan bara användas på temporära tabeller" msgid "cannot create temporary table within security-restricted operation" msgstr "kan inte skapa temporär tabell i en säkerhetsbegränsad operation" -#: commands/tablecmds.c:785 commands/tablecmds.c:15271 +#: commands/tablecmds.c:785 commands/tablecmds.c:15335 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "relationen \"%s\" skulle ärvas mer än en gång" @@ -10212,7 +10219,7 @@ msgstr "kan inte trunkera främmande tabell \"%s\"" msgid "cannot truncate temporary tables of other sessions" msgstr "kan inte trunkera temporära tabeller tillhörande andra sessioner" -#: commands/tablecmds.c:2502 commands/tablecmds.c:15168 +#: commands/tablecmds.c:2502 commands/tablecmds.c:15232 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "kan inte ärva från partitionerad tabell \"%s\"" @@ -10233,12 +10240,12 @@ msgstr "ärvd relation \"%s\" är inte en tabell eller främmande tabell" msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "kan inte skapa en temporär relation som partition till en permanent relation \"%s\"" -#: commands/tablecmds.c:2536 commands/tablecmds.c:15147 +#: commands/tablecmds.c:2536 commands/tablecmds.c:15211 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "kan inte ärva från en temporär relation \"%s\"" -#: commands/tablecmds.c:2546 commands/tablecmds.c:15155 +#: commands/tablecmds.c:2546 commands/tablecmds.c:15219 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "kan inte ärva från en temporär relation i en annan session" @@ -10293,7 +10300,7 @@ msgid "inherited column \"%s\" has a generation conflict" msgstr "ärvd kolumn \"%s\" har en genereringskonflikt" #: commands/tablecmds.c:2781 commands/tablecmds.c:2836 -#: commands/tablecmds.c:12653 parser/parse_utilcmd.c:1293 +#: commands/tablecmds.c:12694 parser/parse_utilcmd.c:1293 #: parser/parse_utilcmd.c:1336 parser/parse_utilcmd.c:1773 #: parser/parse_utilcmd.c:1881 #, c-format @@ -10543,12 +10550,12 @@ msgstr "kan inte lägga till kolumn till typad tabell" msgid "cannot add column to a partition" msgstr "kan inte lägga till kolumn till partition" -#: commands/tablecmds.c:6909 commands/tablecmds.c:15398 +#: commands/tablecmds.c:6909 commands/tablecmds.c:15462 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "barntabell \"%s\" har annan typ på kolumn \"%s\"" -#: commands/tablecmds.c:6915 commands/tablecmds.c:15405 +#: commands/tablecmds.c:6915 commands/tablecmds.c:15469 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "barntabell \"%s\" har annan jämförelse (collation) på kolumn \"%s\"" @@ -10563,933 +10570,933 @@ msgstr "slår samman definitionen av kolumn \"%s\" för barn \"%s\"" msgid "cannot recursively add identity column to table that has child tables" msgstr "kan inte rekursivt lägga till identitetskolumn till tabell som har barntabeller" -#: commands/tablecmds.c:7231 +#: commands/tablecmds.c:7264 #, c-format msgid "column must be added to child tables too" msgstr "kolumnen måste läggas till i barntabellerna också" -#: commands/tablecmds.c:7309 +#: commands/tablecmds.c:7342 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "kolumn \"%s\" i relation \"%s\" finns redan, hoppar över" -#: commands/tablecmds.c:7316 +#: commands/tablecmds.c:7349 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "kolumn \"%s\" i relation \"%s\" finns redan" -#: commands/tablecmds.c:7382 commands/tablecmds.c:12280 +#: commands/tablecmds.c:7415 commands/tablecmds.c:12321 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "kan inte ta bort villkor från bara den partitionerade tabellen när partitioner finns" -#: commands/tablecmds.c:7383 commands/tablecmds.c:7700 -#: commands/tablecmds.c:8673 commands/tablecmds.c:12281 +#: commands/tablecmds.c:7416 commands/tablecmds.c:7733 +#: commands/tablecmds.c:8706 commands/tablecmds.c:12322 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ange inte nyckelordet ONLY." -#: commands/tablecmds.c:7420 commands/tablecmds.c:7626 -#: commands/tablecmds.c:7768 commands/tablecmds.c:7886 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8039 -#: commands/tablecmds.c:8158 commands/tablecmds.c:8297 -#: commands/tablecmds.c:8367 commands/tablecmds.c:8501 -#: commands/tablecmds.c:12435 commands/tablecmds.c:13983 -#: commands/tablecmds.c:16515 +#: commands/tablecmds.c:7453 commands/tablecmds.c:7659 +#: commands/tablecmds.c:7801 commands/tablecmds.c:7919 +#: commands/tablecmds.c:8013 commands/tablecmds.c:8072 +#: commands/tablecmds.c:8191 commands/tablecmds.c:8330 +#: commands/tablecmds.c:8400 commands/tablecmds.c:8534 +#: commands/tablecmds.c:12476 commands/tablecmds.c:14047 +#: commands/tablecmds.c:16579 #, c-format msgid "cannot alter system column \"%s\"" msgstr "kan inte ändra systemkolumn \"%s\"" -#: commands/tablecmds.c:7426 commands/tablecmds.c:7774 +#: commands/tablecmds.c:7459 commands/tablecmds.c:7807 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är en identitetskolumn" -#: commands/tablecmds.c:7469 +#: commands/tablecmds.c:7502 #, c-format msgid "column \"%s\" is in a primary key" msgstr "kolumn \"%s\" är del av en primärnyckel" -#: commands/tablecmds.c:7474 +#: commands/tablecmds.c:7507 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "kolumnen \"%s\" finns i ett index som används som replikaidentitet" -#: commands/tablecmds.c:7497 +#: commands/tablecmds.c:7530 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "kolumn \"%s\" är markerad NOT NULL i föräldratabellen" -#: commands/tablecmds.c:7697 commands/tablecmds.c:9157 +#: commands/tablecmds.c:7730 commands/tablecmds.c:9190 #, c-format msgid "constraint must be added to child tables too" msgstr "villkoret måste läggas till i barntabellerna också" -#: commands/tablecmds.c:7698 +#: commands/tablecmds.c:7731 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Kolumn \"%s\" i relation \"%s\" är inte redan NOT NULL." -#: commands/tablecmds.c:7783 +#: commands/tablecmds.c:7816 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "kolumn \"%s\" i relation \"%s\" är en genererad kolumn" -#: commands/tablecmds.c:7897 +#: commands/tablecmds.c:7930 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "kolumn \"%s\" i relation \"%s\" måste deklareras NOT NULL innan identitet kan läggas till" -#: commands/tablecmds.c:7903 +#: commands/tablecmds.c:7936 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är redan en identitetskolumn" -#: commands/tablecmds.c:7909 +#: commands/tablecmds.c:7942 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "kolumn \"%s\" i relation \"%s\" har redan ett standardvärde" -#: commands/tablecmds.c:7986 commands/tablecmds.c:8047 +#: commands/tablecmds.c:8019 commands/tablecmds.c:8080 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är inte en identitetkolumn" -#: commands/tablecmds.c:8052 +#: commands/tablecmds.c:8085 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "kolumn \"%s\" i relation \"%s\" är inte en identitetkolumn, hoppar över" -#: commands/tablecmds.c:8105 +#: commands/tablecmds.c:8138 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION måste appliceras på barntabellerna också" -#: commands/tablecmds.c:8127 +#: commands/tablecmds.c:8160 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "kan inte slänga genererat uttryck på ärvd kolumn" -#: commands/tablecmds.c:8166 +#: commands/tablecmds.c:8199 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "kolumn \"%s\" i relation \"%s\" är inte en lagrad genererad kolumn" -#: commands/tablecmds.c:8171 +#: commands/tablecmds.c:8204 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "kolumn \"%s\" i relation \"%s\" är inte en lagrad genererad kolumn, hoppar över" -#: commands/tablecmds.c:8244 +#: commands/tablecmds.c:8277 #, c-format msgid "cannot refer to non-index column by number" msgstr "kan inte referera per nummer till en icke-index-kolumn " -#: commands/tablecmds.c:8287 +#: commands/tablecmds.c:8320 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "kolumnnummer %d i relation \"%s\" finns inte" -#: commands/tablecmds.c:8306 +#: commands/tablecmds.c:8339 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "kan inte ändra statistik på inkluderad kolumn \"%s\" i index \"%s\"" -#: commands/tablecmds.c:8311 +#: commands/tablecmds.c:8344 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "kan inte ändra statistik på icke-villkorskolumn \"%s\" i index \"%s\"" -#: commands/tablecmds.c:8313 +#: commands/tablecmds.c:8346 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändra statistik på tabellkolumn istället." -#: commands/tablecmds.c:8548 +#: commands/tablecmds.c:8581 #, c-format msgid "cannot drop column from typed table" msgstr "kan inte ta bort kolumn från typad tabell" -#: commands/tablecmds.c:8611 +#: commands/tablecmds.c:8644 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "kolumn \"%s\" i relation \"%s\" finns inte, hoppar över" -#: commands/tablecmds.c:8624 +#: commands/tablecmds.c:8657 #, c-format msgid "cannot drop system column \"%s\"" msgstr "kan inte ta bort systemkolumn \"%s\"" -#: commands/tablecmds.c:8634 +#: commands/tablecmds.c:8667 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "kan inte ta bort ärvd kolumn \"%s\"" -#: commands/tablecmds.c:8647 +#: commands/tablecmds.c:8680 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "kan inte slänga kolumnen \"%s\" då den är del av partitionsnyckeln för relationen \"%s\"" -#: commands/tablecmds.c:8672 +#: commands/tablecmds.c:8705 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "kan inte slänga kolumn från bara den partitionerade tabellen när partitioner finns" -#: commands/tablecmds.c:8877 +#: commands/tablecmds.c:8910 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX stöds inte på partionerade tabeller" -#: commands/tablecmds.c:8902 +#: commands/tablecmds.c:8935 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX kommer byta namn på index \"%s\" till \"%s\"" -#: commands/tablecmds.c:9239 +#: commands/tablecmds.c:9272 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "kan inte använda ONLY på främmande nyckel för partitionerad tabell \"%s\" som refererar till relationen \"%s\"" -#: commands/tablecmds.c:9245 +#: commands/tablecmds.c:9278 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "kan inte lägga till NOT VALID främmande nyckel till partitionerad tabell \"%s\" som refererar till relationen \"%s\"" -#: commands/tablecmds.c:9248 +#: commands/tablecmds.c:9281 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Denna finess stöds inte än på partitionerade tabeller." -#: commands/tablecmds.c:9255 commands/tablecmds.c:9716 +#: commands/tablecmds.c:9288 commands/tablecmds.c:9770 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "refererad relation \"%s\" är inte en tabell" -#: commands/tablecmds.c:9278 +#: commands/tablecmds.c:9311 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "villkor på permanenta tabeller får bara referera till permanenta tabeller" -#: commands/tablecmds.c:9285 +#: commands/tablecmds.c:9318 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "villkor på ologgade tabeller får bara referera till permanenta eller ologgade tabeller" -#: commands/tablecmds.c:9291 +#: commands/tablecmds.c:9324 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "villkor på temporära tabeller får bara referera till temporära tabeller" -#: commands/tablecmds.c:9295 +#: commands/tablecmds.c:9328 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "villkor på temporära tabeller får bara ta med temporära tabeller från denna session" -#: commands/tablecmds.c:9359 commands/tablecmds.c:9365 +#: commands/tablecmds.c:9393 commands/tablecmds.c:9399 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "ogiltig %s-aktion för främmande nyckelvillkor som innehåller genererad kolumn" -#: commands/tablecmds.c:9381 +#: commands/tablecmds.c:9415 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "antalet refererande och refererade kolumner för främmande nyckel stämmer ej överens" -#: commands/tablecmds.c:9488 +#: commands/tablecmds.c:9522 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "främmande nyckelvillkor \"%s\" kan inte implementeras" -#: commands/tablecmds.c:9490 +#: commands/tablecmds.c:9524 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Nyckelkolumner \"%s\" och \"%s\" har inkompatibla typer %s och %s." -#: commands/tablecmds.c:9659 +#: commands/tablecmds.c:9699 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "kolumn \"%s\" refererad i ON DELETE SET-aktion måste vara en del av en främmande nyckel" -#: commands/tablecmds.c:10016 commands/tablecmds.c:10456 +#: commands/tablecmds.c:10070 commands/tablecmds.c:10497 #: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:951 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "främmande nyckel-villkor stöds inte för främmande tabeller" -#: commands/tablecmds.c:10439 +#: commands/tablecmds.c:10480 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "kan inte ansluta tabell \"%s\" som en partition då den refereras av främmande nyckel \"%s\"" -#: commands/tablecmds.c:11040 commands/tablecmds.c:11321 -#: commands/tablecmds.c:12237 commands/tablecmds.c:12312 +#: commands/tablecmds.c:11081 commands/tablecmds.c:11362 +#: commands/tablecmds.c:12278 commands/tablecmds.c:12353 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "villkor \"%s\" i relation \"%s\" finns inte" -#: commands/tablecmds.c:11047 +#: commands/tablecmds.c:11088 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "villkor \"%s\" i relation \"%s\" är inte ett främmande nyckelvillkor" -#: commands/tablecmds.c:11085 +#: commands/tablecmds.c:11126 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "kan inte ändra villkoret \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:11088 +#: commands/tablecmds.c:11129 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Villkoret \"%s\" är härlett från villkoret \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:11090 +#: commands/tablecmds.c:11131 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Du kan istället ändra på villkoret det är härlett från." -#: commands/tablecmds.c:11329 +#: commands/tablecmds.c:11370 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "villkor \"%s\" i relation \"%s\" är inte en främmande nyckel eller ett check-villkor" -#: commands/tablecmds.c:11406 +#: commands/tablecmds.c:11447 #, c-format msgid "constraint must be validated on child tables too" msgstr "villkoret måste valideras för barntabellerna också" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:11534 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "kolumn \"%s\" som refereras till i främmande nyckelvillkor finns inte" -#: commands/tablecmds.c:11499 +#: commands/tablecmds.c:11540 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "systemkolumner kan inte användas i främmande nycklar" -#: commands/tablecmds.c:11503 +#: commands/tablecmds.c:11544 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "kan inte ha mer än %d nycklar i en främmande nyckel" -#: commands/tablecmds.c:11568 +#: commands/tablecmds.c:11609 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "kan inte använda en \"deferrable\" primärnyckel för refererad tabell \"%s\"" -#: commands/tablecmds.c:11585 +#: commands/tablecmds.c:11626 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "det finns ingen primärnyckel för refererad tabell \"%s\"" -#: commands/tablecmds.c:11653 +#: commands/tablecmds.c:11694 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "främmande nyckel-refererade kolumnlistor får inte innehålla duplikat" -#: commands/tablecmds.c:11745 +#: commands/tablecmds.c:11786 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "kan inte använda ett \"deferrable\" unikt integritetsvillkor för refererad tabell \"%s\"" -#: commands/tablecmds.c:11750 +#: commands/tablecmds.c:11791 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "finns inget unique-villkor som matchar de givna nycklarna i den refererade tabellen \"%s\"" -#: commands/tablecmds.c:12193 +#: commands/tablecmds.c:12234 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "kan inte ta bort ärvt villkor \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:12243 +#: commands/tablecmds.c:12284 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "villkor \"%s\" i relation \"%s\" finns inte, hoppar över" -#: commands/tablecmds.c:12419 +#: commands/tablecmds.c:12460 #, c-format msgid "cannot alter column type of typed table" msgstr "kan inte ändra kolumntyp på typad tabell" -#: commands/tablecmds.c:12445 +#: commands/tablecmds.c:12486 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "kan inte ange USING när man ändrar typ på en genererad kolumn" -#: commands/tablecmds.c:12446 commands/tablecmds.c:17561 -#: commands/tablecmds.c:17651 commands/trigger.c:663 +#: commands/tablecmds.c:12487 commands/tablecmds.c:17625 +#: commands/tablecmds.c:17715 commands/trigger.c:663 #: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Kolumnen \"%s\" är en genererad kolumn." -#: commands/tablecmds.c:12456 +#: commands/tablecmds.c:12497 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kan inte ändra ärvd kolumn \"%s\"" -#: commands/tablecmds.c:12465 +#: commands/tablecmds.c:12506 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "kan inte ändra kolumnen \"%s\" då den är del av partitionsnyckeln för relationen \"%s\"" -#: commands/tablecmds.c:12515 +#: commands/tablecmds.c:12556 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "resultatet av USING-klausul för kolumn \"%s\" kan inte automatiskt typomvandlas till typen %s" -#: commands/tablecmds.c:12518 +#: commands/tablecmds.c:12559 #, c-format msgid "You might need to add an explicit cast." msgstr "Du kan behöva lägga till en explicit typomvandling." -#: commands/tablecmds.c:12522 +#: commands/tablecmds.c:12563 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "kolumn \"%s\" kan inte automatiskt typomvandlas till typ %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12526 +#: commands/tablecmds.c:12567 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Du kan behöva ange \"USING %s::%s\"." -#: commands/tablecmds.c:12625 +#: commands/tablecmds.c:12666 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "kan inte ändra ärvd kolumn \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:12654 +#: commands/tablecmds.c:12695 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-uttryck innehåller en hela-raden-tabellreferens." -#: commands/tablecmds.c:12665 +#: commands/tablecmds.c:12706 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "typen av den ärvda kolumnen \"%s\" måste ändras i barntabellerna också" -#: commands/tablecmds.c:12790 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "kan inte ändra typen på kolumn \"%s\" två gånger" -#: commands/tablecmds.c:12828 +#: commands/tablecmds.c:12869 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "genereringsuttryck för kolumn \"%s\" kan inte automatiskt typomvandlas till typ %s" -#: commands/tablecmds.c:12833 +#: commands/tablecmds.c:12874 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "\"default\" för kolumn \"%s\" kan inte automatiskt typomvandlas till typ \"%s\"" -#: commands/tablecmds.c:12921 +#: commands/tablecmds.c:12962 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "kan inte ändra typ på en kolumn som används av en funktion eller procedur" -#: commands/tablecmds.c:12922 commands/tablecmds.c:12936 -#: commands/tablecmds.c:12955 commands/tablecmds.c:12973 -#: commands/tablecmds.c:13031 +#: commands/tablecmds.c:12963 commands/tablecmds.c:12977 +#: commands/tablecmds.c:12996 commands/tablecmds.c:13014 +#: commands/tablecmds.c:13072 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s beror på kolumn \"%s\"" -#: commands/tablecmds.c:12935 +#: commands/tablecmds.c:12976 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "kan inte ändra typ på en kolumn som används av en vy eller en regel" -#: commands/tablecmds.c:12954 +#: commands/tablecmds.c:12995 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "kan inte ändra typ på en kolumn som används i en triggerdefinition" -#: commands/tablecmds.c:12972 +#: commands/tablecmds.c:13013 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "kan inte ändra typ på en kolumn som används av i en policydefinition" -#: commands/tablecmds.c:13003 +#: commands/tablecmds.c:13044 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "kan inte ändra typ på en kolumn som används av en genererad kolumn" -#: commands/tablecmds.c:13004 +#: commands/tablecmds.c:13045 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Kolumn \"%s\" används av genererad kolumn \"%s\"." -#: commands/tablecmds.c:13030 +#: commands/tablecmds.c:13071 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "kan inte ändra typ på en kolumn som används av en publicerings WHERE-klausul" -#: commands/tablecmds.c:14091 commands/tablecmds.c:14103 +#: commands/tablecmds.c:14155 commands/tablecmds.c:14167 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kan inte byta ägare på index \"%s\"" -#: commands/tablecmds.c:14093 commands/tablecmds.c:14105 +#: commands/tablecmds.c:14157 commands/tablecmds.c:14169 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Byt ägare på indexets tabell istället." -#: commands/tablecmds.c:14119 +#: commands/tablecmds.c:14183 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kan inte byta ägare på sekvens \"%s\"" -#: commands/tablecmds.c:14144 +#: commands/tablecmds.c:14208 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kan inte byta ägare på relationen \"%s\"" -#: commands/tablecmds.c:14506 +#: commands/tablecmds.c:14570 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "kan inte ha flera underkommandon SET TABLESPACE" -#: commands/tablecmds.c:14583 +#: commands/tablecmds.c:14647 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "kan inte sätta inställningar på relationen \"%s\"" -#: commands/tablecmds.c:14617 commands/view.c:445 +#: commands/tablecmds.c:14681 commands/view.c:445 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION stöds bara på automatiskt uppdateringsbara vyer" -#: commands/tablecmds.c:14868 +#: commands/tablecmds.c:14932 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "bara tabeller, index och materialiserade vyer finns i tablespace:er" -#: commands/tablecmds.c:14880 +#: commands/tablecmds.c:14944 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "kan inte flytta relationer in eller ut från tablespace pg_global" -#: commands/tablecmds.c:14972 +#: commands/tablecmds.c:15036 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "avbryter då lås på relation \"%s.%s\" inte är tillgängligt" -#: commands/tablecmds.c:14988 +#: commands/tablecmds.c:15052 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "inga matchande relationer i tablespace \"%s\" hittades" -#: commands/tablecmds.c:15106 +#: commands/tablecmds.c:15170 #, c-format msgid "cannot change inheritance of typed table" msgstr "kan inte ändra arv på en typad tabell" -#: commands/tablecmds.c:15111 commands/tablecmds.c:15629 +#: commands/tablecmds.c:15175 commands/tablecmds.c:15693 #, c-format msgid "cannot change inheritance of a partition" msgstr "kan inte ändra arv på en partition" -#: commands/tablecmds.c:15116 +#: commands/tablecmds.c:15180 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "kan inte ändra arv på en partitionerad tabell" -#: commands/tablecmds.c:15162 +#: commands/tablecmds.c:15226 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "kan inte ärva av en temporär tabell för en annan session" -#: commands/tablecmds.c:15175 +#: commands/tablecmds.c:15239 #, c-format msgid "cannot inherit from a partition" msgstr "kan inte ärva från en partition" -#: commands/tablecmds.c:15197 commands/tablecmds.c:18062 +#: commands/tablecmds.c:15261 commands/tablecmds.c:18126 #, c-format msgid "circular inheritance not allowed" msgstr "cirkulärt arv är inte tillåtet" -#: commands/tablecmds.c:15198 commands/tablecmds.c:18063 +#: commands/tablecmds.c:15262 commands/tablecmds.c:18127 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" är redan ett barn till \"%s\"" -#: commands/tablecmds.c:15211 +#: commands/tablecmds.c:15275 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "trigger \"%s\" förhindrar tabell \"%s\" från att bli ett arvsbarn" -#: commands/tablecmds.c:15213 +#: commands/tablecmds.c:15277 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-triggrar med övergångstabeller stöds inte i arvshierarkier." -#: commands/tablecmds.c:15416 +#: commands/tablecmds.c:15480 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "kolumn \"%s\" i barntabell måste vara markerad NOT NULL" -#: commands/tablecmds.c:15425 +#: commands/tablecmds.c:15489 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "kolumn \"%s\" i barntabell måste vara en genererad kolumn" -#: commands/tablecmds.c:15430 +#: commands/tablecmds.c:15494 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "kolumn \"%s\" i barntabell kan inte vara en genererad kolumn" -#: commands/tablecmds.c:15461 +#: commands/tablecmds.c:15525 #, c-format msgid "child table is missing column \"%s\"" msgstr "barntabell saknar kolumn \"%s\"" -#: commands/tablecmds.c:15549 +#: commands/tablecmds.c:15613 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "barntabell \"%s\" har annan definition av check-villkor \"%s\"" -#: commands/tablecmds.c:15557 +#: commands/tablecmds.c:15621 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "villkor \"%s\" står i konflikt med icke-ärvt villkor på barntabell \"%s\"" -#: commands/tablecmds.c:15568 +#: commands/tablecmds.c:15632 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "villkor \"%s\" står i konflikt med NOT VALID-villkor på barntabell \"%s\"" -#: commands/tablecmds.c:15607 +#: commands/tablecmds.c:15671 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "barntabell saknar riktighetsvillkor \"%s\"" -#: commands/tablecmds.c:15693 +#: commands/tablecmds.c:15757 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "partition \"%s\" har redan en pågående bortkoppling i partitionerad tabell \"%s.%s\"" -#: commands/tablecmds.c:15722 commands/tablecmds.c:15770 +#: commands/tablecmds.c:15786 commands/tablecmds.c:15834 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "relationen \"%s\" är inte partition av relationen \"%s\"" -#: commands/tablecmds.c:15776 +#: commands/tablecmds.c:15840 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "relationen \"%s\" är inte en förälder till relationen \"%s\"" -#: commands/tablecmds.c:16004 +#: commands/tablecmds.c:16068 #, c-format msgid "typed tables cannot inherit" msgstr "typade tabeller kan inte ärva" -#: commands/tablecmds.c:16034 +#: commands/tablecmds.c:16098 #, c-format msgid "table is missing column \"%s\"" msgstr "tabell saknar kolumn \"%s\"" -#: commands/tablecmds.c:16045 +#: commands/tablecmds.c:16109 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "tabell har kolumn \"%s\" där typen kräver \"%s\"" -#: commands/tablecmds.c:16054 +#: commands/tablecmds.c:16118 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "tabell \"%s\" har annan typ på kolumn \"%s\"" -#: commands/tablecmds.c:16068 +#: commands/tablecmds.c:16132 #, c-format msgid "table has extra column \"%s\"" msgstr "tabell har extra kolumn \"%s\"" -#: commands/tablecmds.c:16120 +#: commands/tablecmds.c:16184 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" är inte en typad tabell" -#: commands/tablecmds.c:16294 +#: commands/tablecmds.c:16358 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "kan inte använda icke-unikt index \"%s\" som replikaidentitet" -#: commands/tablecmds.c:16300 +#: commands/tablecmds.c:16364 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "kan inte använda icke-immediate-index \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16306 +#: commands/tablecmds.c:16370 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "kan inte använda uttrycksindex \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16312 +#: commands/tablecmds.c:16376 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "kan inte använda partiellt index \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16329 +#: commands/tablecmds.c:16393 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "index \"%s\" kan inte användas som replikaidentitet då kolumn %d är en systemkolumn" -#: commands/tablecmds.c:16336 +#: commands/tablecmds.c:16400 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "index \"%s\" kan inte användas som replikaidentitet då kolumn \"%s\" kan vare null" -#: commands/tablecmds.c:16581 +#: commands/tablecmds.c:16645 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kan inte ändra loggningsstatus för tabell \"%s\" då den är temporär" -#: commands/tablecmds.c:16605 +#: commands/tablecmds.c:16669 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kan inte ändra tabell \"%s\" till ologgad då den är del av en publicering" -#: commands/tablecmds.c:16607 +#: commands/tablecmds.c:16671 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ologgade relatrioner kan inte replikeras." -#: commands/tablecmds.c:16652 +#: commands/tablecmds.c:16716 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "kunde inte ändra tabell \"%s\" till loggad då den refererar till ologgad tabell \"%s\"" -#: commands/tablecmds.c:16662 +#: commands/tablecmds.c:16726 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "kunde inte ändra tabell \"%s\" till ologgad då den refererar till loggad tabell \"%s\"" -#: commands/tablecmds.c:16720 +#: commands/tablecmds.c:16784 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "kan inte flytta en ägd sekvens till ett annan schema." -#: commands/tablecmds.c:16825 +#: commands/tablecmds.c:16889 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "relationen \"%s\" finns redan i schema \"%s\"" -#: commands/tablecmds.c:17249 +#: commands/tablecmds.c:17313 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" är inte en tabell eller materialiserad vy" -#: commands/tablecmds.c:17399 +#: commands/tablecmds.c:17463 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" är inte en composite-typ" -#: commands/tablecmds.c:17429 +#: commands/tablecmds.c:17493 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kan inte byta schema på indexet \"%s\"" -#: commands/tablecmds.c:17431 commands/tablecmds.c:17445 +#: commands/tablecmds.c:17495 commands/tablecmds.c:17509 #, c-format msgid "Change the schema of the table instead." msgstr "Byt ägare på tabellen istället." -#: commands/tablecmds.c:17435 +#: commands/tablecmds.c:17499 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kan inte byta schema på composite-typen \"%s\"." -#: commands/tablecmds.c:17443 +#: commands/tablecmds.c:17507 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kan inte byta schema på TOAST-tabellen \"%s\"" -#: commands/tablecmds.c:17475 +#: commands/tablecmds.c:17539 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "kan inte använda list-partioneringsstrategi med mer än en kolumn" -#: commands/tablecmds.c:17541 +#: commands/tablecmds.c:17605 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "kolumn \"%s\" angiven i partitioneringsnyckel existerar inte" -#: commands/tablecmds.c:17549 +#: commands/tablecmds.c:17613 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "kan inte använda systemkolumn \"%s\" i partitioneringsnyckel" -#: commands/tablecmds.c:17560 commands/tablecmds.c:17650 +#: commands/tablecmds.c:17624 commands/tablecmds.c:17714 #, c-format msgid "cannot use generated column in partition key" msgstr "kan inte använda genererad kolumn i partitioneringsnyckel" -#: commands/tablecmds.c:17633 +#: commands/tablecmds.c:17697 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "partitioneringsnyckeluttryck kan inte innehålla systemkolumnreferenser" -#: commands/tablecmds.c:17680 +#: commands/tablecmds.c:17744 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "funktioner i partitioneringsuttryck måste vara markerade IMMUTABLE" -#: commands/tablecmds.c:17689 +#: commands/tablecmds.c:17753 #, c-format msgid "cannot use constant expression as partition key" msgstr "kan inte använda konstant uttryck som partitioneringsnyckel" -#: commands/tablecmds.c:17710 +#: commands/tablecmds.c:17774 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "kunde inte lista vilken jämförelse (collation) som skulle användas för partitionsuttryck" -#: commands/tablecmds.c:17745 +#: commands/tablecmds.c:17809 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Du måste ange en hash-operatorklass eller definiera en default hash-operatorklass för datatypen." -#: commands/tablecmds.c:17751 +#: commands/tablecmds.c:17815 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Du måste ange en btree-operatorklass eller definiera en default btree-operatorklass för datatypen." -#: commands/tablecmds.c:18002 +#: commands/tablecmds.c:18066 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" är redan en partition" -#: commands/tablecmds.c:18008 +#: commands/tablecmds.c:18072 #, c-format msgid "cannot attach a typed table as partition" msgstr "kan inte ansluta en typad tabell som partition" -#: commands/tablecmds.c:18024 +#: commands/tablecmds.c:18088 #, c-format msgid "cannot attach inheritance child as partition" msgstr "kan inte ansluta ett arvsbarn som partition" -#: commands/tablecmds.c:18038 +#: commands/tablecmds.c:18102 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "kan inte ansluta en arvsförälder som partition" -#: commands/tablecmds.c:18072 +#: commands/tablecmds.c:18136 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "kan inte ansluta en temporär relation som partition till en permanent relation \"%s\"" -#: commands/tablecmds.c:18080 +#: commands/tablecmds.c:18144 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "kan inte ansluta en permanent relation som partition till en temporär relation \"%s\"" -#: commands/tablecmds.c:18088 +#: commands/tablecmds.c:18152 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kan inte ansluta en partition från en temporär relation som tillhör en annan session" -#: commands/tablecmds.c:18095 +#: commands/tablecmds.c:18159 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "kan inte ansluta en temporär relation tillhörande en annan session som partition" -#: commands/tablecmds.c:18115 +#: commands/tablecmds.c:18179 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "tabell \"%s\" innehåller kolumn \"%s\" som inte finns i föräldern \"%s\"" -#: commands/tablecmds.c:18118 +#: commands/tablecmds.c:18182 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Den nya partitionen får bara innehålla kolumner som finns i föräldern." -#: commands/tablecmds.c:18130 +#: commands/tablecmds.c:18194 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "trigger \"%s\" förhindrar att tabell \"%s\" blir en partition" -#: commands/tablecmds.c:18132 +#: commands/tablecmds.c:18196 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "ROW-triggrar med övergångstabeller stöds inte för partitioner." -#: commands/tablecmds.c:18311 +#: commands/tablecmds.c:18375 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kan inte ansluta främmande tabell \"%s\" som en partition till partitionerad tabell \"%s\"" -#: commands/tablecmds.c:18314 +#: commands/tablecmds.c:18378 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionerad tabell \"%s\" innehåller unika index." -#: commands/tablecmds.c:18631 +#: commands/tablecmds.c:18695 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "kan inte parallellt koppla bort en partitionerad tabell när en default-partition finns" -#: commands/tablecmds.c:18740 +#: commands/tablecmds.c:18804 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionerad tabell \"%s\" togs bort parallellt" -#: commands/tablecmds.c:18746 +#: commands/tablecmds.c:18810 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "partition \"%s\" togs bort parallellt" -#: commands/tablecmds.c:19352 commands/tablecmds.c:19372 -#: commands/tablecmds.c:19393 commands/tablecmds.c:19412 -#: commands/tablecmds.c:19454 +#: commands/tablecmds.c:19424 commands/tablecmds.c:19444 +#: commands/tablecmds.c:19465 commands/tablecmds.c:19484 +#: commands/tablecmds.c:19526 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "kan inte ansluta index \"%s\" som en partition till index \"%s\"" -#: commands/tablecmds.c:19355 +#: commands/tablecmds.c:19427 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Index \"%s\" är redan ansluten till ett annat index." -#: commands/tablecmds.c:19375 +#: commands/tablecmds.c:19447 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Index \"%s\" är inte ett index för någon partition av tabell \"%s\"." -#: commands/tablecmds.c:19396 +#: commands/tablecmds.c:19468 #, c-format msgid "The index definitions do not match." msgstr "Indexdefinitionerna matchar inte." -#: commands/tablecmds.c:19415 +#: commands/tablecmds.c:19487 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Indexet \"%s\" tillhör ett villkor på tabell \"%s\" men det finns inga villkor för indexet \"%s\"." -#: commands/tablecmds.c:19457 +#: commands/tablecmds.c:19529 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Ett annat index är redan anslutet för partition \"%s\"." -#: commands/tablecmds.c:19693 +#: commands/tablecmds.c:19765 #, c-format msgid "column data type %s does not support compression" msgstr "kolumndatatypen %s stöder inte komprimering" -#: commands/tablecmds.c:19700 +#: commands/tablecmds.c:19772 #, c-format msgid "invalid compression method \"%s\"" msgstr "ogiltig komprimeringsmetod \"%s\"" -#: commands/tablecmds.c:19726 +#: commands/tablecmds.c:19798 #, c-format msgid "invalid storage type \"%s\"" msgstr "ogiltig lagringstyp \"%s\"" -#: commands/tablecmds.c:19736 +#: commands/tablecmds.c:19808 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "kolumndatatyp %s kan bara ha lagringsmetod PLAIN" @@ -11836,61 +11843,66 @@ msgstr "bytte namn på triggern \"%s\" i relationen \"%s\"" msgid "permission denied: \"%s\" is a system trigger" msgstr "rättighet saknas: \"%s\" är en systemtrigger" -#: commands/trigger.c:2386 +#: commands/trigger.c:2388 #, c-format msgid "trigger function %u returned null value" msgstr "triggerfunktionen %u returnerade null-värde" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 -#: commands/trigger.c:3270 +#: commands/trigger.c:2448 commands/trigger.c:2675 commands/trigger.c:2937 +#: commands/trigger.c:3300 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENT-trigger kan inte returnera ett värde" -#: commands/trigger.c:2522 +#: commands/trigger.c:2524 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "flytta en rad från en annan partition under en BEFORE FOR EACH ROW-trigger stöds inte" -#: commands/trigger.c:2523 +#: commands/trigger.c:2525 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Innan exekvering av triggern \"%s\" så var raden i partition \"%s.%s\"." -#: commands/trigger.c:3348 executor/nodeModifyTable.c:1543 -#: executor/nodeModifyTable.c:1617 executor/nodeModifyTable.c:2382 -#: executor/nodeModifyTable.c:2473 executor/nodeModifyTable.c:3034 -#: executor/nodeModifyTable.c:3173 +#: commands/trigger.c:2554 commands/trigger.c:2806 commands/trigger.c:3142 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "kan inte samla in övergångstupler från främmande barntabeller" + +#: commands/trigger.c:3378 executor/nodeModifyTable.c:1564 +#: executor/nodeModifyTable.c:1638 executor/nodeModifyTable.c:2403 +#: executor/nodeModifyTable.c:2494 executor/nodeModifyTable.c:3055 +#: executor/nodeModifyTable.c:3194 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Överväg att använda en AFTER-trigger istället för en BEFORE-trigger för att propagera ändringar till andra rader." -#: commands/trigger.c:3389 executor/nodeLockRows.c:228 -#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:316 -#: executor/nodeModifyTable.c:1559 executor/nodeModifyTable.c:2399 -#: executor/nodeModifyTable.c:2623 +#: commands/trigger.c:3419 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:337 +#: executor/nodeModifyTable.c:1580 executor/nodeModifyTable.c:2420 +#: executor/nodeModifyTable.c:2644 #, c-format msgid "could not serialize access due to concurrent update" msgstr "kunde inte serialisera åtkomst på grund av samtidig uppdatering" -#: commands/trigger.c:3397 executor/nodeModifyTable.c:1649 -#: executor/nodeModifyTable.c:2490 executor/nodeModifyTable.c:2647 -#: executor/nodeModifyTable.c:3052 +#: commands/trigger.c:3427 executor/nodeModifyTable.c:1670 +#: executor/nodeModifyTable.c:2511 executor/nodeModifyTable.c:2668 +#: executor/nodeModifyTable.c:3073 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "kunde inte serialisera åtkomst på grund av samtidig borttagning" -#: commands/trigger.c:4606 +#: commands/trigger.c:4636 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "kan inte trigga uppskjuten trigger i en säkerhetsbegränsad operation" -#: commands/trigger.c:5787 +#: commands/trigger.c:5817 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "integritetsvillkor \"%s\" är inte \"deferrable\"" -#: commands/trigger.c:5810 +#: commands/trigger.c:5840 #, c-format msgid "constraint \"%s\" does not exist" msgstr "integritetsvillkor \"%s\" existerar inte" @@ -12348,8 +12360,8 @@ msgstr "Bara roller med attributet %s får skapa roller." msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "Bara roller med attributet %s får skapa roller med attributet %s." -#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16733 -#: gram.y:16779 utils/adt/acl.c:5401 utils/adt/acl.c:5407 +#: commands/user.c:355 commands/user.c:1387 commands/user.c:1394 gram.y:16740 +#: gram.y:16786 utils/adt/acl.c:5418 utils/adt/acl.c:5424 #, c-format msgid "role name \"%s\" is reserved" msgstr "rollnamnet \"%s\" är reserverat" @@ -12444,8 +12456,8 @@ msgstr "kan inte används speciell rollangivelse i DROP ROLE" #: commands/user.c:1136 commands/user.c:1358 commands/variable.c:851 #: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 -#: utils/adt/acl.c:356 utils/adt/acl.c:376 utils/adt/acl.c:5256 -#: utils/adt/acl.c:5304 utils/adt/acl.c:5332 utils/adt/acl.c:5351 +#: utils/adt/acl.c:373 utils/adt/acl.c:393 utils/adt/acl.c:5273 +#: utils/adt/acl.c:5321 utils/adt/acl.c:5349 utils/adt/acl.c:5368 #: utils/adt/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" @@ -12636,12 +12648,12 @@ msgstr "rättighet saknas att ta bort rättighet som utfärdats av roll \"%s\"" msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "Bara roller med rättigheter från rollen \"%s\" får ta bort rättigheter som delats ut av den rollen." -#: commands/user.c:2492 utils/adt/acl.c:1309 +#: commands/user.c:2492 utils/adt/acl.c:1326 #, c-format msgid "dependent privileges exist" msgstr "det finns beroende privilegier" -#: commands/user.c:2493 utils/adt/acl.c:1310 +#: commands/user.c:2493 utils/adt/acl.c:1327 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Använd CASCADE för att återkalla dem med." @@ -12716,42 +12728,42 @@ msgstr "ONLY_DATABASE_STATS kan inte anges tillsammans med andra VACUUM-flaggor" msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kan inte köras från VACUUM eller ANALYZE" -#: commands/vacuum.c:733 +#: commands/vacuum.c:743 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "rättighet saknas för att städa \"%s\", hoppar över det" -#: commands/vacuum.c:746 +#: commands/vacuum.c:756 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "rättighet saknas för att analysera \"%s\", hoppar över det" -#: commands/vacuum.c:824 commands/vacuum.c:921 +#: commands/vacuum.c:834 commands/vacuum.c:931 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "hoppar över vacuum av \"%s\" --- lås ej tillgängligt" -#: commands/vacuum.c:829 +#: commands/vacuum.c:839 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "hoppar över vacuum av \"%s\" --- relationen finns inte längre" -#: commands/vacuum.c:845 commands/vacuum.c:926 +#: commands/vacuum.c:855 commands/vacuum.c:936 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "hoppar över analys av \"%s\" --- lås ej tillgängligt" -#: commands/vacuum.c:850 +#: commands/vacuum.c:860 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "hoppar över analys av \"%s\" --- relationen finns inte längre" -#: commands/vacuum.c:1161 +#: commands/vacuum.c:1171 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "gräns för borttagning och frysande av tupler är i dåtid" -#: commands/vacuum.c:1162 commands/vacuum.c:1167 +#: commands/vacuum.c:1172 commands/vacuum.c:1177 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12760,37 +12772,37 @@ msgstr "" "Stäng öppna transaktioner för att undvika problem med wraparound.\n" "Du kan också behöva commit:a eller rulla tillbaka gamla förberedda transaktiooner alternativt slänga stillastående replikeringsslottar." -#: commands/vacuum.c:1166 +#: commands/vacuum.c:1176 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "gräns för frysning av multixact är från dåtid" -#: commands/vacuum.c:1922 +#: commands/vacuum.c:1932 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "några databaser har inte städats (vacuum) på över 2 miljarder transaktioner" -#: commands/vacuum.c:1923 +#: commands/vacuum.c:1933 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Du kan redan ha fått dataförlust på grund av transaktions-wraparound." -#: commands/vacuum.c:2092 +#: commands/vacuum.c:2109 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "hoppar över \"%s\" --- kan inte köra vacuum på icke-tabeller eller speciella systemtabeller" -#: commands/vacuum.c:2517 +#: commands/vacuum.c:2531 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "genomsökte index \"%s\" och tog bort %d radversioner" -#: commands/vacuum.c:2536 +#: commands/vacuum.c:2550 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "index \"%s\" innehåller nu %.0f radversioner i %u sidor" -#: commands/vacuum.c:2540 +#: commands/vacuum.c:2554 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -13043,25 +13055,25 @@ msgstr "hittade inget värde för parameter %d" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 #: executor/execExprInterp.c:4246 executor/execExprInterp.c:4263 -#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:205 -#: executor/nodeModifyTable.c:216 executor/nodeModifyTable.c:233 -#: executor/nodeModifyTable.c:241 +#: executor/execExprInterp.c:4362 executor/nodeModifyTable.c:206 +#: executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:252 executor/nodeModifyTable.c:262 #, c-format msgid "table row type and query-specified row type do not match" msgstr "tabellens radtyp och frågans radtyp matchar inte" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:206 +#: executor/execExpr.c:638 executor/nodeModifyTable.c:207 #, c-format msgid "Query has too many columns." msgstr "Fråga har för många kolumner." -#: executor/execExpr.c:645 executor/nodeModifyTable.c:234 +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Fråga levererar ett värde för en borttagen kolumn vid position %d." #: executor/execExpr.c:651 executor/execExprInterp.c:4264 -#: executor/nodeModifyTable.c:217 +#: executor/nodeModifyTable.c:253 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Tabellen har typ %s vid position %d, men frågan förväntar sig %s." @@ -13147,7 +13159,7 @@ msgstr "Array med elementtyp %s kan inte inkluderas i ARRAY-konstruktion med ele #: executor/execExprInterp.c:2835 utils/adt/arrayfuncs.c:266 #: utils/adt/arrayfuncs.c:576 utils/adt/arrayfuncs.c:1330 #: utils/adt/arrayfuncs.c:3539 utils/adt/arrayfuncs.c:5623 -#: utils/adt/arrayfuncs.c:6140 utils/adt/arraysubs.c:150 +#: utils/adt/arrayfuncs.c:6142 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" @@ -13164,8 +13176,8 @@ msgstr "flerdimensionella vektorer måste ha array-uttryck av passande dimension #: utils/adt/arrayfuncs.c:2654 utils/adt/arrayfuncs.c:2670 #: utils/adt/arrayfuncs.c:2931 utils/adt/arrayfuncs.c:2985 #: utils/adt/arrayfuncs.c:3000 utils/adt/arrayfuncs.c:3341 -#: utils/adt/arrayfuncs.c:3569 utils/adt/arrayfuncs.c:6232 -#: utils/adt/arrayfuncs.c:6573 utils/adt/arrayutils.c:98 +#: utils/adt/arrayfuncs.c:3569 utils/adt/arrayfuncs.c:6234 +#: utils/adt/arrayfuncs.c:6575 utils/adt/arrayutils.c:98 #: utils/adt/arrayutils.c:107 utils/adt/arrayutils.c:114 #, c-format msgid "array size exceeds the maximum allowed (%d)" @@ -13339,7 +13351,7 @@ msgstr "kan inte låsa rader i vy \"%s\"" msgid "cannot lock rows in materialized view \"%s\"" msgstr "kan inte låsa rader i materialiserad vy \"%s\"" -#: executor/execMain.c:1203 executor/execMain.c:2711 +#: executor/execMain.c:1203 executor/execMain.c:2713 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" @@ -13431,10 +13443,10 @@ msgstr "samtidig uppdatering, försöker igen" msgid "concurrent delete, retrying" msgstr "samtidig borttagning, försöker igen" -#: executor/execReplication.c:311 parser/parse_cte.c:308 +#: executor/execReplication.c:311 parser/parse_cte.c:309 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 #: utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3888 -#: utils/adt/arrayfuncs.c:4443 utils/adt/arrayfuncs.c:6453 +#: utils/adt/arrayfuncs.c:4443 utils/adt/arrayfuncs.c:6455 #: utils/adt/rowtypes.c:1230 #, c-format msgid "could not identify an equality operator for type %s" @@ -13667,64 +13679,69 @@ msgstr "RIGHT JOIN stöds bara med merge-joinbara join-villor" msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN stöds bara med merge-joinbara join-villkor" -#: executor/nodeModifyTable.c:242 +#: executor/nodeModifyTable.c:243 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "Fråga levererar ett värde för en genererad kolumn vid position %d." + +#: executor/nodeModifyTable.c:263 #, c-format msgid "Query has too few columns." msgstr "Frågan har för få kolumner" -#: executor/nodeModifyTable.c:1542 executor/nodeModifyTable.c:1616 +#: executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "tupel som skall tas bort hade redan ändrats av en operation som triggats av aktuellt kommando" -#: executor/nodeModifyTable.c:1771 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "invalid ON UPDATE specification" msgstr "ogiltig ON UPDATE-angivelse" -#: executor/nodeModifyTable.c:1772 +#: executor/nodeModifyTable.c:1793 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Resultattupeln kommer dyka upp i en annan partition än originaltupeln." -#: executor/nodeModifyTable.c:2231 +#: executor/nodeModifyTable.c:2252 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "kan inte flytta en tupel mellan partitioner när en icke-root-förälder av källpartitionen direkt refereras av en främmande nyckel" -#: executor/nodeModifyTable.c:2232 +#: executor/nodeModifyTable.c:2253 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "En främmande nyckel pekar på förfadern \"%s\" men inte på root-förfadern \"%s\"." -#: executor/nodeModifyTable.c:2235 +#: executor/nodeModifyTable.c:2256 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Överväg att skapa den främmande nyckeln på tabellen \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2601 executor/nodeModifyTable.c:3040 -#: executor/nodeModifyTable.c:3179 +#: executor/nodeModifyTable.c:2622 executor/nodeModifyTable.c:3061 +#: executor/nodeModifyTable.c:3200 #, c-format msgid "%s command cannot affect row a second time" msgstr "%s-kommandot kan inte påverka raden en andra gång" -#: executor/nodeModifyTable.c:2603 +#: executor/nodeModifyTable.c:2624 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Säkerställ att inga rader föreslagna för \"insert\" inom samma kommando har upprepade villkorsvärden." -#: executor/nodeModifyTable.c:3033 executor/nodeModifyTable.c:3172 +#: executor/nodeModifyTable.c:3054 executor/nodeModifyTable.c:3193 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "tupel som skall uppdateras eller raderas hade redan ändrats av en operation som triggats av aktuellt kommando" -#: executor/nodeModifyTable.c:3042 executor/nodeModifyTable.c:3181 +#: executor/nodeModifyTable.c:3063 executor/nodeModifyTable.c:3202 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "Säkerställ att inte mer än en källrad matchar någon målrad." -#: executor/nodeModifyTable.c:3131 +#: executor/nodeModifyTable.c:3152 #, c-format msgid "tuple to be deleted was already moved to another partition due to concurrent update" msgstr "tupel som skall raderas har redan flyttats till en annan partition på grund av samtidig update" @@ -13887,13 +13904,13 @@ msgstr "kunde inte skicka tupel till kö i delat minne: %m" msgid "user mapping not found for \"%s\"" msgstr "användarmappning hittades inte för \"%s\"" -#: foreign/foreign.c:333 optimizer/plan/createplan.c:7102 +#: foreign/foreign.c:333 optimizer/plan/createplan.c:7104 #: optimizer/util/plancat.c:512 #, c-format msgid "access to non-system foreign table is restricted" msgstr "access till icke-system främmande tabell är begränsad" -#: foreign/foreign.c:657 storage/file/fd.c:3931 +#: foreign/foreign.c:657 storage/file/fd.c:3928 #, c-format msgid "invalid option \"%s\"" msgstr "ogiltig flagga \"%s\"" @@ -14097,190 +14114,195 @@ msgstr "motstridiga eller överflödiga NULL / NOT NULL-deklarationer för kolum msgid "unrecognized column option \"%s\"" msgstr "okänd kolumnflagga \"%s\"" -#: gram.y:14109 +#: gram.y:13888 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "flaggnamn \"%s\" kan inte användas i XMLTABLE" + +#: gram.y:14116 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "precisionen för typen float måste vara minst 1 bit" -#: gram.y:14118 +#: gram.y:14125 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "precisionen för typen float måste vara mindre än 54 bits" -#: gram.y:14621 +#: gram.y:14628 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "fel antal parametrar på vänster sida om OVERLAPS-uttryck" -#: gram.y:14626 +#: gram.y:14633 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "fel antal parametrar på höger sida om OVERLAPS-uttryck" -#: gram.y:14803 +#: gram.y:14810 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-predikat är inte implementerat ännu" -#: gram.y:15219 +#: gram.y:15226 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "kan inte ha multipla ORDER BY-klausuler med WITHIN GROUP" -#: gram.y:15224 +#: gram.y:15231 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "kan inte använda DISTINCT med WITHIN GROUP" -#: gram.y:15229 +#: gram.y:15236 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "kan inte använda VARIADIC med WITHIN GROUP" -#: gram.y:15863 gram.y:15887 +#: gram.y:15870 gram.y:15894 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "fönsterramstart kan inte vara UNBOUNDED FOLLOWING" -#: gram.y:15868 +#: gram.y:15875 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "fönsterram som startar på efterföljande rad kan inte sluta på nuvarande rad" -#: gram.y:15892 +#: gram.y:15899 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "fönsterramslut kan inte vara UNBOUNDED PRECEDING" -#: gram.y:15898 +#: gram.y:15905 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "fönsterram som startar på aktuell rad kan inte ha föregående rader" -#: gram.y:15905 +#: gram.y:15912 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "fönsterram som startar på efterföljande rad kan inte ha föregående rader" -#: gram.y:16666 +#: gram.y:16673 #, c-format msgid "type modifier cannot have parameter name" msgstr "typmodifierare kan inte ha paremeternamn" -#: gram.y:16672 +#: gram.y:16679 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "typmodifierare kan inte ha ORDER BY" -#: gram.y:16740 gram.y:16747 gram.y:16754 +#: gram.y:16747 gram.y:16754 gram.y:16761 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kan inte användas som ett rollnamn här" -#: gram.y:16844 gram.y:18301 +#: gram.y:16851 gram.y:18308 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES kan inte anges utan en ORDER BY-klausul" -#: gram.y:17980 gram.y:18167 +#: gram.y:17987 gram.y:18174 msgid "improper use of \"*\"" msgstr "felaktig användning av \"*\"" -#: gram.y:18130 gram.y:18147 tsearch/spell.c:963 tsearch/spell.c:980 -#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#: gram.y:18137 gram.y:18154 tsearch/spell.c:964 tsearch/spell.c:981 +#: tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 #, c-format msgid "syntax error" msgstr "syntaxfel" -#: gram.y:18231 +#: gram.y:18238 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "ett sorterad-mängd-aggregat med ett direkt VARIADIC-argument måste ha ett aggregerat VARIADIC-argument av samma datatype" -#: gram.y:18268 +#: gram.y:18275 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "multipla ORDER BY-klausuler tillåts inte" -#: gram.y:18279 +#: gram.y:18286 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "multipla OFFSET-klausuler tillåts inte" -#: gram.y:18288 +#: gram.y:18295 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "multipla LIMIT-klausuler tillåts inte" -#: gram.y:18297 +#: gram.y:18304 #, c-format msgid "multiple limit options not allowed" msgstr "multipla limit-alternativ tillåts inte" -#: gram.y:18324 +#: gram.y:18331 #, c-format msgid "multiple WITH clauses not allowed" msgstr "multipla WITH-klausuler tillåts inte" -#: gram.y:18517 +#: gram.y:18524 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT och INOUT-argument tillåts inte i TABLE-funktioner" -#: gram.y:18650 +#: gram.y:18657 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "multipla COLLATE-klausuler tillåts inte" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18688 gram.y:18701 +#: gram.y:18695 gram.y:18708 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s-villkor kan inte markeras DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18714 +#: gram.y:18721 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s-villkor kan inte markeras NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18727 +#: gram.y:18734 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-villkor kan inte markeras NO INHERIT" -#: gram.y:18749 +#: gram.y:18756 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "okänd partitioneringsstrategi \"%s\"" -#: gram.y:18773 +#: gram.y:18780 #, c-format msgid "invalid publication object list" msgstr "ogiltig objektlista för publicering" -#: gram.y:18774 +#: gram.y:18781 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "En av TABLE eller ALL TABLES IN SCHEMA måste anges innan en enskild tabell eller ett schemanamn." -#: gram.y:18790 +#: gram.y:18797 #, c-format msgid "invalid table name" msgstr "ogiltigt tabellnamn" -#: gram.y:18811 +#: gram.y:18818 #, c-format msgid "WHERE clause not allowed for schema" msgstr "WHERE-klausul tillåts inte för schema" -#: gram.y:18818 +#: gram.y:18825 #, c-format msgid "column specification not allowed for schema" msgstr "kolumnspecifikation tillåts inte för schema" -#: gram.y:18832 +#: gram.y:18839 #, c-format msgid "invalid schema name" msgstr "ogiltigt schemanamn" @@ -14338,7 +14360,7 @@ msgstr "ogiltig indatassyntax för typen %s" msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "okänt flaggtecken \"%.*s\" i LIKE_REGEX-predikat." -#: jsonpath_gram.y:559 tsearch/spell.c:749 utils/adt/regexp.c:224 +#: jsonpath_gram.y:559 tsearch/spell.c:750 utils/adt/regexp.c:224 #, c-format msgid "invalid regular expression: %s" msgstr "ogiltigt reguljärt uttryck: %s" @@ -14573,550 +14595,550 @@ msgstr "Trasigt bevis i klient-slut-meddelande." msgid "Garbage found at the end of client-final-message." msgstr "Hittade skräp i slutet av klient-slut-meddelande." -#: libpq/auth.c:271 +#: libpq/auth.c:279 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "autentisering misslyckades för användare \"%s\": host blockerad" -#: libpq/auth.c:274 +#: libpq/auth.c:282 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "\"trust\"-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:277 +#: libpq/auth.c:285 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:280 +#: libpq/auth.c:288 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:285 +#: libpq/auth.c:293 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Lösenordsautentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:290 +#: libpq/auth.c:298 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:293 +#: libpq/auth.c:301 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:296 +#: libpq/auth.c:304 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:299 +#: libpq/auth.c:307 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:302 +#: libpq/auth.c:310 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:305 +#: libpq/auth.c:313 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "certifikat-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:308 +#: libpq/auth.c:316 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADOUS-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:311 +#: libpq/auth.c:319 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "autentisering misslyckades för användare \"%s\": okänd autentiseringsmetod" -#: libpq/auth.c:315 +#: libpq/auth.c:323 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Anslutning matchade filen \"%s\", rad %d: \"%s\"" -#: libpq/auth.c:359 +#: libpq/auth.c:367 #, c-format msgid "authentication identifier set more than once" msgstr "identifierare för autentisering satt mer än en gång" -#: libpq/auth.c:360 +#: libpq/auth.c:368 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "föregående identifierare: \"%s\"; ny identifierare: \"%s\"" -#: libpq/auth.c:370 +#: libpq/auth.c:378 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "anslutning autentiserad: identitet=\"%s\" metod=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:418 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "klientcertifikat kan bara kontrolleras om lagrade root-certifikat finns tillgängligt" -#: libpq/auth.c:421 +#: libpq/auth.c:429 #, c-format msgid "connection requires a valid client certificate" msgstr "Anslutning kräver ett giltigt klientcertifikat" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:460 libpq/auth.c:506 msgid "GSS encryption" msgstr "GSS-kryptering" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "SSL encryption" msgstr "SSL-kryptering" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:465 libpq/auth.c:511 msgid "no encryption" msgstr "ingen kryptering" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:471 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf avvisar replikeringsanslutning för värd \"%s\", användare \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:478 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf avvisar anslutning för värd \"%s\", användare \"%s\", databas \"%s\", %s" -#: libpq/auth.c:508 +#: libpq/auth.c:516 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag matchar." -#: libpq/auth.c:511 +#: libpq/auth.c:519 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag är inte kontrollerat." -#: libpq/auth.c:514 +#: libpq/auth.c:522 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag matchar inte." -#: libpq/auth.c:517 +#: libpq/auth.c:525 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Kunde inte översätta klientvärdnamn \"%s\" till IP-adress: %s" -#: libpq/auth.c:522 +#: libpq/auth.c:530 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Kunde inte slå upp klient-IP-adress och få värdnamn: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:538 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "ingen rad i pg_hba.conf för replikeringsanslutning från värd \"%s\", användare \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:546 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "ingen rad i pg_hba.conf för värd \"%s\", användare \"%s\", databas \"%s\", %s" -#: libpq/auth.c:711 +#: libpq/auth.c:719 #, c-format msgid "expected password response, got message type %d" msgstr "förväntade lösenordssvar, fick meddelandetyp %d" -#: libpq/auth.c:732 +#: libpq/auth.c:740 #, c-format msgid "invalid password packet size" msgstr "felaktig storlek på lösenordspaket" -#: libpq/auth.c:750 +#: libpq/auth.c:758 #, c-format msgid "empty password returned by client" msgstr "tomt lösenord returnerat av klient" -#: libpq/auth.c:877 libpq/hba.c:1727 +#: libpq/auth.c:885 libpq/hba.c:1727 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "MD5-autentisering stöds inte när \"db_user_namespace\" är påslaget" -#: libpq/auth.c:883 +#: libpq/auth.c:891 #, c-format msgid "could not generate random MD5 salt" msgstr "kunde inte generera slumpmässigt MD5-salt" -#: libpq/auth.c:934 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:942 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "kunde inte sätta omgivningsvariabel: %m" -#: libpq/auth.c:973 +#: libpq/auth.c:981 #, c-format msgid "expected GSS response, got message type %d" msgstr "förväntade GSS-svar, fick meddelandetyp %d" -#: libpq/auth.c:1039 +#: libpq/auth.c:1047 msgid "accepting GSS security context failed" msgstr "accepterande av GSS-säkerhetskontext misslyckades" -#: libpq/auth.c:1080 +#: libpq/auth.c:1088 msgid "retrieving GSS user name failed" msgstr "mottagande av GSS-användarnamn misslyckades" -#: libpq/auth.c:1226 +#: libpq/auth.c:1234 msgid "could not acquire SSPI credentials" msgstr "kunde inte hämta SSPI-referenser" -#: libpq/auth.c:1251 +#: libpq/auth.c:1259 #, c-format msgid "expected SSPI response, got message type %d" msgstr "förväntade SSPI-svar, fick meddelandetyp %d" -#: libpq/auth.c:1329 +#: libpq/auth.c:1337 msgid "could not accept SSPI security context" msgstr "kunde inte acceptera SSPI-säkerhetskontext" -#: libpq/auth.c:1370 +#: libpq/auth.c:1378 msgid "could not get token from SSPI security context" msgstr "kunde inte hämta token från SSPI-säkerhetskontext" -#: libpq/auth.c:1506 libpq/auth.c:1525 +#: libpq/auth.c:1514 libpq/auth.c:1533 #, c-format msgid "could not translate name" msgstr "kunde inte översätta namn" -#: libpq/auth.c:1538 +#: libpq/auth.c:1546 #, c-format msgid "realm name too long" msgstr "realm-namn för långt" -#: libpq/auth.c:1553 +#: libpq/auth.c:1561 #, c-format msgid "translated account name too long" msgstr "översatt kontonamn för långt" -#: libpq/auth.c:1732 +#: libpq/auth.c:1740 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "kunde inte skapa uttag (socket) för Ident-anslutning: %m" -#: libpq/auth.c:1747 +#: libpq/auth.c:1755 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "kunde inte binda till lokal adress \"%s\": %m" -#: libpq/auth.c:1759 +#: libpq/auth.c:1767 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "kunde inte ansluta till Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1781 +#: libpq/auth.c:1789 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "kunde inte skicka fråga till Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1798 +#: libpq/auth.c:1806 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "kunde inte ta emot svar från Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1808 +#: libpq/auth.c:1816 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ogiltigt formatterat svar från Ident-server: \"%s\"" -#: libpq/auth.c:1861 +#: libpq/auth.c:1869 #, c-format msgid "peer authentication is not supported on this platform" msgstr "peer-autentisering stöds inte på denna plattform" -#: libpq/auth.c:1865 +#: libpq/auth.c:1873 #, c-format msgid "could not get peer credentials: %m" msgstr "kunde inte hämta peer-referenser: %m" -#: libpq/auth.c:1877 +#: libpq/auth.c:1885 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "kunde inte slå upp lokalt användar-id %ld: %s" -#: libpq/auth.c:1979 +#: libpq/auth.c:1987 #, c-format msgid "error from underlying PAM layer: %s" msgstr "fel från underliggande PAM-lager: %s" -#: libpq/auth.c:1990 +#: libpq/auth.c:1998 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "ej stödd PAM-konversation: %d/\"%s\"" -#: libpq/auth.c:2047 +#: libpq/auth.c:2055 #, c-format msgid "could not create PAM authenticator: %s" msgstr "kunde inte skapa PAM-autentiserare: %s" -#: libpq/auth.c:2058 +#: libpq/auth.c:2066 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) misslyckades: %s" -#: libpq/auth.c:2090 +#: libpq/auth.c:2098 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) misslyckades: %s" -#: libpq/auth.c:2102 +#: libpq/auth.c:2110 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) misslyckades: %s" -#: libpq/auth.c:2115 +#: libpq/auth.c:2123 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate misslyckades: %s" -#: libpq/auth.c:2128 +#: libpq/auth.c:2136 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt misslyckades: %s" -#: libpq/auth.c:2139 +#: libpq/auth.c:2147 #, c-format msgid "could not release PAM authenticator: %s" msgstr "kunde inte fria PAM-autentiserare: %s" -#: libpq/auth.c:2219 +#: libpq/auth.c:2227 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "kunde inte initiera LDAP: felkod %d" -#: libpq/auth.c:2256 +#: libpq/auth.c:2264 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "kunde inte extrahera domännamn från ldapbasedn" -#: libpq/auth.c:2264 +#: libpq/auth.c:2272 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP-autentisering kunde inte hitta DNS SRV-poster för \"%s\"" -#: libpq/auth.c:2266 +#: libpq/auth.c:2274 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Ange LDAP-servernamnet explicit." -#: libpq/auth.c:2318 +#: libpq/auth.c:2326 #, c-format msgid "could not initialize LDAP: %s" msgstr "kunde inte initiera LDAP: %s" -#: libpq/auth.c:2328 +#: libpq/auth.c:2336 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps stöds inte med detta LDAP-bibliotek" -#: libpq/auth.c:2336 +#: libpq/auth.c:2344 #, c-format msgid "could not initialize LDAP: %m" msgstr "kunde inte initiera LDAP: %m" -#: libpq/auth.c:2346 +#: libpq/auth.c:2354 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "kunde inte sätta LDAP-protokollversion: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2370 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "kunde inte starta LDAP TLS-session: %s" -#: libpq/auth.c:2439 +#: libpq/auth.c:2447 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-server inte angiven och ingen ldapbasedn" -#: libpq/auth.c:2446 +#: libpq/auth.c:2454 #, c-format msgid "LDAP server not specified" msgstr "LDAP-server inte angiven" -#: libpq/auth.c:2508 +#: libpq/auth.c:2516 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ogiltigt tecken i användarnamn för LDAP-autentisering" -#: libpq/auth.c:2525 +#: libpq/auth.c:2533 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "kunde inte utföra initial LDAP-bindning med ldapbinddn \"%s\" på server \"%s\": %s" -#: libpq/auth.c:2555 +#: libpq/auth.c:2563 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "kunde inte söka i LDAP med filter \"%s\" på server \"%s\": %s" -#: libpq/auth.c:2571 +#: libpq/auth.c:2579 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-användare \"%s\" finns inte" -#: libpq/auth.c:2572 +#: libpq/auth.c:2580 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-sökning med filter \"%s\" på server \"%s\" returnerade inga poster." -#: libpq/auth.c:2576 +#: libpq/auth.c:2584 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-användare \"%s\" är inte unik" -#: libpq/auth.c:2577 +#: libpq/auth.c:2585 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "LDAP-sökning med filter \"%s\" på server \"%s\" returnerade %d post." msgstr[1] "LDAP-sökning med filter \"%s\" på server \"%s\" returnerade %d poster." -#: libpq/auth.c:2597 +#: libpq/auth.c:2605 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "kunde inte hämta dn för första posten som matchar \"%s\" på värd \"%s\": %s" -#: libpq/auth.c:2618 +#: libpq/auth.c:2626 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "kunde inte avbinda efter att ha sökt efter användare \"%s\" på värd \"%s\"" -#: libpq/auth.c:2649 +#: libpq/auth.c:2657 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "LDAP-inloggning misslyckades för användare \"%s\" på värd \"%s\": %s" -#: libpq/auth.c:2681 +#: libpq/auth.c:2689 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-diagnostik: %s" -#: libpq/auth.c:2719 +#: libpq/auth.c:2727 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "certifikatautentisering misslyckades för användare \"%s\": klientcertifikatet innehåller inget användarnamn" -#: libpq/auth.c:2740 +#: libpq/auth.c:2748 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "certifikat-autentisering misslyckades för användare \"%s\": kan inte hämta subject DN" -#: libpq/auth.c:2763 +#: libpq/auth.c:2771 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "certifikat-validering (clientcert=verify-full) misslyckades för användare \"%s\": DN matchade inte" -#: libpq/auth.c:2768 +#: libpq/auth.c:2776 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "certifikat-validering (clientcert=verify-full) misslyckades för användare \"%s\": CN matchade inte" -#: libpq/auth.c:2870 +#: libpq/auth.c:2878 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-server inte angiven" -#: libpq/auth.c:2877 +#: libpq/auth.c:2885 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-hemlighet inte angiven" -#: libpq/auth.c:2891 +#: libpq/auth.c:2899 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS-autentisering stöder inte längre lösenord än %d tecken" -#: libpq/auth.c:2993 libpq/hba.c:2369 +#: libpq/auth.c:3001 libpq/hba.c:2369 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "kunde inte översätta RADIUS-värdnamn \"%s\" till adress: %s" -#: libpq/auth.c:3007 +#: libpq/auth.c:3015 #, c-format msgid "could not generate random encryption vector" msgstr "kunde inte generera slumpad kodningsvektor" -#: libpq/auth.c:3044 +#: libpq/auth.c:3052 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "kunde inte utföra MD5-kryptering av lösenord: %s" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not create RADIUS socket: %m" msgstr "kunde inte skapa RADIUS-uttag (socket): %m" -#: libpq/auth.c:3087 +#: libpq/auth.c:3095 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "kunde inte binda lokalt RADIUS-uttag (socket): %m" -#: libpq/auth.c:3097 +#: libpq/auth.c:3105 #, c-format msgid "could not send RADIUS packet: %m" msgstr "kan inte skicka RADIUS-paketet: %m" -#: libpq/auth.c:3131 libpq/auth.c:3157 +#: libpq/auth.c:3139 libpq/auth.c:3165 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "timeout vid väntande på RADIUS-svar från %s" -#: libpq/auth.c:3150 +#: libpq/auth.c:3158 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "kunde inte kontrollera status på RADIUS-uttag (socket): %m" -#: libpq/auth.c:3180 +#: libpq/auth.c:3188 #, c-format msgid "could not read RADIUS response: %m" msgstr "kunde inte läsa RADIUS-svar: %m" -#: libpq/auth.c:3188 +#: libpq/auth.c:3196 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "RADIUS-svar från %s skickades från fel port: %d" -#: libpq/auth.c:3196 +#: libpq/auth.c:3204 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-svar från %s är för kort: %d" -#: libpq/auth.c:3203 +#: libpq/auth.c:3211 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "RADIUS-svar från %s har felaktig längd: %d (riktig längd %d)" -#: libpq/auth.c:3211 +#: libpq/auth.c:3219 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "RADIUS-svar från %s tillhör en annan förfrågan: %d (skall vara %d)" -#: libpq/auth.c:3236 +#: libpq/auth.c:3244 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "kunde inte utföra MD5-kryptering på mottaget paket: %s" -#: libpq/auth.c:3246 +#: libpq/auth.c:3254 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-svar från %s har inkorrekt MD5-signatur" -#: libpq/auth.c:3264 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "RADIUS-svar från %s har ogiltig kod (%d) för användare \"%s\"" @@ -15221,44 +15243,39 @@ msgstr "privat nyckelfil \"%s\" har grupp eller världsaccess" msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Filen måste ha rättigheterna u=rw (0600) eller mindre om den ägs av databasanvändaren eller rättigheterna u=rw,g=r (0640) eller mindre om den ägs av root." -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI-fel vid inpackning" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "utående GSSAPI-meddelande skulle inte använda sekretess" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "servern försöke skicka för stort GSSAPI-paket (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPI-fel vid uppackning" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "inkommande GSSAPI-meddelande använde inte sekretess" -#: libpq/be-secure-gssapi.c:575 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %d)" - -#: libpq/be-secure-gssapi.c:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "kunde inte acceptera GSSSPI-säkerhetskontext" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" @@ -16351,19 +16368,19 @@ msgstr "utökningsbar nodtyp \"%s\" finns redan" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" har inte registerats" -#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 +#: nodes/makefuncs.c:153 nodes/makefuncs.c:179 statistics/extended_stats.c:2335 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "relationen \"%s\" har ingen composite-typ" -#: nodes/makefuncs.c:879 +#: nodes/makefuncs.c:926 #, c-format msgid "unrecognized JSON encoding: %s" msgstr "okänd JSON-kodning: %s" #: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2604 #: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 -#: parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 +#: parser/parse_expr.c:2057 parser/parse_func.c:710 parser/parse_oper.c:883 #: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" @@ -16384,7 +16401,7 @@ msgstr "ej namngiven portal med parametrar: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN stöds bara med villkor som är merge-joinbara eller hash-joinbara" -#: optimizer/plan/createplan.c:7124 parser/parse_merge.c:187 +#: optimizer/plan/createplan.c:7126 parser/parse_merge.c:187 #: parser/parse_merge.c:194 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -16403,38 +16420,38 @@ msgstr "%s kan inte appliceras på den nullbara sidan av en outer join" msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s tillåts inte med UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4036 +#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4079 #, c-format msgid "could not implement GROUP BY" msgstr "kunde inte implementera GROUP BY" -#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4037 -#: optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4080 +#: optimizer/plan/planner.c:4720 optimizer/prep/prepunion.c:1052 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Några av datatyperna stöder bara hash:ning medan andra bara stöder sortering." -#: optimizer/plan/planner.c:4676 +#: optimizer/plan/planner.c:4719 #, c-format msgid "could not implement DISTINCT" msgstr "kunde inte implementera DISTINCT" -#: optimizer/plan/planner.c:6015 +#: optimizer/plan/planner.c:6058 #, c-format msgid "could not implement window PARTITION BY" msgstr "kunde inte implementera fönster-PARTITION BY" -#: optimizer/plan/planner.c:6016 +#: optimizer/plan/planner.c:6059 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fönsterpartitioneringskolumner måsta ha en sorterbar datatyp." -#: optimizer/plan/planner.c:6020 +#: optimizer/plan/planner.c:6063 #, c-format msgid "could not implement window ORDER BY" msgstr "kunde inte implementera fönster-ORDER BY" -#: optimizer/plan/planner.c:6021 +#: optimizer/plan/planner.c:6064 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fönsterordningskolumner måste ha en sorterbar datatyp." @@ -16905,7 +16922,7 @@ msgstr "yttre aggregat kan inte innehålla inre variabel i sitt direkta argument msgid "aggregate function calls cannot contain set-returning function calls" msgstr "aggregatfunktionsanrop kan inte innehålla mängdreturnerande funktionsanrop" -#: parser/parse_agg.c:778 parser/parse_expr.c:1700 parser/parse_expr.c:2182 +#: parser/parse_agg.c:778 parser/parse_expr.c:1700 parser/parse_expr.c:2190 #: parser/parse_func.c:884 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." @@ -17302,7 +17319,7 @@ msgstr "Typomvandla offset-värdet till exakt den önskade typen." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2083 parser/parse_expr.c:2691 parser/parse_expr.c:3497 +#: parser/parse_expr.c:2091 parser/parse_expr.c:2699 parser/parse_expr.c:3505 #: parser/parse_target.c:999 #, c-format msgid "cannot cast type %s to %s" @@ -17498,152 +17515,152 @@ msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en INTERSECT" msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en EXCEPT" -#: parser/parse_cte.c:133 +#: parser/parse_cte.c:134 #, c-format msgid "MERGE not supported in WITH query" msgstr "MERGE stöds inte i WITH-fråga" -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:144 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH-frågenamn \"%s\" angivet mer än en gång" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:315 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "kunde inte hitta en olikhetsoperator för typ %s" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:342 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "WITH-klausul som innehåller en datamodifierande sats måste vara på toppnivå" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:391 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "rekursiv fråga \"%s\" kolumn %d har typ %s i den ickerekursiva termen med typ %s totalt sett" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:397 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Typomvandla utdatan för den ickerekursiva termen till korrekt typ." -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:402 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "rekursiv fråga \"%s\" kolumn %d har jämförelse (collation) \"%s\" i en icke-rekursiv term men jämförelse \"%s\" totalt sett" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:406 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Använd en COLLATE-klausul för att sätta jämförelse för den icke-rekursiva termen." -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:427 #, c-format msgid "WITH query is not recursive" msgstr "WITH-fråga är inte rekursiv" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:458 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "med en SEARCH- eller CYCLE-klausul så måste vänstersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:463 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "med en SEARCH- eller CYCLE-klausul så måste högersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "sökkolumn \"%s\" finns inte med i kolumnlistan för WITH-fråga" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:485 #, c-format msgid "search column \"%s\" specified more than once" msgstr "sökkolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:494 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "namn på söksekvensenskolumn \"%s\" används redan i kolumnlistan till WITH-fråga" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "cycle-kolumn \"%s\" finns inte i kolumnlistan i WITH-fråga" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:518 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "cycle-kolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:527 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "mark-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-fråga" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:534 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "path-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-fråga" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:542 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "mark-kolumnnamn och path-kolumnnamn i cycle är båda samma" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "namn på söksekvenskolumn och namn på mark-kolumn i cycle är båda samma" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:559 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "namn på söksekvenskolumn och namn på path-kolumn i cycle är båda samma" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:643 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH-fråga \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:888 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "ömsesidig rekursion mellan WITH-poster är inte implementerat" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:940 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "rekursiv fråga \"%s\" får inte innehålla datamodifierande satser" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:948 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "rekursiv fråga \"%s\" är inte på formen icke-rekursiv-term UNION [ALL] rekursiv-term" -#: parser/parse_cte.c:917 +#: parser/parse_cte.c:983 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:923 +#: parser/parse_cte.c:989 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:929 +#: parser/parse_cte.c:995 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:935 +#: parser/parse_cte.c:1001 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE i en rekursiv fråga är inte implementerat" -#: parser/parse_cte.c:1014 +#: parser/parse_cte.c:1080 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "rekursiv referens till fråga \"%s\" får inte finnas med mer än en gång" @@ -17706,7 +17723,7 @@ msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF kräver att =-operatorn returnerar boolean" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1072 parser/parse_expr.c:3007 +#: parser/parse_expr.c:1072 parser/parse_expr.c:3015 #, c-format msgid "%s must not return a set" msgstr "%s får inte returnera en mängd" @@ -17722,7 +17739,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex msgstr "källa till en multiple-kolumn-UPDATE-post måste vara en sub-SELECT eller ROW()-uttryck" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1698 parser/parse_expr.c:2180 parser/parse_func.c:2677 +#: parser/parse_expr.c:1698 parser/parse_expr.c:2188 parser/parse_func.c:2677 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "mängdreturnerande funktioner tillåts inte i %s" @@ -17779,7 +17796,7 @@ msgstr "kan inte använda subfråga i COPY FROM WHERE-villkor" msgid "cannot use subquery in column generation expression" msgstr "kan inte använda subfråga i kolumngenereringsuttryck" -#: parser/parse_expr.c:1851 parser/parse_expr.c:3626 +#: parser/parse_expr.c:1851 parser/parse_expr.c:3634 #, c-format msgid "subquery must return only one column" msgstr "underfråga kan bara returnera en kolumn" @@ -17794,137 +17811,137 @@ msgstr "underfråga har för många kolumner" msgid "subquery has too few columns" msgstr "underfråga har för få kolumner" -#: parser/parse_expr.c:2023 +#: parser/parse_expr.c:2031 #, c-format msgid "cannot determine type of empty array" msgstr "kan inte bestämma typen av en tom array" -#: parser/parse_expr.c:2024 +#: parser/parse_expr.c:2032 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Typomvandla explicit till den önskade typen, till exempel ARRAY[]::integer[]." -#: parser/parse_expr.c:2038 +#: parser/parse_expr.c:2046 #, c-format msgid "could not find element type for data type %s" msgstr "kunde inte hitta elementtyp för datatyp %s" -#: parser/parse_expr.c:2121 +#: parser/parse_expr.c:2129 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-uttryck kan ha som mest %d poster" -#: parser/parse_expr.c:2326 +#: parser/parse_expr.c:2334 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "onamnat XML-attributvärde måste vara en kolumnreferens" -#: parser/parse_expr.c:2327 +#: parser/parse_expr.c:2335 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "onamnat XML-elementvärde måste vara en kolumnreferens" -#: parser/parse_expr.c:2342 +#: parser/parse_expr.c:2350 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-attributnamn \"%s\" finns med mer än en gång" -#: parser/parse_expr.c:2450 +#: parser/parse_expr.c:2458 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kan inte typomvandla XMLSERIALIZE-resultat till %s" -#: parser/parse_expr.c:2764 parser/parse_expr.c:2960 +#: parser/parse_expr.c:2772 parser/parse_expr.c:2968 #, c-format msgid "unequal number of entries in row expressions" msgstr "olika antal element i raduttryck" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2782 #, c-format msgid "cannot compare rows of zero length" msgstr "kan inte jämföra rader med längden noll" -#: parser/parse_expr.c:2799 +#: parser/parse_expr.c:2807 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "operator för radjämförelse måste resultera i typen boolean, inte %s" -#: parser/parse_expr.c:2806 +#: parser/parse_expr.c:2814 #, c-format msgid "row comparison operator must not return a set" msgstr "radjämförelseoperator får inte returnera en mängd" -#: parser/parse_expr.c:2865 parser/parse_expr.c:2906 +#: parser/parse_expr.c:2873 parser/parse_expr.c:2914 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "kunde inte lista ut tolkning av radjämförelseoperator %s" -#: parser/parse_expr.c:2867 +#: parser/parse_expr.c:2875 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Radjämförelseoperatorer måste vara associerade med btreee-operatorfamiljer." -#: parser/parse_expr.c:2908 +#: parser/parse_expr.c:2916 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Det finns flera lika sannolika kandidater." -#: parser/parse_expr.c:3001 +#: parser/parse_expr.c:3009 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM kräver att operatorn = ger tillbaka en boolean" -#: parser/parse_expr.c:3239 +#: parser/parse_expr.c:3247 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" msgstr "JSON ENCODING tillåts bara för input-typen bytea" -#: parser/parse_expr.c:3261 +#: parser/parse_expr.c:3269 #, c-format msgid "cannot use non-string types with implicit FORMAT JSON clause" msgstr "kan inte använda icke-strängtyper med implicit FORMAT JSON-klausul" -#: parser/parse_expr.c:3262 +#: parser/parse_expr.c:3270 #, c-format msgid "cannot use non-string types with explicit FORMAT JSON clause" msgstr "kan inte använda icke-strängtyper med explicit FORMAT JSON-klausul" -#: parser/parse_expr.c:3335 +#: parser/parse_expr.c:3343 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "kan inte använda JSON-formatet för utddata som inte är strängar" -#: parser/parse_expr.c:3348 +#: parser/parse_expr.c:3356 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "kan inte sätta JSON-kodning för utdata-typer som inte är bytea" -#: parser/parse_expr.c:3353 +#: parser/parse_expr.c:3361 #, c-format msgid "unsupported JSON encoding" msgstr "ej stödd JSON-kodning" -#: parser/parse_expr.c:3354 +#: parser/parse_expr.c:3362 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "Enbart JSON-kodningen UTF8 stöds." -#: parser/parse_expr.c:3391 +#: parser/parse_expr.c:3399 #, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" msgstr "returtyp SETOF stöds inte för SQL/JSON-funktioner" -#: parser/parse_expr.c:3710 parser/parse_func.c:865 +#: parser/parse_expr.c:3718 parser/parse_func.c:865 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "aggregat-ORDER BY är inte implementerat för fönsterfunktioner" -#: parser/parse_expr.c:3933 +#: parser/parse_expr.c:3941 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "kan inte använda JSON FORMAT ENCODING för indatatyper som inte är bytea" -#: parser/parse_expr.c:3953 +#: parser/parse_expr.c:3961 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "kan inte använda typen %s i ett IS JSON-predikat" @@ -19280,32 +19297,32 @@ msgstr "autovacuum-arbetaren tog för lång tid på sig att starta; avbruten" msgid "could not fork autovacuum worker process: %m" msgstr "kunde inte starta autovacuum-arbetsprocess: %m" -#: postmaster/autovacuum.c:2355 +#: postmaster/autovacuum.c:2370 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: slänger övergiven temptabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2591 +#: postmaster/autovacuum.c:2613 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisk vacuum av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2594 +#: postmaster/autovacuum.c:2616 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisk analys av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2788 +#: postmaster/autovacuum.c:2812 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processar arbetspost för relation \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3402 +#: postmaster/autovacuum.c:3439 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum har inte startats på grund av en felkonfigurering" -#: postmaster/autovacuum.c:3403 +#: postmaster/autovacuum.c:3440 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Slå på flaggan \"track_counts\"." @@ -19367,24 +19384,24 @@ msgstr[1] "Upp till %d bakgrundsarbetare kan registreras med nuvarande inställn msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Överväg att öka konfigurationsparametern \"max_worker_processes\"." -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:434 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "checkpoint:s sker för ofta (%d sekund emellan)" msgstr[1] "checkpoint:s sker för ofta (%d sekunder emellan)" -#: postmaster/checkpointer.c:435 +#: postmaster/checkpointer.c:438 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Överväg att öka konfigurationsparametern \"max_wal_size\"." -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1065 #, c-format msgid "checkpoint request failed" msgstr "checkpoint-behgäran misslyckades" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1066 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Se senaste meddelanden i serverloggen för mer information." @@ -20179,7 +20196,7 @@ msgid "error reading result of streaming command: %s" msgstr "fel vid läsning av resultat från strömningskommando: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:653 -#: replication/libpqwalreceiver/libpqwalreceiver.c:889 +#: replication/libpqwalreceiver/libpqwalreceiver.c:886 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "oväntat resultat efter CommandComplete: %s" @@ -20194,43 +20211,43 @@ msgstr "kan inte ta emot fil med tidslinjehistorik från primära servern: %s" msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Förväntade 1 tupel med 2 fält, fick %d tupler med %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:852 -#: replication/libpqwalreceiver/libpqwalreceiver.c:905 -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:849 +#: replication/libpqwalreceiver/libpqwalreceiver.c:902 +#: replication/libpqwalreceiver/libpqwalreceiver.c:909 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "kunde inte ta emot data från WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:932 +#: replication/libpqwalreceiver/libpqwalreceiver.c:929 #, c-format msgid "could not send data to WAL stream: %s" msgstr "kunde inte skicka data till WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1024 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1021 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "kunde inte skapa replikeringsslot \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1070 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1067 #, c-format msgid "invalid query response" msgstr "ogiltigt frågerespons" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1071 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1068 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Förväntade %d fält, fick %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1141 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1138 #, c-format msgid "the query interface requires a database connection" msgstr "frågeinterface:et kräver en databasanslutning" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1172 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1169 msgid "empty query" msgstr "tom fråga" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1178 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 msgid "unexpected pipeline mode" msgstr "oväntat pipeline-läge" @@ -20275,17 +20292,17 @@ msgstr "logiska replikeringens ändringsapplicerare kommer spara ner återståen msgid "logical decoding on standby requires wal_level >= logical on the primary" msgstr "logisk avkodning på standby kräver wal_level >= logical på primären" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:344 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "kan inte starta logisk replikeringsarbetare när max_replication_slots = 0" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:437 #, c-format msgid "out of logical replication worker slots" msgstr "slut på logiska replikeringsarbetarslots" -#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 +#: replication/logical/launcher.c:438 replication/logical/launcher.c:512 #: replication/slot.c:1297 storage/lmgr/lock.c:998 storage/lmgr/lock.c:1036 #: storage/lmgr/lock.c:2831 storage/lmgr/lock.c:4216 storage/lmgr/lock.c:4281 #: storage/lmgr/lock.c:4631 storage/lmgr/predicate.c:2418 @@ -20294,17 +20311,17 @@ msgstr "slut på logiska replikeringsarbetarslots" msgid "You might need to increase %s." msgstr "Du kan behöva öka %s." -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:511 #, c-format msgid "out of background worker slots" msgstr "slut på bakgrundsarbetarslots" -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:718 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "logisk replikeringsarbetarslot %d är tom, kan inte ansluta" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:727 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "logiisk replikeringsarbetarslot %d används redan av en annan arbetare, kan inte ansluta" @@ -20479,7 +20496,7 @@ msgid "could not find free replication state slot for replication origin with ID msgstr "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med ID %d" #: replication/logical/origin.c:957 replication/logical/origin.c:1155 -#: replication/slot.c:2120 +#: replication/slot.c:2137 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Öka max_replication_slots och försök igen." @@ -20532,29 +20549,29 @@ msgstr "destinationsrelation \"%s.%s\" för logisk replikering använder systemk msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "destinationsrelation \"%s.%s\" för logisk replikering finns inte" -#: replication/logical/reorderbuffer.c:3941 +#: replication/logical/reorderbuffer.c:4070 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "kunde inte skriva till datafil för XID %u: %m" -#: replication/logical/reorderbuffer.c:4287 -#: replication/logical/reorderbuffer.c:4312 +#: replication/logical/reorderbuffer.c:4416 +#: replication/logical/reorderbuffer.c:4441 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "kunde inte läsa från reorderbuffer spill-fil: %m" -#: replication/logical/reorderbuffer.c:4291 -#: replication/logical/reorderbuffer.c:4316 +#: replication/logical/reorderbuffer.c:4420 +#: replication/logical/reorderbuffer.c:4445 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "kunde inte läsa från reorderbuffer spill-fil: läste %d istället för %u byte" -#: replication/logical/reorderbuffer.c:4566 +#: replication/logical/reorderbuffer.c:4695 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "kunde inte radera fil \"%s\" vid borttagning av pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5062 +#: replication/logical/reorderbuffer.c:5191 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "kunde inte läsa från fil \"%s\": läste %d istället för %d byte" @@ -20571,58 +20588,58 @@ msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs msgstr[0] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" msgstr[1] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" -#: replication/logical/snapbuild.c:1392 replication/logical/snapbuild.c:1489 -#: replication/logical/snapbuild.c:2005 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1536 +#: replication/logical/snapbuild.c:2052 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisk avkodning hittade konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1394 +#: replication/logical/snapbuild.c:1441 #, c-format msgid "There are no running transactions." msgstr "Det finns inga körande transaktioner." -#: replication/logical/snapbuild.c:1441 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisk avkodning hittade initial startpunkt vid %X/%X" -#: replication/logical/snapbuild.c:1443 replication/logical/snapbuild.c:1467 +#: replication/logical/snapbuild.c:1490 replication/logical/snapbuild.c:1514 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Väntar på att transaktioner (cirka %d) äldre än %u skall gå klart." -#: replication/logical/snapbuild.c:1465 +#: replication/logical/snapbuild.c:1512 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisk avkodning hittade initial konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1491 +#: replication/logical/snapbuild.c:1538 #, c-format msgid "There are no old transactions anymore." msgstr "Det finns inte längre några gamla transaktioner." -#: replication/logical/snapbuild.c:1892 +#: replication/logical/snapbuild.c:1939 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har fel magiskt tal: %u istället för %u" -#: replication/logical/snapbuild.c:1898 +#: replication/logical/snapbuild.c:1945 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har en ej stödd version: %u istället för %u" -#: replication/logical/snapbuild.c:1939 +#: replication/logical/snapbuild.c:1986 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "checksumma stämmer inte för snapbuild-state-fil \"%s\": är %u, skall vara %u" -#: replication/logical/snapbuild.c:2007 +#: replication/logical/snapbuild.c:2054 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logisk avkodning kommer starta med sparat snapshot." -#: replication/logical/snapbuild.c:2114 +#: replication/logical/snapbuild.c:2161 #, c-format msgid "could not parse file name \"%s\"" msgstr "kunde inte parsa filnamn \"%s\"" @@ -20632,197 +20649,197 @@ msgstr "kunde inte parsa filnamn \"%s\"" msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" är klar" -#: replication/logical/tablesync.c:639 +#: replication/logical/tablesync.c:665 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om så att two_phase kan slås på" -#: replication/logical/tablesync.c:814 replication/logical/tablesync.c:956 +#: replication/logical/tablesync.c:840 replication/logical/tablesync.c:982 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\" från publicerare: %s" -#: replication/logical/tablesync.c:821 +#: replication/logical/tablesync.c:847 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabell \"%s.%s\" hittades inte hos publicerare" -#: replication/logical/tablesync.c:879 +#: replication/logical/tablesync.c:905 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta kolumlista för tabell \"%s.%s\" från publicerare: %s" -#: replication/logical/tablesync.c:1058 +#: replication/logical/tablesync.c:1084 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta tabells WHERE-klausul för tabell \"%s.%s\" från publicerare: %s" -#: replication/logical/tablesync.c:1217 +#: replication/logical/tablesync.c:1243 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "kunde inte starta initial innehållskopiering för tabell \"%s.%s\": %s" -#: replication/logical/tablesync.c:1418 +#: replication/logical/tablesync.c:1444 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "tabellkopiering kunde inte starta transaktion på publiceraren: %s" -#: replication/logical/tablesync.c:1460 +#: replication/logical/tablesync.c:1486 #, c-format msgid "replication origin \"%s\" already exists" msgstr "replikeringsurspring \"%s\" finns redan" -#: replication/logical/tablesync.c:1493 replication/logical/worker.c:2374 +#: replication/logical/tablesync.c:1519 replication/logical/worker.c:2376 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "användaren \"%s\" kan inte replikera in i en relation med radsäkerhet påslagen: \"%s\"" -#: replication/logical/tablesync.c:1506 +#: replication/logical/tablesync.c:1532 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "tabellkopiering kunde inte slutföra transaktion på publiceraren: %s" -#: replication/logical/worker.c:499 +#: replication/logical/worker.c:501 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "logiska replikeringens parallella ändringsapplicerare för prenumeration \"%s\" kommer stoppa" -#: replication/logical/worker.c:501 +#: replication/logical/worker.c:503 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "Kan inte hantera strömmade replikerade transaktioner med parallell ändringsapplicerare innan alla tabeller har synkroniserats." -#: replication/logical/worker.c:863 replication/logical/worker.c:978 +#: replication/logical/worker.c:865 replication/logical/worker.c:980 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" -#: replication/logical/worker.c:2513 +#: replication/logical/worker.c:2515 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "publicerare skickade inte identitetskolumn för replika som förväntades av den logiska replikeringens målrelation \"%s.%s\"" -#: replication/logical/worker.c:2520 +#: replication/logical/worker.c:2522 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "logisk replikeringsmålrelation \"%s.%s\" har varken REPLICA IDENTITY-index eller PRIMARY KEY och den publicerade relationen har inte REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3384 +#: replication/logical/worker.c:3386 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "ogiltig logisk replikeringsmeddelandetyp \"??? (%d)\"" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3558 #, c-format msgid "data stream from publisher has ended" msgstr "dataströmmen från publiceraren har avslutats" -#: replication/logical/worker.c:3713 +#: replication/logical/worker.c:3715 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "avslutar logisk replikeringsarbetare på grund av timeout" -#: replication/logical/worker.c:3907 +#: replication/logical/worker.c:3909 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "logiska replikerings ändringsapplicerare för prenumeration \"%s\" kommer att stoppa då prenumerationen har tagits bort" -#: replication/logical/worker.c:3920 +#: replication/logical/worker.c:3922 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "logiska replikerings ändringsapplicerare för prenumeration \"%s\" kommer att stoppa då prenumerationen har stängts av" -#: replication/logical/worker.c:3951 +#: replication/logical/worker.c:3953 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer att stoppa på grund av ändrade parametrar" -#: replication/logical/worker.c:3955 +#: replication/logical/worker.c:3957 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer att startas om på grund av ändrade parametrar" -#: replication/logical/worker.c:4489 +#: replication/logical/worker.c:4499 #, c-format msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "logiska replikeringens ändringsapplicerare för prenumeration %u kommer inte att startas då prenumerationen togs bort i uppstarten" -#: replication/logical/worker.c:4504 +#: replication/logical/worker.c:4514 #, c-format msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer inte att startas då prenumerationen stängdes av i uppstarten" -#: replication/logical/worker.c:4521 +#: replication/logical/worker.c:4531 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" har startat" -#: replication/logical/worker.c:4526 +#: replication/logical/worker.c:4536 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" har startat" -#: replication/logical/worker.c:4614 +#: replication/logical/worker.c:4624 #, c-format msgid "subscription has no replication slot set" msgstr "prenumeration har ingen replikeringsslot angiven" -#: replication/logical/worker.c:4781 +#: replication/logical/worker.c:4807 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "prenumeration \"%s\" har avaktiverats på grund av ett fel" -#: replication/logical/worker.c:4829 +#: replication/logical/worker.c:4855 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "logisk replikering börjar hoppa över transaktion vid LSN %X/%X" -#: replication/logical/worker.c:4843 +#: replication/logical/worker.c:4869 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "logisk replikering har slutfört överhoppande av transaktionen vid LSN %X/%X" -#: replication/logical/worker.c:4925 +#: replication/logical/worker.c:4957 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "överhoppnings-LSN för logiska prenumerationen \"%s\" har nollställts" -#: replication/logical/worker.c:4926 +#: replication/logical/worker.c:4958 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "Fjärrtransaktionens slut-WAL-position (LSN) %X/%X matchade inte överhoppnings-LSN %X/%X." -#: replication/logical/worker.c:4963 +#: replication/logical/worker.c:4986 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\"" -#: replication/logical/worker.c:4967 +#: replication/logical/worker.c:4990 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u" -#: replication/logical/worker.c:4972 +#: replication/logical/worker.c:4995 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u blev klar vid %X/%X" -#: replication/logical/worker.c:4983 +#: replication/logical/worker.c:5006 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" i transaktion %u" -#: replication/logical/worker.c:4990 +#: replication/logical/worker.c:5013 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" i transaktion %u blev klart vid %X/%X" -#: replication/logical/worker.c:5001 +#: replication/logical/worker.c:5024 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" kolumn \"%s\" i transaktion %u" -#: replication/logical/worker.c:5009 +#: replication/logical/worker.c:5032 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" kolumn \"%s\" i transaktion %u blev klart vid %X/%X" @@ -20999,27 +21016,37 @@ msgstr "replikeringsslotfil \"%s\" har felaktig längd %u" msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "kontrollsummefel för replikeringsslot-fil \"%s\": är %u, skall vara %u" -#: replication/slot.c:2077 +#: replication/slot.c:2079 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "logisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:2079 +#: replication/slot.c:2081 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Ändra wal_level till logical eller högre." -#: replication/slot.c:2083 +#: replication/slot.c:2093 +#, c-format +msgid "logical replication slot \"%s\" exists on the standby, but hot_standby = off" +msgstr "logisk replikeringsslot \"%s\" finns på standby men hot_standby = off" + +#: replication/slot.c:2095 +#, c-format +msgid "Change hot_standby to be on." +msgstr "Ändra hot_standby till on." + +#: replication/slot.c:2100 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "fysisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:2085 +#: replication/slot.c:2102 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Ändra wal_level till replica eller högre." -#: replication/slot.c:2119 +#: replication/slot.c:2136 #, c-format msgid "too many replication slots active before shutdown" msgstr "för många aktiva replikeringsslottar innan nerstängning" @@ -21059,57 +21086,72 @@ msgstr "kan inte kopiera logisk replikeringsslot \"%s\" som en fysisk replikerin msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "kan inte kopiera en replikeringsslot som inte tidigare har reserverat WAL" -#: replication/slotfuncs.c:834 +#: replication/slotfuncs.c:763 +#, c-format +msgid "cannot copy invalidated replication slot \"%s\"" +msgstr "kan inte kopiera replikeringsslot \"%s\" som blivit ogiltig" + +#: replication/slotfuncs.c:841 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "kunde inte kopiera replikeringsslot \"%s\"" -#: replication/slotfuncs.c:836 +#: replication/slotfuncs.c:843 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Källreplikeringsslotten ändrades på ett inkompatibelt sätt under copy-operationen." -#: replication/slotfuncs.c:842 +#: replication/slotfuncs.c:849 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kan inte kopiera ej slutförd replikeringsslot \"%s\"" -#: replication/slotfuncs.c:844 +#: replication/slotfuncs.c:851 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Försök igen när källreplikeringsslottens confirmed_flush_lsn är giltig." -#: replication/syncrep.c:262 +#: replication/slotfuncs.c:863 +#, c-format +msgid "cannot copy replication slot \"%s\"" +msgstr "kan inte kopiera replikeringsslot \"%s\"" + +#: replication/slotfuncs.c:865 +#, c-format +msgid "The source replication slot was invalidated during the copy operation." +msgstr "Källreplikeringsslotten gjordes ogiltig under copy-operationen." + +#: replication/syncrep.c:305 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "avbryter väntan på synkron replikering samt avslutar anslutning på grund av ett administratörskommando" -#: replication/syncrep.c:263 replication/syncrep.c:280 +#: replication/syncrep.c:306 replication/syncrep.c:323 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Transaktionen har redan commit:ats lokalt men har kanske inte replikerats till standby:en." -#: replication/syncrep.c:279 +#: replication/syncrep.c:322 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "avbryter väntan på synkron replikering efter användarens önskemål" -#: replication/syncrep.c:486 +#: replication/syncrep.c:529 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "standby \"%s\" är nu en synkron standby med prioritet %u" -#: replication/syncrep.c:490 +#: replication/syncrep.c:533 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "standby \"%s\" är nu en kvorumkandidat för synkron standby" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1086 #, c-format msgid "synchronous_standby_names parser failed" msgstr "synchronous_standby_names-parser misslyckades" -#: replication/syncrep.c:1025 +#: replication/syncrep.c:1092 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "antal synkrona standbys (%d) måste vara fler än noll" @@ -21189,125 +21231,125 @@ msgstr "hämtar tidslinjehistorikfil för tidslinje %u från primära servern" msgid "could not write to WAL segment %s at offset %u, length %lu: %m" msgstr "kunde inte skriva till WAL-segment %s på offset %u, längd %lu: %m" -#: replication/walsender.c:519 +#: replication/walsender.c:522 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "kan inte använda %s med logisk replikeringsslot" -#: replication/walsender.c:623 storage/smgr/md.c:1541 +#: replication/walsender.c:626 storage/smgr/md.c:1541 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "kunde inte söka (seek) till slutet av filen \"%s\": %m" -#: replication/walsender.c:627 +#: replication/walsender.c:630 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "kunde inte söka till början av filen \"%s\": %m" -#: replication/walsender.c:704 +#: replication/walsender.c:707 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "kan inte använda logisk replikeringsslot för fysisk replikering" -#: replication/walsender.c:770 +#: replication/walsender.c:773 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "efterfrågad startpunkt %X/%X på tidslinje %u finns inte i denna servers historik" -#: replication/walsender.c:773 +#: replication/walsender.c:776 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "Denna servers historik delade sig från tidslinje %u vid %X/%X." -#: replication/walsender.c:817 +#: replication/walsender.c:820 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "efterfrågad startpunkt %X/%X är längre fram än denna servers flush:ade WAL-skrivposition %X/%X" -#: replication/walsender.c:1010 +#: replication/walsender.c:1013 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "okänt värde för CREATE_REPLICATION_SLOT-flagga \"%s\": \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1095 +#: replication/walsender.c:1098 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s får inte anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1105 +#: replication/walsender.c:1108 #, c-format msgid "%s must be called inside a transaction" msgstr "%s måste anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1114 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s måste anropas i transaktions REPEATABLE READ-isolationsläge" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1119 #, c-format msgid "%s must be called in a read-only transaction" msgstr "%s måste anropas i en read-only-transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1125 #, c-format msgid "%s must be called before any query" msgstr "%s måste anropas innan någon fråga" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1131 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s får inte anropas i en undertransaktion" -#: replication/walsender.c:1275 +#: replication/walsender.c:1278 #, c-format msgid "terminating walsender process after promotion" msgstr "stänger ner walsender-process efter befordran" -#: replication/walsender.c:1696 +#: replication/walsender.c:1710 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "kan inte utföra nya kommandon när WAL-sändare är i stopp-läge" -#: replication/walsender.c:1731 +#: replication/walsender.c:1745 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "kan inte köra SQL-kommandon i WAL-sändare för fysisk replikering" -#: replication/walsender.c:1764 +#: replication/walsender.c:1778 #, c-format msgid "received replication command: %s" msgstr "tog emot replikeringskommando: %s" -#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: replication/walsender.c:1786 tcop/fastpath.c:209 tcop/postgres.c:1142 #: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2238 #: tcop/postgres.c:2676 tcop/postgres.c:2754 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuella transaktionen har avbrutits, alla kommandon ignoreras tills slutet på transaktionen" -#: replication/walsender.c:1914 replication/walsender.c:1949 +#: replication/walsender.c:1928 replication/walsender.c:1963 #, c-format msgid "unexpected EOF on standby connection" msgstr "oväntat EOF från standby-anslutning" -#: replication/walsender.c:1937 +#: replication/walsender.c:1951 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ogiltigt standby-meddelandetyp \"%c\"" -#: replication/walsender.c:2026 +#: replication/walsender.c:2040 #, c-format msgid "unexpected message type \"%c\"" msgstr "oväntad meddelandetyp \"%c\"" -#: replication/walsender.c:2439 +#: replication/walsender.c:2457 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "avslutar walsender-process på grund av replikerings-timeout" @@ -21885,22 +21927,22 @@ msgstr "oväntad data efter EOF i block %u för relation %s" msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Detta beteende har observerats med buggiga kärnor; fundera på att uppdatera ditt system." -#: storage/buffer/bufmgr.c:5219 +#: storage/buffer/bufmgr.c:5220 #, c-format msgid "could not write block %u of %s" msgstr "kunde inte skriva block %u av %s" -#: storage/buffer/bufmgr.c:5221 +#: storage/buffer/bufmgr.c:5222 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Multipla fel --- skrivfelet kan vara permanent." -#: storage/buffer/bufmgr.c:5243 storage/buffer/bufmgr.c:5263 +#: storage/buffer/bufmgr.c:5244 storage/buffer/bufmgr.c:5264 #, c-format msgid "writing block %u of relation %s" msgstr "skriver block %u i relation %s" -#: storage/buffer/bufmgr.c:5593 +#: storage/buffer/bufmgr.c:5594 #, c-format msgid "snapshot too old" msgstr "snapshot för gammal" @@ -21950,134 +21992,134 @@ msgstr "kunde inte radera filmängd \"%s\": %m" msgid "could not truncate file \"%s\": %m" msgstr "kunde inte trunkera fil \"%s\": %m" -#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 +#: storage/file/fd.c:534 storage/file/fd.c:606 storage/file/fd.c:642 #, c-format msgid "could not flush dirty data: %m" msgstr "kunde inte flush:a smutsig data: %m" -#: storage/file/fd.c:567 +#: storage/file/fd.c:564 #, c-format msgid "could not determine dirty data size: %m" msgstr "kunde inte lista ut storlek på smutsig data: %m" -#: storage/file/fd.c:619 +#: storage/file/fd.c:616 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "kunde inte göra munmap() vid flush:ning av data: %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:934 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit misslyckades: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1024 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "otillräckligt antal fildeskriptorer tillgängligt för att starta serverprocessen" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1025 #, c-format msgid "System allows %d, server needs at least %d." msgstr "Systemet tillåter %d, servern behöver minst %d." -#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 -#: storage/file/fd.c:2825 +#: storage/file/fd.c:1113 storage/file/fd.c:2562 storage/file/fd.c:2671 +#: storage/file/fd.c:2822 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "slut på fildeskriptorer: %m; frigör och försök igen" -#: storage/file/fd.c:1490 +#: storage/file/fd.c:1487 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporär fil: sökväg \"%s\", storlek %lu" -#: storage/file/fd.c:1629 +#: storage/file/fd.c:1626 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "kunde inte skapa temporär katalog \"%s\": %m" -#: storage/file/fd.c:1636 +#: storage/file/fd.c:1633 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "kunde inte skapa temporär underkatalog \"%s\": %m" -#: storage/file/fd.c:1833 +#: storage/file/fd.c:1830 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "kan inte skapa temporär fil \"%s\": %m" -#: storage/file/fd.c:1869 +#: storage/file/fd.c:1866 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" # unlink refererar till unix-funktionen unlink() så den översätter vi inte -#: storage/file/fd.c:1910 +#: storage/file/fd.c:1907 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "kunde inte unlink:a temporär fil \"%s\": %m" -#: storage/file/fd.c:1998 +#: storage/file/fd.c:1995 #, c-format msgid "could not delete file \"%s\": %m" msgstr "kunde inte radera fil \"%s\": %m" -#: storage/file/fd.c:2185 +#: storage/file/fd.c:2182 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "storlek på temporär fil överskrider temp_file_limit (%dkB)" -#: storage/file/fd.c:2541 storage/file/fd.c:2600 +#: storage/file/fd.c:2538 storage/file/fd.c:2597 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna fil \"%s\"" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2642 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att köra kommando \"%s\"" -#: storage/file/fd.c:2801 +#: storage/file/fd.c:2798 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna katalog \"%s\"" -#: storage/file/fd.c:3331 +#: storage/file/fd.c:3328 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "oväntad fil hittades i katalogen för temporära filer: \"%s\"" -#: storage/file/fd.c:3449 +#: storage/file/fd.c:3446 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (syncfs), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" -#: storage/file/fd.c:3463 +#: storage/file/fd.c:3460 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" -#: storage/file/fd.c:3676 +#: storage/file/fd.c:3673 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (pre-fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" -#: storage/file/fd.c:3708 +#: storage/file/fd.c:3705 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" -#: storage/file/fd.c:3897 +#: storage/file/fd.c:3894 #, c-format msgid "debug_io_direct is not supported on this platform." msgstr "debug_io_direct stöds inte på denna plattform." -#: storage/file/fd.c:3944 +#: storage/file/fd.c:3941 #, c-format msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" msgstr "debug_io_direct stöds inte för WAL då XLOG_BLCKSZ är för liten" -#: storage/file/fd.c:3951 +#: storage/file/fd.c:3948 #, c-format msgid "debug_io_direct is not supported for data because BLCKSZ is too small" msgstr "debug_io_direct stöds inte för data då BLCKSZ är för liten" @@ -22208,7 +22250,7 @@ msgstr "ogiltig meddelandestorlek %zu i kö i delat minne" #: storage/lmgr/lock.c:4280 storage/lmgr/lock.c:4630 #: storage/lmgr/predicate.c:2417 storage/lmgr/predicate.c:2432 #: storage/lmgr/predicate.c:3829 storage/lmgr/predicate.c:4876 -#: utils/hash/dynahash.c:1107 +#: utils/hash/dynahash.c:1108 #, c-format msgid "out of shared memory" msgstr "slut på delat minne" @@ -22389,107 +22431,107 @@ msgstr "deadlock upptäckt" msgid "See server log for query details." msgstr "Se server-logg för frågedetaljer." -#: storage/lmgr/lmgr.c:853 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "vid uppdatering av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:856 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "vid borttagning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "vid låsning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "vid låsning av uppdaterad version (%u,%u) av tupel i relation \"%s\"" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "vid insättning av indextupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av unikhet av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "vid återkontroll av uppdaterad tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av uteslutningsvillkor av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1212 #, c-format msgid "relation %u of database %u" msgstr "relation %u i databasen %u" -#: storage/lmgr/lmgr.c:1212 +#: storage/lmgr/lmgr.c:1218 #, c-format msgid "extension of relation %u of database %u" msgstr "utökning av relation %u i databas %u" -#: storage/lmgr/lmgr.c:1218 +#: storage/lmgr/lmgr.c:1224 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid för databas %u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1229 #, c-format msgid "page %u of relation %u of database %u" msgstr "sida %u i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1230 +#: storage/lmgr/lmgr.c:1236 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tuple (%u,%u) i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1244 #, c-format msgid "transaction %u" msgstr "transaktion %u" -#: storage/lmgr/lmgr.c:1243 +#: storage/lmgr/lmgr.c:1249 #, c-format msgid "virtual transaction %d/%u" msgstr "vituell transaktion %d/%u" -#: storage/lmgr/lmgr.c:1249 +#: storage/lmgr/lmgr.c:1255 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulativ token %u för transaktion %u" -#: storage/lmgr/lmgr.c:1255 +#: storage/lmgr/lmgr.c:1261 #, c-format msgid "object %u of class %u of database %u" msgstr "objekt %u av klass %u i databas %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, c-format msgid "user lock [%u,%u,%u]" msgstr "användarlås [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1270 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "rådgivande lås [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1278 +#: storage/lmgr/lmgr.c:1284 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "fjärrtransaktion %u för prenumeration %u i databas %u" -#: storage/lmgr/lmgr.c:1285 +#: storage/lmgr/lmgr.c:1291 #, c-format msgid "unrecognized locktag type %d" msgstr "okänd låsetikettyp %d" @@ -23050,12 +23092,12 @@ msgstr "nedkoppling: sessionstid: %d:%02d:%02d.%03d användare=%s databas=%s vä msgid "bind message has %d result formats but query has %d columns" msgstr "bind-meddelande har %d resultatformat men frågan har %d kolumner" -#: tcop/pquery.c:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "markör kan bara hoppa framåt" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarera den med flaggan SCROLL för att kunna traversera bakåt." @@ -23221,64 +23263,64 @@ msgstr "okänd synonymordboksparameter: \"%s\"" msgid "missing Dictionary parameter" msgstr "saknar ordlistparameter" -#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 -#: tsearch/spell.c:1043 +#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 +#: tsearch/spell.c:1045 #, c-format msgid "invalid affix flag \"%s\"" msgstr "ogiltig affix-flagga \"%s\"" -#: tsearch/spell.c:385 tsearch/spell.c:1047 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "affix-flaggan \"%s\" är utanför giltigt intervall" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "ogiltigt tecken i affix-flagga \"%s\"" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "ogiltig affix-flagga \"%s\" med flaggvärdet \"long\"" -#: tsearch/spell.c:525 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "kunde inte öppna ordboksfil \"%s\": %m" -#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 -#: tsearch/spell.c:1747 tsearch/spell.c:1752 +#: tsearch/spell.c:1173 tsearch/spell.c:1185 tsearch/spell.c:1746 +#: tsearch/spell.c:1751 tsearch/spell.c:1756 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ogiltigt affix-alias \"%s\"" -#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 +#: tsearch/spell.c:1226 tsearch/spell.c:1297 tsearch/spell.c:1446 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "kunde inte öppna affix-fil \"%s\": %m" -#: tsearch/spell.c:1277 +#: tsearch/spell.c:1280 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell-ordbok stöder bara flaggorna \"default\", \"long\" och \"num\"" -#: tsearch/spell.c:1321 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "ogiltigt antal alias i flaggvektor" -#: tsearch/spell.c:1344 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "antalet alias överskriver angivet antal %d" -#: tsearch/spell.c:1559 +#: tsearch/spell.c:1562 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "affix-fil innehåller kommandon på gammalt och nytt format" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:275 utils/adt/tsvector_op.c:1128 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "strängen är för lång för tsvector (%d byte, max %d byte)" @@ -23350,37 +23392,37 @@ msgstr "MaxFragments skall vara >= 0" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "kunde inte radera permanent statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1258 +#: utils/activity/pgstat.c:1257 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ogiltig statistiktyp \"%s\"" -#: utils/activity/pgstat.c:1338 +#: utils/activity/pgstat.c:1337 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1458 +#: utils/activity/pgstat.c:1457 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1467 +#: utils/activity/pgstat.c:1466 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "kunde inte stänga temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1475 +#: utils/activity/pgstat.c:1474 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om temporär statistikfil \"%s\" till \"%s\": %m" -#: utils/activity/pgstat.c:1524 +#: utils/activity/pgstat.c:1523 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "kunde inte öppna statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1686 +#: utils/activity/pgstat.c:1685 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "korrupt statistikfil \"%s\"" @@ -23395,102 +23437,102 @@ msgstr "funktionsanrop till borttagen funktion" msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "återställer existerande statistik för typ %s, db=%u, oid=%u" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/adt/acl.c:194 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifieraren för lång" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:195 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Identifierare måste vara mindre än %d tecken." -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:283 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "okänt nyckelord: \"%s\"" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:284 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-nyckelord måste vara \"group\" eller \"user\"." -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:292 #, c-format msgid "missing name" msgstr "namn saknas" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:293 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Ett namn måste följa efter nyckelorden \"group\" resp. \"user\"." -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, c-format msgid "missing \"=\" sign" msgstr "saknar \"=\"-tecken" -#: utils/adt/acl.c:341 +#: utils/adt/acl.c:358 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ogiltigt lägestecken: måste vara en av \"%s\"" -#: utils/adt/acl.c:371 +#: utils/adt/acl.c:388 #, c-format msgid "a name must follow the \"/\" sign" msgstr "ett namn måste följa på tecknet \"/\"" -#: utils/adt/acl.c:383 +#: utils/adt/acl.c:400 #, c-format msgid "defaulting grantor to user ID %u" msgstr "sätter fullmaktsgivaranvändar-ID till standardvärdet %u" -#: utils/adt/acl.c:569 +#: utils/adt/acl.c:586 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-array innehåller fel datatyp" -#: utils/adt/acl.c:573 +#: utils/adt/acl.c:590 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-array:er måste vara endimensionella" -#: utils/adt/acl.c:577 +#: utils/adt/acl.c:594 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-array:er får inte innehålla null-värden" -#: utils/adt/acl.c:606 +#: utils/adt/acl.c:623 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "skräp vid slutet av ACL-angivelse" -#: utils/adt/acl.c:1248 +#: utils/adt/acl.c:1265 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "fullmaksgivarflaggor kan inte ges tillbaka till den som givit det till dig" -#: utils/adt/acl.c:1564 +#: utils/adt/acl.c:1581 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert stöds inte länge" -#: utils/adt/acl.c:1574 +#: utils/adt/acl.c:1591 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove stöds inte längre" -#: utils/adt/acl.c:1693 +#: utils/adt/acl.c:1710 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "okänd privilegietyp: \"%s\"" -#: utils/adt/acl.c:3476 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3493 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "funktionen \"%s\" finns inte" -#: utils/adt/acl.c:5023 +#: utils/adt/acl.c:5040 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "måste kunna utföra SET ROLE \"%s\"" @@ -23516,7 +23558,7 @@ msgstr "indatatyp är inte en array" #: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 #: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 #: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 -#: utils/adt/int8.c:1272 utils/adt/numeric.c:1916 utils/adt/numeric.c:4403 +#: utils/adt/int8.c:1272 utils/adt/numeric.c:1917 utils/adt/numeric.c:4404 #: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 #: utils/adt/varlena.c:3134 @@ -23664,7 +23706,7 @@ msgid "Junk after closing right brace." msgstr "Skräp efter avslutande höger parentes." #: utils/adt/arrayfuncs.c:1326 utils/adt/arrayfuncs.c:3535 -#: utils/adt/arrayfuncs.c:6136 +#: utils/adt/arrayfuncs.c:6138 #, c-format msgid "invalid number of dimensions: %d" msgstr "felaktigt antal dimensioner: %d" @@ -23703,8 +23745,8 @@ msgstr "slice av fixlängd-array är inte implementerat" #: utils/adt/arrayfuncs.c:2281 utils/adt/arrayfuncs.c:2303 #: utils/adt/arrayfuncs.c:2352 utils/adt/arrayfuncs.c:2606 -#: utils/adt/arrayfuncs.c:2951 utils/adt/arrayfuncs.c:6122 -#: utils/adt/arrayfuncs.c:6148 utils/adt/arrayfuncs.c:6159 +#: utils/adt/arrayfuncs.c:2951 utils/adt/arrayfuncs.c:6124 +#: utils/adt/arrayfuncs.c:6150 utils/adt/arrayfuncs.c:6161 #: utils/adt/json.c:1511 utils/adt/json.c:1583 utils/adt/jsonb.c:1416 #: utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 #: utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 @@ -23781,42 +23823,42 @@ msgstr "kan inte ackumulera null-array:er" msgid "cannot accumulate empty arrays" msgstr "kan inte ackumulera tomma array:er" -#: utils/adt/arrayfuncs.c:6020 utils/adt/arrayfuncs.c:6060 +#: utils/adt/arrayfuncs.c:6022 utils/adt/arrayfuncs.c:6062 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "dimensionsarray eller undre gränsarray kan inte vara null" -#: utils/adt/arrayfuncs.c:6123 utils/adt/arrayfuncs.c:6149 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arrayfuncs.c:6151 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensionsarray måste vara endimensionell." -#: utils/adt/arrayfuncs.c:6128 utils/adt/arrayfuncs.c:6154 +#: utils/adt/arrayfuncs.c:6130 utils/adt/arrayfuncs.c:6156 #, c-format msgid "dimension values cannot be null" msgstr "dimensionsvärden kan inte vara null" -#: utils/adt/arrayfuncs.c:6160 +#: utils/adt/arrayfuncs.c:6162 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Undre arraygräns har annan storlek än dimensionsarray." -#: utils/adt/arrayfuncs.c:6438 +#: utils/adt/arrayfuncs.c:6440 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "borttagning av element från en multidimensionell array stöds inte" -#: utils/adt/arrayfuncs.c:6715 +#: utils/adt/arrayfuncs.c:6717 #, c-format msgid "thresholds must be one-dimensional array" msgstr "gränsvärden måste vara en endimensionell array" -#: utils/adt/arrayfuncs.c:6720 +#: utils/adt/arrayfuncs.c:6722 #, c-format msgid "thresholds array must not contain NULLs" msgstr "gränsvärdesarray får inte innehålla NULLL-värden" -#: utils/adt/arrayfuncs.c:6953 +#: utils/adt/arrayfuncs.c:6955 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "antal element att trimma måste vara mellan 0 och %d" @@ -23865,8 +23907,8 @@ msgstr "kodningskonvertering från %s till ASCII stöds inte" #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 #: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 -#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7151 -#: utils/adt/numeric.c:7354 utils/adt/numeric.c:8301 utils/adt/numutils.c:357 +#: utils/adt/network.c:99 utils/adt/numeric.c:802 utils/adt/numeric.c:7152 +#: utils/adt/numeric.c:7355 utils/adt/numeric.c:8302 utils/adt/numutils.c:357 #: utils/adt/numutils.c:619 utils/adt/numutils.c:881 utils/adt/numutils.c:920 #: utils/adt/numutils.c:942 utils/adt/numutils.c:1006 utils/adt/numutils.c:1028 #: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 @@ -23887,10 +23929,10 @@ msgstr "money utanför giltigt intervall" #: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 #: utils/adt/int8.c:515 utils/adt/int8.c:573 utils/adt/int8.c:958 #: utils/adt/int8.c:1038 utils/adt/int8.c:1100 utils/adt/int8.c:1180 -#: utils/adt/numeric.c:3190 utils/adt/numeric.c:3213 utils/adt/numeric.c:3298 -#: utils/adt/numeric.c:3316 utils/adt/numeric.c:3412 utils/adt/numeric.c:8850 -#: utils/adt/numeric.c:9163 utils/adt/numeric.c:9511 utils/adt/numeric.c:9627 -#: utils/adt/numeric.c:11138 utils/adt/timestamp.c:3442 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8851 +#: utils/adt/numeric.c:9164 utils/adt/numeric.c:9512 utils/adt/numeric.c:9628 +#: utils/adt/numeric.c:11139 utils/adt/timestamp.c:3442 #, c-format msgid "division by zero" msgstr "division med noll" @@ -23937,7 +23979,7 @@ msgid "date out of range: \"%s\"" msgstr "datum utanför giltigt intervall \"%s\"" #: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 -#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2533 +#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2535 #, c-format msgid "date out of range" msgstr "datum utanför giltigt intervall" @@ -24008,8 +24050,8 @@ msgstr "enheten \"%s\" känns inte igen för typen %s" #: utils/adt/timestamp.c:5609 utils/adt/timestamp.c:5696 #: utils/adt/timestamp.c:5737 utils/adt/timestamp.c:5741 #: utils/adt/timestamp.c:5795 utils/adt/timestamp.c:5799 -#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2555 -#: utils/adt/xml.c:2562 utils/adt/xml.c:2582 utils/adt/xml.c:2589 +#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5839 utils/adt/xml.c:2557 +#: utils/adt/xml.c:2564 utils/adt/xml.c:2584 utils/adt/xml.c:2591 #, c-format msgid "timestamp out of range" msgstr "timestamp utanför giltigt intervall" @@ -24026,7 +24068,7 @@ msgstr "time-värde utanför giltigt område: %d:%02d:%02g" #: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 #: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 -#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2594 +#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2595 #: utils/adt/timestamp.c:3513 utils/adt/timestamp.c:3540 #: utils/adt/timestamp.c:3571 #, c-format @@ -24199,34 +24241,34 @@ msgstr "\"%s\" är utanför giltigt intervall för typen double precision" #: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 #: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 #: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 -#: utils/adt/int8.c:1293 utils/adt/numeric.c:4515 utils/adt/numeric.c:4520 +#: utils/adt/int8.c:1293 utils/adt/numeric.c:4516 utils/adt/numeric.c:4521 #, c-format msgid "smallint out of range" msgstr "smallint utanför sitt intervall" -#: utils/adt/float.c:1453 utils/adt/numeric.c:3708 utils/adt/numeric.c:10042 +#: utils/adt/float.c:1453 utils/adt/numeric.c:3709 utils/adt/numeric.c:10043 #, c-format msgid "cannot take square root of a negative number" msgstr "kan inte ta kvadratroten av ett negativt tal" -#: utils/adt/float.c:1521 utils/adt/numeric.c:3996 utils/adt/numeric.c:4108 +#: utils/adt/float.c:1521 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "noll upphöjt med ett negativt tal är odefinierat" -#: utils/adt/float.c:1525 utils/adt/numeric.c:4000 utils/adt/numeric.c:10933 +#: utils/adt/float.c:1525 utils/adt/numeric.c:4001 utils/adt/numeric.c:10934 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "ett negativt tal upphöjt i en icke-negativ potens ger ett komplext resultat" -#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3908 -#: utils/adt/numeric.c:10713 +#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10714 #, c-format msgid "cannot take logarithm of zero" msgstr "kan inte ta logartimen av noll" -#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3846 -#: utils/adt/numeric.c:3903 utils/adt/numeric.c:10717 +#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10718 #, c-format msgid "cannot take logarithm of a negative number" msgstr "kan inte ta logaritmen av ett negativt tal" @@ -24245,22 +24287,22 @@ msgstr "indata är utanför giltigt intervall" msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "setseed-parameter %g är utanför giltigt intervall [-1,1]" -#: utils/adt/float.c:4095 utils/adt/numeric.c:1856 +#: utils/adt/float.c:4095 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "antal måste vara större än noll" -#: utils/adt/float.c:4100 utils/adt/numeric.c:1867 +#: utils/adt/float.c:4100 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "operand, undre gräns och övre gräns kan inte vara NaN" -#: utils/adt/float.c:4106 utils/adt/numeric.c:1872 +#: utils/adt/float.c:4106 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "undre och övre gräns måste vara ändliga" -#: utils/adt/float.c:4172 utils/adt/numeric.c:1886 +#: utils/adt/float.c:4172 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "undre gräns kan inte vara samma som övre gräns" @@ -24630,7 +24672,7 @@ msgstr "stegstorleken kan inte vara noll" #: utils/adt/int8.c:1010 utils/adt/int8.c:1024 utils/adt/int8.c:1057 #: utils/adt/int8.c:1071 utils/adt/int8.c:1085 utils/adt/int8.c:1116 #: utils/adt/int8.c:1138 utils/adt/int8.c:1152 utils/adt/int8.c:1166 -#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4474 +#: utils/adt/int8.c:1328 utils/adt/int8.c:1363 utils/adt/numeric.c:4475 #: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 #: utils/adt/varbit.c:1676 #, c-format @@ -24684,7 +24726,7 @@ msgstr "array:en måste ha två kolumner" msgid "mismatched array dimensions" msgstr "array-dimensionerna stämmer inte" -#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1958 +#: utils/adt/json.c:1778 utils/adt/jsonb_util.c:1964 #, c-format msgid "duplicate JSON object key value" msgstr "duplicerat nyckelvärde i JSON objekt" @@ -24749,23 +24791,23 @@ msgstr "kan inte typomvandla jsonb-objekt till typ %s" msgid "cannot cast jsonb array or object to type %s" msgstr "kan inte typomvandla jsonb-array eller objekt till typ %s" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:755 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-objektpar överskrider det maximalt tillåtna (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:796 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-array-element överskrider det maximalt tillåtna (%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1679 utils/adt/jsonb_util.c:1699 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "total storleken på element i jsonb-array överskrider maximala %d byte" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1760 utils/adt/jsonb_util.c:1795 +#: utils/adt/jsonb_util.c:1815 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "total storleken på element i jsonb-objekt överskrider maximala %d byte" @@ -25173,12 +25215,12 @@ msgstr "ickedeterministiska jämförelser (collation) stöds inte för ILIKE" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-mönster för inte sluta med ett escape-tecken" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "ogiltig escape-sträng" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "Escape-sträng måste vara tom eller ett tecken." @@ -25389,10 +25431,10 @@ msgstr "resultatet är utanför giltigt intervall" msgid "cannot subtract inet values of different sizes" msgstr "kan inte subtrahera inet-värden av olika storlek" -#: utils/adt/numeric.c:792 utils/adt/numeric.c:3658 utils/adt/numeric.c:7146 -#: utils/adt/numeric.c:7349 utils/adt/numeric.c:7821 utils/adt/numeric.c:10516 -#: utils/adt/numeric.c:10991 utils/adt/numeric.c:11085 -#: utils/adt/numeric.c:11220 +#: utils/adt/numeric.c:792 utils/adt/numeric.c:3659 utils/adt/numeric.c:7147 +#: utils/adt/numeric.c:7350 utils/adt/numeric.c:7822 utils/adt/numeric.c:10517 +#: utils/adt/numeric.c:10992 utils/adt/numeric.c:11086 +#: utils/adt/numeric.c:11221 #, c-format msgid "value overflows numeric format" msgstr "overflow på värde i formatet numeric" @@ -25457,39 +25499,39 @@ msgstr "stegstorlek får inte vara NaN" msgid "step size cannot be infinity" msgstr "stegstorlek får inte vara oändligt" -#: utils/adt/numeric.c:3648 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "fakultet av ett negativt tal är odefinierat" -#: utils/adt/numeric.c:4381 utils/adt/numeric.c:4461 utils/adt/numeric.c:4502 -#: utils/adt/numeric.c:4698 +#: utils/adt/numeric.c:4382 utils/adt/numeric.c:4462 utils/adt/numeric.c:4503 +#: utils/adt/numeric.c:4699 #, c-format msgid "cannot convert NaN to %s" msgstr "kan inte konvertera NaN till %s" -#: utils/adt/numeric.c:4385 utils/adt/numeric.c:4465 utils/adt/numeric.c:4506 -#: utils/adt/numeric.c:4702 +#: utils/adt/numeric.c:4386 utils/adt/numeric.c:4466 utils/adt/numeric.c:4507 +#: utils/adt/numeric.c:4703 #, c-format msgid "cannot convert infinity to %s" msgstr "kan inte konvertera oändlighet till %s" -#: utils/adt/numeric.c:4711 +#: utils/adt/numeric.c:4712 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn är utanför giltigt intervall" -#: utils/adt/numeric.c:7911 utils/adt/numeric.c:7962 +#: utils/adt/numeric.c:7912 utils/adt/numeric.c:7963 #, c-format msgid "numeric field overflow" msgstr "overflow i numeric-fält" -#: utils/adt/numeric.c:7912 +#: utils/adt/numeric.c:7913 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ett fält med precision %d, skala %d måste avrundas till ett absolut värde mindre än %s%d." -#: utils/adt/numeric.c:7963 +#: utils/adt/numeric.c:7964 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Ett fält med precision %d, skala %d kan inte innehålla ett oändligt värde." @@ -25787,7 +25829,7 @@ msgstr "För många komman." msgid "Junk after right parenthesis or bracket." msgstr "Skräp efter höger parentes eller hakparentes." -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:2023 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "reguljärt uttryck misslyckades: %s" @@ -25802,33 +25844,33 @@ msgstr "ogiltigt flagga till reguljärt uttryck: \"%.*s\"" msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Om du menade att använda regexp_replace() med en startstartparameter så cast:a fjärde argumentet uttryckligen till integer." -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 -#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 -#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 -#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1109 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1182 utils/adt/regexp.c:1191 +#: utils/adt/regexp.c:1200 utils/adt/regexp.c:1880 utils/adt/regexp.c:1889 +#: utils/adt/regexp.c:1898 utils/misc/guc.c:6674 utils/misc/guc.c:6708 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ogiltigt värde för parameter \"%s\": %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:940 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "Regulart uttryck i SQL får inte innehålla mer än två dubbelcitat-escape-separatorer" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 -#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 -#: utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1120 utils/adt/regexp.c:1211 utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1337 utils/adt/regexp.c:1725 utils/adt/regexp.c:1780 +#: utils/adt/regexp.c:1909 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s stöder inte \"global\"-flaggan" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1339 #, c-format msgid "Use the regexp_matches function instead." msgstr "Använd regexp_matches-funktionen istället." -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1527 #, c-format msgid "too many regular expression matches" msgstr "för många reguljära uttryck matchar" @@ -25843,8 +25885,8 @@ msgstr "mer än en funktion med namn %s" msgid "more than one operator named %s" msgstr "mer än en operator med namn %s" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10103 -#: utils/adt/ruleutils.c:10316 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10120 +#: utils/adt/ruleutils.c:10333 #, c-format msgid "too many arguments" msgstr "för många argument" @@ -26227,12 +26269,12 @@ msgstr "array med vikter får inte innehålla null-värden" msgid "weight out of range" msgstr "vikten är utanför giltigt intervall" -#: utils/adt/tsvector.c:217 +#: utils/adt/tsvector.c:214 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "ordet är för långt (%ld byte, max %ld byte)" -#: utils/adt/tsvector.c:224 +#: utils/adt/tsvector.c:221 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "strängen är för lång för tsvector (%ld byte, max %ld byte)" @@ -26529,136 +26571,136 @@ msgstr "ogiltigt XML-kommentar" msgid "not an XML document" msgstr "inget XML-dokument" -#: utils/adt/xml.c:987 utils/adt/xml.c:1010 +#: utils/adt/xml.c:999 utils/adt/xml.c:1022 #, c-format msgid "invalid XML processing instruction" msgstr "ogiltig XML-processinstruktion" -#: utils/adt/xml.c:988 +#: utils/adt/xml.c:1000 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML-processinstruktions målnamn kan inte vara \"%s\"." -#: utils/adt/xml.c:1011 +#: utils/adt/xml.c:1023 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-processinstruktion kan inte innehålla \"?>\"." -#: utils/adt/xml.c:1090 +#: utils/adt/xml.c:1102 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate är inte implementerat" -#: utils/adt/xml.c:1146 +#: utils/adt/xml.c:1158 #, c-format msgid "could not initialize XML library" msgstr "kunde inte initiera XML-bibliotek" -#: utils/adt/xml.c:1147 +#: utils/adt/xml.c:1159 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 har inkompatibel char-typ: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1233 +#: utils/adt/xml.c:1245 #, c-format msgid "could not set up XML error handler" msgstr "kunde inte ställa in XML-felhanterare" -#: utils/adt/xml.c:1234 +#: utils/adt/xml.c:1246 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Detta tyder på att libxml2-versionen som används inte är kompatibel med libxml2-header-filerna som PostgreSQL byggts med." -#: utils/adt/xml.c:2262 +#: utils/adt/xml.c:2264 msgid "Invalid character value." msgstr "Ogiltigt teckenvärde." -#: utils/adt/xml.c:2265 +#: utils/adt/xml.c:2267 msgid "Space required." msgstr "Mellanslag krävs." -#: utils/adt/xml.c:2268 +#: utils/adt/xml.c:2270 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone tillåter bara 'yes' eller 'no'." -#: utils/adt/xml.c:2271 +#: utils/adt/xml.c:2273 msgid "Malformed declaration: missing version." msgstr "Felaktig deklaration: saknar version." -#: utils/adt/xml.c:2274 +#: utils/adt/xml.c:2276 msgid "Missing encoding in text declaration." msgstr "Saknar kodning i textdeklaration." -#: utils/adt/xml.c:2277 +#: utils/adt/xml.c:2279 msgid "Parsing XML declaration: '?>' expected." msgstr "Parsar XML-deklaration: förväntade sig '?>'" -#: utils/adt/xml.c:2280 +#: utils/adt/xml.c:2282 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Okänd libxml-felkod: %d." -#: utils/adt/xml.c:2534 +#: utils/adt/xml.c:2536 #, c-format msgid "XML does not support infinite date values." msgstr "XML stöder inte oändliga datumvärden." -#: utils/adt/xml.c:2556 utils/adt/xml.c:2583 +#: utils/adt/xml.c:2558 utils/adt/xml.c:2585 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML stöder inte oändliga timestamp-värden." -#: utils/adt/xml.c:2999 +#: utils/adt/xml.c:3001 #, c-format msgid "invalid query" msgstr "ogiltig fråga" -#: utils/adt/xml.c:3091 +#: utils/adt/xml.c:3093 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "portalen \"%s\" returnerar inga tupler" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4345 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ogiltig array till XML-namnrymdmappning" -#: utils/adt/xml.c:4344 +#: utils/adt/xml.c:4346 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Arrayen måste vara tvådimensionell där längden på andra axeln är 2." -#: utils/adt/xml.c:4368 +#: utils/adt/xml.c:4370 #, c-format msgid "empty XPath expression" msgstr "tomt XPath-uttryck" -#: utils/adt/xml.c:4420 +#: utils/adt/xml.c:4422 #, c-format msgid "neither namespace name nor URI may be null" msgstr "varken namnrymdnamn eller URI får vara null" -#: utils/adt/xml.c:4427 +#: utils/adt/xml.c:4429 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "kunde inte registrera XML-namnrymd med namn \"%s\" och URL \"%s\"" -#: utils/adt/xml.c:4776 +#: utils/adt/xml.c:4778 #, c-format msgid "DEFAULT namespace is not supported" msgstr "namnrymden DEFAULT stöds inte" -#: utils/adt/xml.c:4805 +#: utils/adt/xml.c:4807 #, c-format msgid "row path filter must not be empty string" msgstr "sökvägsfilter för rad får inte vara tomma strängen" -#: utils/adt/xml.c:4839 +#: utils/adt/xml.c:4841 #, c-format msgid "column path filter must not be empty string" msgstr "sokvägsfilter för kolumn får inte vara tomma strängen" -#: utils/adt/xml.c:4986 +#: utils/adt/xml.c:4988 #, c-format msgid "more than one value returned by column XPath expression" msgstr "mer än ett värde returnerades från kolumns XPath-uttryck" @@ -27403,7 +27445,7 @@ msgstr "bind_textdomain_codeset misslyckades" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ogiltigt byte-sekvens för kodning \"%s\": %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1766 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "tecken med byte-sekvens %s i kodning \"%s\" har inget motsvarande i kodning \"%s\"" @@ -27564,7 +27606,7 @@ msgid "parameter \"%s\" cannot be changed now" msgstr "parameter \"%s\" kan inte ändras nu" #: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 -#: utils/misc/guc.c:6604 +#: utils/misc/guc.c:6610 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "rättighet saknas för att sätta parameter \"%s\"" @@ -27644,7 +27686,7 @@ msgstr "parameter \"%s\" kunde inte sättas" msgid "could not parse setting for parameter \"%s\"" msgstr "kunde inte tolka inställningen för parameter \"%s\"" -#: utils/misc/guc.c:6736 +#: utils/misc/guc.c:6742 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ogiltigt värde för parameter \"%s\": %g" @@ -27703,7 +27745,7 @@ msgstr "Resursanvändning / Disk" #: utils/misc/guc_tables.c:679 msgid "Resource Usage / Kernel Resources" -msgstr "Resursanvändning / Kärnresurser" +msgstr "Resursanvändning / Kernel-resurser" #: utils/misc/guc_tables.c:681 msgid "Resource Usage / Cost-Based Vacuum Delay" diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po index 69f256a36de..8e7f2646558 100644 --- a/src/bin/pg_dump/po/ru.po +++ b/src/bin/pg_dump/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2025-05-03 16:33+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -177,229 +177,229 @@ msgstr "неверное значение \"%s\" для параметра %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" -#: common.c:132 +#: common.c:133 #, c-format msgid "reading extensions" msgstr "чтение расширений" -#: common.c:135 +#: common.c:136 #, c-format msgid "identifying extension members" msgstr "выявление членов расширений" -#: common.c:138 +#: common.c:139 #, c-format msgid "reading schemas" msgstr "чтение схем" -#: common.c:147 +#: common.c:148 #, c-format msgid "reading user-defined tables" msgstr "чтение пользовательских таблиц" -#: common.c:152 +#: common.c:153 #, c-format msgid "reading user-defined functions" msgstr "чтение пользовательских функций" -#: common.c:156 +#: common.c:157 #, c-format msgid "reading user-defined types" msgstr "чтение пользовательских типов" -#: common.c:160 +#: common.c:161 #, c-format msgid "reading procedural languages" msgstr "чтение процедурных языков" -#: common.c:163 +#: common.c:164 #, c-format msgid "reading user-defined aggregate functions" msgstr "чтение пользовательских агрегатных функций" -#: common.c:166 +#: common.c:167 #, c-format msgid "reading user-defined operators" msgstr "чтение пользовательских операторов" -#: common.c:169 +#: common.c:170 #, c-format msgid "reading user-defined access methods" msgstr "чтение пользовательских методов доступа" -#: common.c:172 +#: common.c:173 #, c-format msgid "reading user-defined operator classes" msgstr "чтение пользовательских классов операторов" -#: common.c:175 +#: common.c:176 #, c-format msgid "reading user-defined operator families" msgstr "чтение пользовательских семейств операторов" -#: common.c:178 +#: common.c:179 #, c-format msgid "reading user-defined text search parsers" msgstr "чтение пользовательских анализаторов текстового поиска" -#: common.c:181 +#: common.c:182 #, c-format msgid "reading user-defined text search templates" msgstr "чтение пользовательских шаблонов текстового поиска" -#: common.c:184 +#: common.c:185 #, c-format msgid "reading user-defined text search dictionaries" msgstr "чтение пользовательских словарей текстового поиска" -#: common.c:187 +#: common.c:188 #, c-format msgid "reading user-defined text search configurations" msgstr "чтение пользовательских конфигураций текстового поиска" -#: common.c:190 +#: common.c:191 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "чтение пользовательских оболочек сторонних данных" -#: common.c:193 +#: common.c:194 #, c-format msgid "reading user-defined foreign servers" msgstr "чтение пользовательских сторонних серверов" -#: common.c:196 +#: common.c:197 #, c-format msgid "reading default privileges" msgstr "чтение прав по умолчанию" -#: common.c:199 +#: common.c:200 #, c-format msgid "reading user-defined collations" msgstr "чтение пользовательских правил сортировки" -#: common.c:202 +#: common.c:203 #, c-format msgid "reading user-defined conversions" msgstr "чтение пользовательских преобразований" -#: common.c:205 +#: common.c:206 #, c-format msgid "reading type casts" msgstr "чтение приведений типов" -#: common.c:208 +#: common.c:209 #, c-format msgid "reading transforms" msgstr "чтение преобразований" -#: common.c:211 +#: common.c:212 #, c-format msgid "reading table inheritance information" msgstr "чтение информации о наследовании таблиц" -#: common.c:214 +#: common.c:215 #, c-format msgid "reading event triggers" msgstr "чтение событийных триггеров" -#: common.c:218 +#: common.c:219 #, c-format msgid "finding extension tables" msgstr "поиск таблиц расширений" -#: common.c:222 +#: common.c:223 #, c-format msgid "finding inheritance relationships" msgstr "поиск связей наследования" -#: common.c:225 +#: common.c:226 #, c-format msgid "reading column info for interesting tables" msgstr "чтение информации о столбцах интересующих таблиц" -#: common.c:228 +#: common.c:229 #, c-format msgid "flagging inherited columns in subtables" msgstr "пометка наследованных столбцов в подтаблицах" -#: common.c:231 +#: common.c:232 #, c-format msgid "reading partitioning data" msgstr "чтение информации о секционировании" -#: common.c:234 +#: common.c:235 #, c-format msgid "reading indexes" msgstr "чтение индексов" -#: common.c:237 +#: common.c:238 #, c-format msgid "flagging indexes in partitioned tables" msgstr "пометка индексов в секционированных таблицах" -#: common.c:240 +#: common.c:241 #, c-format msgid "reading extended statistics" msgstr "чтение расширенной статистики" -#: common.c:243 +#: common.c:244 #, c-format msgid "reading constraints" msgstr "чтение ограничений" -#: common.c:246 +#: common.c:247 #, c-format msgid "reading triggers" msgstr "чтение триггеров" -#: common.c:249 +#: common.c:250 #, c-format msgid "reading rewrite rules" msgstr "чтение правил перезаписи" -#: common.c:252 +#: common.c:253 #, c-format msgid "reading policies" msgstr "чтение политик" -#: common.c:255 +#: common.c:256 #, c-format msgid "reading publications" msgstr "чтение публикаций" -#: common.c:258 +#: common.c:259 #, c-format msgid "reading publication membership of tables" msgstr "чтение информации о таблицах, включённых в публикации" -#: common.c:261 +#: common.c:262 #, c-format msgid "reading publication membership of schemas" msgstr "чтение информации о схемах, включённых в публикации" -#: common.c:264 +#: common.c:265 #, c-format msgid "reading subscriptions" msgstr "чтение подписок" -#: common.c:327 +#: common.c:328 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "" "нарушение целостности: родительская таблица с OID %u для таблицы \"%s\" (OID " "%u) не найдена" -#: common.c:369 +#: common.c:370 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "неверное число родителей (%d) для таблицы \"%s\"" -#: common.c:1049 +#: common.c:1068 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не удалось разобрать числовой массив \"%s\": слишком много чисел" -#: common.c:1061 +#: common.c:1080 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не удалось разобрать числовой массив \"%s\": неверный символ в числе" @@ -718,7 +718,7 @@ msgstr "восстановление большого объекта с OID %u" msgid "could not create large object %u: %s" msgstr "не удалось создать большой объект %u: %s" -#: pg_backup_archiver.c:1386 pg_dump.c:3766 +#: pg_backup_archiver.c:1386 pg_dump.c:3773 #, c-format msgid "could not open large object %u: %s" msgstr "не удалось открыть большой объект %u: %s" @@ -1153,8 +1153,8 @@ msgstr "не удалось переподключиться к базе" msgid "reconnection failed: %s" msgstr "переподключиться не удалось: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:757 pg_dump_sort.c:1280 -#: pg_dump_sort.c:1300 pg_dumpall.c:1735 pg_dumpall.c:1819 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:757 pg_dump_sort.c:1491 +#: pg_dump_sort.c:1511 pg_dumpall.c:1735 pg_dumpall.c:1819 #, c-format msgid "%s" msgstr "%s" @@ -1202,7 +1202,7 @@ msgstr "ошибка в PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "сбой команды COPY для таблицы \"%s\": %s" -#: pg_backup_db.c:521 pg_dump.c:2237 +#: pg_backup_db.c:521 pg_dump.c:2244 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неожиданные лишние результаты получены при COPY для таблицы \"%s\"" @@ -2065,115 +2065,115 @@ msgstr "В данный момент вы не подключены к базе msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: pg_dump.c:2108 +#: pg_dump.c:2115 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "выгрузка содержимого таблицы \"%s.%s\"" -#: pg_dump.c:2218 +#: pg_dump.c:2225 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetCopyData()." -#: pg_dump.c:2219 pg_dump.c:2229 +#: pg_dump.c:2226 pg_dump.c:2236 #, c-format msgid "Error message from server: %s" msgstr "Сообщение об ошибке с сервера: %s" # skip-rule: language-mix -#: pg_dump.c:2220 pg_dump.c:2230 +#: pg_dump.c:2227 pg_dump.c:2237 #, c-format msgid "Command was: %s" msgstr "Выполнялась команда: %s" -#: pg_dump.c:2228 +#: pg_dump.c:2235 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetResult()." -#: pg_dump.c:2319 +#: pg_dump.c:2326 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "из таблицы \"%s\" получено неверное количество полей" -#: pg_dump.c:3021 +#: pg_dump.c:3028 #, c-format msgid "saving database definition" msgstr "сохранение определения базы данных" -#: pg_dump.c:3126 +#: pg_dump.c:3133 #, c-format msgid "unrecognized locale provider: %s" msgstr "нераспознанный провайдер локали: %s" -#: pg_dump.c:3477 +#: pg_dump.c:3484 #, c-format msgid "saving encoding = %s" msgstr "сохранение кодировки (%s)" -#: pg_dump.c:3502 +#: pg_dump.c:3509 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "сохранение standard_conforming_strings (%s)" -#: pg_dump.c:3541 +#: pg_dump.c:3548 #, c-format msgid "could not parse result of current_schemas()" msgstr "не удалось разобрать результат current_schemas()" -#: pg_dump.c:3560 +#: pg_dump.c:3567 #, c-format msgid "saving search_path = %s" msgstr "сохранение search_path = %s" -#: pg_dump.c:3597 +#: pg_dump.c:3604 #, c-format msgid "reading large objects" msgstr "чтение больших объектов" -#: pg_dump.c:3735 +#: pg_dump.c:3742 #, c-format msgid "saving large objects" msgstr "сохранение больших объектов" -#: pg_dump.c:3776 +#: pg_dump.c:3783 #, c-format msgid "error reading large object %u: %s" msgstr "ошибка чтения большого объекта %u: %s" -#: pg_dump.c:3882 +#: pg_dump.c:3889 #, c-format msgid "reading row-level security policies" msgstr "чтение политик защиты на уровне строк" -#: pg_dump.c:4023 +#: pg_dump.c:4030 #, c-format msgid "unexpected policy command type: %c" msgstr "нераспознанный тип команды в политике: %c" -#: pg_dump.c:4473 pg_dump.c:4839 pg_dump.c:12072 pg_dump.c:17997 -#: pg_dump.c:17999 pg_dump.c:18620 +#: pg_dump.c:4480 pg_dump.c:4846 pg_dump.c:12111 pg_dump.c:18052 +#: pg_dump.c:18054 pg_dump.c:18675 #, c-format msgid "could not parse %s array" msgstr "не удалось разобрать массив %s" -#: pg_dump.c:4684 +#: pg_dump.c:4691 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "" "подписки не выгружены, так как текущий пользователь не суперпользователь" -#: pg_dump.c:5231 +#: pg_dump.c:5238 #, c-format msgid "could not find parent extension for %s %s" msgstr "не удалось найти родительское расширение для %s %s" -#: pg_dump.c:5376 +#: pg_dump.c:5383 #, c-format msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: pg_dump.c:6858 pg_dump.c:17261 +#: pg_dump.c:6892 pg_dump.c:17316 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " @@ -2182,7 +2182,7 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу " "последовательности с OID %u" -#: pg_dump.c:7003 +#: pg_dump.c:7037 #, c-format msgid "" "failed sanity check, table OID %u appearing in pg_partitioned_table not found" @@ -2190,18 +2190,18 @@ msgstr "" "нарушение целостности: таблица с OID %u, фигурирующим в " "pg_partitioned_table, не найдена" -#: pg_dump.c:7234 pg_dump.c:7505 pg_dump.c:7976 pg_dump.c:8640 pg_dump.c:8759 -#: pg_dump.c:8907 +#: pg_dump.c:7268 pg_dump.c:7539 pg_dump.c:8010 pg_dump.c:8674 pg_dump.c:8793 +#: pg_dump.c:8941 #, c-format msgid "unrecognized table OID %u" msgstr "нераспознанный OID таблицы %u" -#: pg_dump.c:7238 +#: pg_dump.c:7272 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неожиданно получены данные индекса для таблицы \"%s\"" -#: pg_dump.c:7737 +#: pg_dump.c:7771 #, c-format msgid "" "failed sanity check, parent table with OID %u of pg_rewrite entry with OID " @@ -2210,7 +2210,7 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу для " "записи pg_rewrite с OID %u" -#: pg_dump.c:8028 +#: pg_dump.c:8062 #, c-format msgid "" "query produced null referenced table name for foreign key trigger \"%s\" on " @@ -2219,32 +2219,32 @@ msgstr "" "запрос выдал NULL вместо имени целевой таблицы для триггера внешнего ключа " "\"%s\" в таблице \"%s\" (OID целевой таблицы: %u)" -#: pg_dump.c:8644 +#: pg_dump.c:8678 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неожиданно получены данные столбцов для таблицы \"%s\"" -#: pg_dump.c:8673 +#: pg_dump.c:8707 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неверная нумерация столбцов в таблице \"%s\"" -#: pg_dump.c:8721 +#: pg_dump.c:8755 #, c-format msgid "finding table default expressions" msgstr "поиск выражений по умолчанию для таблиц" -#: pg_dump.c:8763 +#: pg_dump.c:8797 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неверное значение adnum (%d) в таблице \"%s\"" -#: pg_dump.c:8857 +#: pg_dump.c:8891 #, c-format msgid "finding table check constraints" msgstr "поиск ограничений-проверок для таблиц" -#: pg_dump.c:8911 +#: pg_dump.c:8945 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" @@ -2255,54 +2255,54 @@ msgstr[1] "" msgstr[2] "" "ожидалось %d ограничений-проверок для таблицы \"%s\", но найдено: %d" -#: pg_dump.c:8915 +#: pg_dump.c:8949 #, c-format msgid "The system catalogs might be corrupted." msgstr "Возможно, повреждены системные каталоги." -#: pg_dump.c:9605 +#: pg_dump.c:9639 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: pg_dump.c:9717 pg_dump.c:9746 +#: pg_dump.c:9751 pg_dump.c:9780 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "неподдерживаемая запись в pg_init_privs: %u %u %d" -#: pg_dump.c:10567 +#: pg_dump.c:10601 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный тип типа" # TO REVEIW -#: pg_dump.c:12141 +#: pg_dump.c:12180 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "недопустимое значение provolatile для функции \"%s\"" # TO REVEIW -#: pg_dump.c:12191 pg_dump.c:14073 +#: pg_dump.c:12230 pg_dump.c:14112 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "недопустимое значение proparallel для функции \"%s\"" -#: pg_dump.c:12321 pg_dump.c:12427 pg_dump.c:12434 +#: pg_dump.c:12360 pg_dump.c:12466 pg_dump.c:12473 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не удалось найти определение функции для функции с OID %u" -#: pg_dump.c:12360 +#: pg_dump.c:12399 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod" -#: pg_dump.c:12363 +#: pg_dump.c:12402 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castmethod" -#: pg_dump.c:12453 +#: pg_dump.c:12492 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " @@ -2311,62 +2311,62 @@ msgstr "" "неприемлемое определение преобразования (trffromsql или trftosql должно быть " "ненулевым)" -#: pg_dump.c:12470 +#: pg_dump.c:12509 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприемлемое значение в поле pg_transform.trffromsql" -#: pg_dump.c:12491 +#: pg_dump.c:12530 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприемлемое значение в поле pg_transform.trftosql" -#: pg_dump.c:12636 +#: pg_dump.c:12675 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "постфиксные операторы больше не поддерживаются (оператор \"%s\")" -#: pg_dump.c:12806 +#: pg_dump.c:12845 #, c-format msgid "could not find operator with OID %s" msgstr "оператор с OID %s не найден" -#: pg_dump.c:12874 +#: pg_dump.c:12913 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неверный тип \"%c\" метода доступа \"%s\"" -#: pg_dump.c:13543 pg_dump.c:13602 +#: pg_dump.c:13582 pg_dump.c:13641 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераспознанный провайдер правил сортировки: %s" -#: pg_dump.c:13552 pg_dump.c:13561 pg_dump.c:13571 pg_dump.c:13586 +#: pg_dump.c:13591 pg_dump.c:13600 pg_dump.c:13610 pg_dump.c:13625 #, c-format msgid "invalid collation \"%s\"" msgstr "неверное правило сортировки \"%s\"" -#: pg_dump.c:13992 +#: pg_dump.c:14031 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14048 +#: pg_dump.c:14087 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggmfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14765 +#: pg_dump.c:14804 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нераспознанный тип объекта в определении прав по умолчанию: %d" -#: pg_dump.c:14781 +#: pg_dump.c:14820 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не удалось разобрать список прав по умолчанию (%s)" -#: pg_dump.c:14863 +#: pg_dump.c:14902 #, c-format msgid "" "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" @@ -2374,20 +2374,20 @@ msgstr "" "не удалось разобрать изначальный список ACL (%s) или ACL по умолчанию (%s) " "для объекта \"%s\" (%s)" -#: pg_dump.c:14888 +#: pg_dump.c:14927 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "" "не удалось разобрать список ACL (%s) или ACL по умолчанию (%s) для объекта " "\"%s\" (%s)" -#: pg_dump.c:15429 +#: pg_dump.c:15468 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "" "запрос на получение определения представления \"%s\" не возвратил данные" -#: pg_dump.c:15432 +#: pg_dump.c:15471 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" @@ -2395,49 +2395,49 @@ msgstr "" "запрос на получение определения представления \"%s\" возвратил несколько " "определений" -#: pg_dump.c:15439 +#: pg_dump.c:15478 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "определение представления \"%s\" пустое (длина равна нулю)" -#: pg_dump.c:15523 +#: pg_dump.c:15562 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")" -#: pg_dump.c:16447 +#: pg_dump.c:16486 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер столбца %d для таблицы \"%s\"" -#: pg_dump.c:16525 +#: pg_dump.c:16564 #, c-format msgid "could not parse index statistic columns" msgstr "не удалось разобрать столбцы статистики в индексе" -#: pg_dump.c:16527 +#: pg_dump.c:16566 #, c-format msgid "could not parse index statistic values" msgstr "не удалось разобрать значения статистики в индексе" -#: pg_dump.c:16529 +#: pg_dump.c:16568 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "" "столбцы, задающие статистику индекса, не соответствуют значениям по " "количеству" -#: pg_dump.c:16759 +#: pg_dump.c:16798 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отсутствует индекс для ограничения \"%s\"" -#: pg_dump.c:16994 +#: pg_dump.c:17049 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераспознанный тип ограничения: %c" -#: pg_dump.c:17095 pg_dump.c:17325 +#: pg_dump.c:17150 pg_dump.c:17380 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2452,22 +2452,22 @@ msgstr[2] "" "запрос на получение данных последовательности \"%s\" вернул %d строк " "(ожидалась 1)" -#: pg_dump.c:17127 +#: pg_dump.c:17182 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераспознанный тип последовательности: %s" -#: pg_dump.c:17417 +#: pg_dump.c:17472 #, c-format msgid "unexpected tgtype value: %d" msgstr "неожиданное значение tgtype: %d" -#: pg_dump.c:17489 +#: pg_dump.c:17544 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "неверная строка аргументов (%s) для триггера \"%s\" таблицы \"%s\"" -#: pg_dump.c:17758 +#: pg_dump.c:17813 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2476,47 +2476,47 @@ msgstr "" "запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное " "число строк" -#: pg_dump.c:17911 +#: pg_dump.c:17966 #, c-format msgid "could not find referenced extension %u" msgstr "не удалось найти упомянутое расширение %u" -#: pg_dump.c:18001 +#: pg_dump.c:18056 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "конфигурации расширения не соответствуют условиям по количеству" -#: pg_dump.c:18133 +#: pg_dump.c:18188 #, c-format msgid "reading dependency data" msgstr "чтение информации о зависимостях" -#: pg_dump.c:18219 +#: pg_dump.c:18274 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:18230 +#: pg_dump.c:18285 #, c-format msgid "no referenced object %u %u" msgstr "нет вышестоящего объекта %u %u" -#: pg_dump_sort.c:422 +#: pg_dump_sort.c:633 #, c-format msgid "invalid dumpId %d" msgstr "неверный dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:639 #, c-format msgid "invalid dependency %d" msgstr "неверная зависимость %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:872 #, c-format msgid "could not identify dependency loop" msgstr "не удалось определить цикл зависимостей" -#: pg_dump_sort.c:1276 +#: pg_dump_sort.c:1487 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2524,7 +2524,7 @@ msgstr[0] "в следующей таблице зациклены ограни msgstr[1] "в следующих таблицах зациклены ограничения внешних ключей:" msgstr[2] "в следующих таблицах зациклены ограничения внешних ключей:" -#: pg_dump_sort.c:1281 +#: pg_dump_sort.c:1492 #, c-format msgid "" "You might not be able to restore the dump without using --disable-triggers " @@ -2533,7 +2533,7 @@ msgstr "" "Возможно, для восстановления базы потребуется использовать --disable-" "triggers или временно удалить ограничения." -#: pg_dump_sort.c:1282 +#: pg_dump_sort.c:1493 #, c-format msgid "" "Consider using a full dump instead of a --data-only dump to avoid this " @@ -2542,7 +2542,7 @@ msgstr "" "Во избежание этой проблемы, вероятно, стоит выгружать всю базу данных, а не " "только данные (--data-only)." -#: pg_dump_sort.c:1294 +#: pg_dump_sort.c:1505 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не удалось разрешить цикл зависимостей для следующих объектов:" diff --git a/src/bin/pg_dump/po/sv.po b/src/bin/pg_dump/po/sv.po index 2d86236c631..62ed3e4a3da 100644 --- a/src/bin/pg_dump/po/sv.po +++ b/src/bin/pg_dump/po/sv.po @@ -1,13 +1,13 @@ # Swedish message translation file for pg_dump # Peter Eisentraut , 2001, 2009, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-08-23 12:51+0000\n" -"PO-Revision-Date: 2023-08-23 15:31+0200\n" +"POT-Creation-Date: 2025-05-09 17:25+0000\n" +"PO-Revision-Date: 2025-05-09 21:13+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -425,7 +425,7 @@ msgid "could not read from input file: %s" msgstr "kunde inte läsa från infilen: %s" #: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 -#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 +#: compress_zstd.c:372 pg_backup_custom.c:653 pg_backup_directory.c:558 #: pg_backup_tar.c:725 pg_backup_tar.c:748 #, c-format msgid "could not read from input file: end of file" @@ -466,23 +466,23 @@ msgstr "kunde inte avsluta dekomprimering: %s" msgid "could not set compression parameter \"%s\": %s" msgstr "kunde inte sätta komprimeringsparameter \"%s\": %s" -#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 -#: compress_zstd.c:498 +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 #, c-format msgid "could not initialize compression library" msgstr "kunde inte initierar komprimeringsbibliotek" -#: compress_zstd.c:194 compress_zstd.c:308 +#: compress_zstd.c:195 compress_zstd.c:309 #, c-format msgid "could not decompress data: %s" msgstr "kunde inte dekomprimera data: %s" -#: compress_zstd.c:373 pg_backup_custom.c:655 +#: compress_zstd.c:374 pg_backup_custom.c:655 #, c-format msgid "could not read from input file: %m" msgstr "kunde inte läsa från infilen: %m" -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "kan inte hantera läget \"%s\"" @@ -567,7 +567,7 @@ msgstr "pgpipe: kunde itne ansluta till uttag (socket): felkod %d" msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: kunde inte acceptera anslutning: felkod %d" -#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603 +#: pg_backup_archiver.c:276 pg_backup_archiver.c:1606 #, c-format msgid "could not close output file: %m" msgstr "kunde inte stänga utdatafilen: %m" @@ -672,330 +672,330 @@ msgstr "slår på trigger för %s" msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "internt fel -- WriteData kan inte anropas utanför kontexten av en DataDumper-rutin" -#: pg_backup_archiver.c:1287 +#: pg_backup_archiver.c:1290 #, c-format msgid "large-object output not supported in chosen format" msgstr "utmatning av stora objekt stöds inte i det valda formatet" -#: pg_backup_archiver.c:1345 +#: pg_backup_archiver.c:1348 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "återställde %d stor objekt" msgstr[1] "återställde %d stora objekt" -#: pg_backup_archiver.c:1366 pg_backup_tar.c:668 +#: pg_backup_archiver.c:1369 pg_backup_tar.c:668 #, c-format msgid "restoring large object with OID %u" msgstr "återställer stort objekt med OID %u" -#: pg_backup_archiver.c:1378 +#: pg_backup_archiver.c:1381 #, c-format msgid "could not create large object %u: %s" msgstr "kunde inte skapa stort objekt %u: %s" -#: pg_backup_archiver.c:1383 pg_dump.c:3718 +#: pg_backup_archiver.c:1386 pg_dump.c:3766 #, c-format msgid "could not open large object %u: %s" msgstr "kunde inte öppna stort objekt %u: %s" -#: pg_backup_archiver.c:1439 +#: pg_backup_archiver.c:1442 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "kunde inte öppna TOC-filen \"%s\": %m" -#: pg_backup_archiver.c:1467 +#: pg_backup_archiver.c:1470 #, c-format msgid "line ignored: %s" msgstr "rad ignorerad: %s" -#: pg_backup_archiver.c:1474 +#: pg_backup_archiver.c:1477 #, c-format msgid "could not find entry for ID %d" msgstr "kunde inte hitta en post för ID %d" -#: pg_backup_archiver.c:1497 pg_backup_directory.c:221 +#: pg_backup_archiver.c:1500 pg_backup_directory.c:221 #: pg_backup_directory.c:606 #, c-format msgid "could not close TOC file: %m" msgstr "kunde inte stänga TOC-filen: %m" -#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_archiver.c:1587 pg_backup_custom.c:156 pg_backup_directory.c:332 #: pg_backup_directory.c:593 pg_backup_directory.c:658 #: pg_backup_directory.c:676 pg_dumpall.c:501 #, c-format msgid "could not open output file \"%s\": %m" msgstr "kunde inte öppna utdatafilen \"%s\": %m" -#: pg_backup_archiver.c:1586 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1589 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "kunde inte öppna utdatafilen: %m" -#: pg_backup_archiver.c:1669 +#: pg_backup_archiver.c:1672 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "skrev %zu byte data av stort objekt (resultat = %d)" msgstr[1] "skrev %zu bytes data av stort objekt (resultat = %d)" -#: pg_backup_archiver.c:1675 +#: pg_backup_archiver.c:1678 #, c-format msgid "could not write to large object: %s" msgstr "kunde inte skriva till stort objekt: %s" -#: pg_backup_archiver.c:1765 +#: pg_backup_archiver.c:1768 #, c-format msgid "while INITIALIZING:" msgstr "vid INITIERING:" -#: pg_backup_archiver.c:1770 +#: pg_backup_archiver.c:1773 #, c-format msgid "while PROCESSING TOC:" msgstr "vid HANTERING AV TOC:" -#: pg_backup_archiver.c:1775 +#: pg_backup_archiver.c:1778 #, c-format msgid "while FINALIZING:" msgstr "vid SLUTFÖRANDE:" -#: pg_backup_archiver.c:1780 +#: pg_backup_archiver.c:1783 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "från TOC-post %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1856 +#: pg_backup_archiver.c:1859 #, c-format msgid "bad dumpId" msgstr "felaktigt dumpId" -#: pg_backup_archiver.c:1877 +#: pg_backup_archiver.c:1880 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "felaktig tabell-dumpId för TABLE DATA-objekt" -#: pg_backup_archiver.c:1969 +#: pg_backup_archiver.c:1972 #, c-format msgid "unexpected data offset flag %d" msgstr "oväntad data-offset-flagga %d" -#: pg_backup_archiver.c:1982 +#: pg_backup_archiver.c:1985 #, c-format msgid "file offset in dump file is too large" msgstr "fil-offset i dumpfilen är för stort" -#: pg_backup_archiver.c:2093 +#: pg_backup_archiver.c:2096 #, c-format msgid "directory name too long: \"%s\"" msgstr "katalognamn för långt: \"%s\"" -#: pg_backup_archiver.c:2143 +#: pg_backup_archiver.c:2146 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "katalogen \"%s\" verkar inte vara ett giltigt arkiv (\"toc.dat\" finns inte)" -#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816 +#: pg_backup_archiver.c:2154 pg_backup_custom.c:173 pg_backup_custom.c:816 #: pg_backup_directory.c:206 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "kunde inte öppna indatafilen \"%s\": %m" -#: pg_backup_archiver.c:2158 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2161 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "kan inte öppna infil: %m" -#: pg_backup_archiver.c:2164 +#: pg_backup_archiver.c:2167 #, c-format msgid "could not read input file: %m" msgstr "kan inte läsa infilen: %m" -#: pg_backup_archiver.c:2166 +#: pg_backup_archiver.c:2169 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "indatafilen är för kort (läste %lu, förväntade 5)" -#: pg_backup_archiver.c:2198 +#: pg_backup_archiver.c:2201 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "indatafilen verkar vara en dump i textformat. Använd psql." -#: pg_backup_archiver.c:2204 +#: pg_backup_archiver.c:2207 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "indatafilen verkar inte vara ett korrekt arkiv (för kort?)" -#: pg_backup_archiver.c:2210 +#: pg_backup_archiver.c:2213 #, c-format msgid "input file does not appear to be a valid archive" msgstr "indatafilen verkar inte vara ett korrekt arkiv" -#: pg_backup_archiver.c:2219 +#: pg_backup_archiver.c:2222 #, c-format msgid "could not close input file: %m" msgstr "kunde inte stänga indatafilen: %m" -#: pg_backup_archiver.c:2297 +#: pg_backup_archiver.c:2300 #, c-format msgid "could not open stdout for appending: %m" msgstr "kunde inte öppna stdout för append: %m" -#: pg_backup_archiver.c:2342 +#: pg_backup_archiver.c:2345 #, c-format msgid "unrecognized file format \"%d\"" msgstr "känner inte igen filformat \"%d\"" -#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448 +#: pg_backup_archiver.c:2426 pg_backup_archiver.c:4470 #, c-format msgid "finished item %d %s %s" msgstr "klar med objekt %d %s %s" -#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461 +#: pg_backup_archiver.c:2430 pg_backup_archiver.c:4483 #, c-format msgid "worker process failed: exit code %d" msgstr "arbetsprocess misslyckades: felkod %d" -#: pg_backup_archiver.c:2548 +#: pg_backup_archiver.c:2551 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "post-ID %d utanför sitt intervall -- kanske en trasig TOC" -#: pg_backup_archiver.c:2628 +#: pg_backup_archiver.c:2631 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "återeställa tabeller med WITH OIDS stöds inte längre" -#: pg_backup_archiver.c:2710 +#: pg_backup_archiver.c:2713 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "okänd teckenkodning \"%s\"" -#: pg_backup_archiver.c:2715 +#: pg_backup_archiver.c:2719 #, c-format msgid "invalid ENCODING item: %s" msgstr "ogiltigt ENCODING-val: %s" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2737 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ogiltigt STDSTRINGS-val: %s" -#: pg_backup_archiver.c:2758 +#: pg_backup_archiver.c:2762 #, c-format msgid "schema \"%s\" not found" msgstr "schema \"%s\" hittades inte" -#: pg_backup_archiver.c:2765 +#: pg_backup_archiver.c:2769 #, c-format msgid "table \"%s\" not found" msgstr "tabell \"%s\" hittades inte" -#: pg_backup_archiver.c:2772 +#: pg_backup_archiver.c:2776 #, c-format msgid "index \"%s\" not found" msgstr "index \"%s\" hittades inte" -#: pg_backup_archiver.c:2779 +#: pg_backup_archiver.c:2783 #, c-format msgid "function \"%s\" not found" msgstr "funktion \"%s\" hittades inte" -#: pg_backup_archiver.c:2786 +#: pg_backup_archiver.c:2790 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger \"%s\" hittades inte" -#: pg_backup_archiver.c:3183 +#: pg_backup_archiver.c:3205 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "kunde inte sätta sessionsanvändare till \"%s\": %s" -#: pg_backup_archiver.c:3315 +#: pg_backup_archiver.c:3337 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "kunde inte sätta search_path till \"%s\": %s" -#: pg_backup_archiver.c:3376 +#: pg_backup_archiver.c:3398 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "kunde inte sätta default_tablespace till %s: %s" -#: pg_backup_archiver.c:3425 +#: pg_backup_archiver.c:3447 #, c-format msgid "could not set default_table_access_method: %s" msgstr "kunde inte sätta default_table_access_method: %s" -#: pg_backup_archiver.c:3530 +#: pg_backup_archiver.c:3552 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "vet inte hur man sätter ägare för objekttyp \"%s\"" -#: pg_backup_archiver.c:3752 +#: pg_backup_archiver.c:3774 #, c-format msgid "did not find magic string in file header" msgstr "kunde inte hitta den magiska strängen i filhuvudet" -#: pg_backup_archiver.c:3766 +#: pg_backup_archiver.c:3788 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ej supportad version (%d.%d) i filhuvudet" -#: pg_backup_archiver.c:3771 +#: pg_backup_archiver.c:3793 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "riktighetskontroll på heltalsstorlek (%lu) misslyckades" -#: pg_backup_archiver.c:3775 +#: pg_backup_archiver.c:3797 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "arkivet skapades på en maskin med större heltal, en del operationer kan misslyckas" -#: pg_backup_archiver.c:3785 +#: pg_backup_archiver.c:3807 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "förväntat format (%d) skiljer sig från formatet som fanns i filen (%d)" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:3829 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering (%s) -- ingen data kommer kunna läsas" -#: pg_backup_archiver.c:3843 +#: pg_backup_archiver.c:3865 #, c-format msgid "invalid creation date in header" msgstr "ogiltig skapandedatum i huvud" -#: pg_backup_archiver.c:3977 +#: pg_backup_archiver.c:3999 #, c-format msgid "processing item %d %s %s" msgstr "processar objekt %d %s %s" -#: pg_backup_archiver.c:4052 +#: pg_backup_archiver.c:4074 #, c-format msgid "entering main parallel loop" msgstr "går in i parallella huvudloopen" -#: pg_backup_archiver.c:4063 +#: pg_backup_archiver.c:4085 #, c-format msgid "skipping item %d %s %s" msgstr "hoppar över objekt %d %s %s" -#: pg_backup_archiver.c:4072 +#: pg_backup_archiver.c:4094 #, c-format msgid "launching item %d %s %s" msgstr "startar objekt %d %s %s" -#: pg_backup_archiver.c:4126 +#: pg_backup_archiver.c:4148 #, c-format msgid "finished main parallel loop" msgstr "klar med parallella huvudloopen" -#: pg_backup_archiver.c:4162 +#: pg_backup_archiver.c:4184 #, c-format msgid "processing missed item %d %s %s" msgstr "processar saknat objekt %d %s %s" -#: pg_backup_archiver.c:4767 +#: pg_backup_archiver.c:4789 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "tabell \"%s\" kunde inte skapas, dess data kommer ej återställas" @@ -1082,12 +1082,12 @@ msgstr "komprimerare aktiv" msgid "could not get server_version from libpq" msgstr "kunde inte hämta serverversionen från libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1809 +#: pg_backup_db.c:53 pg_dumpall.c:1861 #, c-format msgid "aborting because of server version mismatch" msgstr "avbryter då serverversionerna i matchar" -#: pg_backup_db.c:54 pg_dumpall.c:1810 +#: pg_backup_db.c:54 pg_dumpall.c:1862 #, c-format msgid "server version: %s; %s version: %s" msgstr "server version: %s; %s version: %s" @@ -1097,7 +1097,7 @@ msgstr "server version: %s; %s version: %s" msgid "already connected to a database" msgstr "är redan uppkopplad mot en databas" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1708 pg_dumpall.c:1810 msgid "Password: " msgstr "Lösenord: " @@ -1111,18 +1111,18 @@ msgstr "kunde inte ansluta till databasen" msgid "reconnection failed: %s" msgstr "återanslutning misslyckades: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280 -#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:757 pg_dump_sort.c:1280 +#: pg_dump_sort.c:1300 pg_dumpall.c:1735 pg_dumpall.c:1819 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 +#: pg_backup_db.c:271 pg_dumpall.c:1924 pg_dumpall.c:1947 #, c-format msgid "query failed: %s" msgstr "fråga misslyckades: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 +#: pg_backup_db.c:273 pg_dumpall.c:1925 pg_dumpall.c:1948 #, c-format msgid "Query was: %s" msgstr "Frågan var: %s" @@ -1158,7 +1158,7 @@ msgstr "fel returnerat av PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY misslyckades för tabell \"%s\": %s" -#: pg_backup_db.c:521 pg_dump.c:2202 +#: pg_backup_db.c:521 pg_dump.c:2237 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\"" @@ -1335,7 +1335,7 @@ msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filpositio msgid "unrecognized section name: \"%s\"" msgstr "okänt sektionsnamn: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 +#: pg_backup_utils.c:55 pg_dump.c:663 pg_dump.c:680 pg_dumpall.c:365 #: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 #: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 #: pg_restore.c:321 @@ -1348,82 +1348,82 @@ msgstr "Försök med \"%s --help\" för mer information." msgid "out of on_exit_nicely slots" msgstr "slut på on_exit_nicely-slottar" -#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#: pg_dump.c:678 pg_dumpall.c:373 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för många kommandoradsargument (första är \"%s\")" -#: pg_dump.c:696 pg_restore.c:328 +#: pg_dump.c:697 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "flaggorna \"bara schema\" (-s) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:699 +#: pg_dump.c:700 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "flaggorna -s/--schema-only och --include-foreign-data kan inte användas tillsammans" -#: pg_dump.c:702 +#: pg_dump.c:703 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "flaggan --include-foreign-data stöds inte med parallell backup" -#: pg_dump.c:705 pg_restore.c:331 +#: pg_dump.c:706 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "flaggorna \"nollställ\" (-c) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#: pg_dump.c:709 pg_dumpall.c:403 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "flaggan --if-exists kräver flaggan -c/--clean" -#: pg_dump.c:715 +#: pg_dump.c:716 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "flagga --on-conflict-do-nothing kräver --inserts, --rows-per-insert eller --column-inserts" -#: pg_dump.c:744 +#: pg_dump.c:745 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "okänd komprimeringsalgoritm: \"%s\"" -#: pg_dump.c:751 +#: pg_dump.c:752 #, c-format msgid "invalid compression specification: %s" msgstr "ogiltig inställning för komprimering: %s" -#: pg_dump.c:764 +#: pg_dump.c:765 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "komprimeringsflaggan \"%s\" stöds inte än av pg_dump" -#: pg_dump.c:776 +#: pg_dump.c:777 #, c-format msgid "parallel backup only supported by the directory format" msgstr "parallell backup stöds bara med katalogformat" -#: pg_dump.c:822 +#: pg_dump.c:823 #, c-format msgid "last built-in OID is %u" msgstr "sista inbyggda OID är %u" -#: pg_dump.c:831 +#: pg_dump.c:832 #, c-format msgid "no matching schemas were found" msgstr "hittade inga matchande scheman" -#: pg_dump.c:848 +#: pg_dump.c:849 #, c-format msgid "no matching tables were found" msgstr "hittade inga matchande tabeller" -#: pg_dump.c:876 +#: pg_dump.c:877 #, c-format msgid "no matching extensions were found" msgstr "hittade inga matchande utökningar" -#: pg_dump.c:1056 +#: pg_dump.c:1057 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1432,17 +1432,17 @@ msgstr "" "%s dumpar en databas som en textfil eller i andra format.\n" "\n" -#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#: pg_dump.c:1058 pg_dumpall.c:631 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1059 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#: pg_dump.c:1061 pg_dumpall.c:634 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1451,12 +1451,12 @@ msgstr "" "\n" "Allmänna flaggor:\n" -#: pg_dump.c:1061 +#: pg_dump.c:1062 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME fil eller katalognamn för utdata\n" -#: pg_dump.c:1062 +#: pg_dump.c:1063 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1465,22 +1465,22 @@ msgstr "" " -F, --format=c|d|t|p utdatans filformat (egen (c), katalog (d), tar (t),\n" " ren text (p) (standard))\n" -#: pg_dump.c:1064 +#: pg_dump.c:1065 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM använd så här många parellella job för att dumpa\n" -#: pg_dump.c:1065 pg_dumpall.c:635 +#: pg_dump.c:1066 pg_dumpall.c:636 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_dump.c:1066 pg_dumpall.c:636 +#: pg_dump.c:1067 pg_dumpall.c:637 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_dump.c:1067 +#: pg_dump.c:1068 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1489,22 +1489,22 @@ msgstr "" " -Z, --compress=METOD[:DETALJ]\n" " komprimera som angivet\n" -#: pg_dump.c:1069 pg_dumpall.c:637 +#: pg_dump.c:1070 pg_dumpall.c:638 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT misslyckas efter att ha väntat i TIMEOUT på tabellås\n" -#: pg_dump.c:1070 pg_dumpall.c:664 +#: pg_dump.c:1071 pg_dumpall.c:665 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync vänta inte på att ändingar säkert skrivits till disk\n" -#: pg_dump.c:1071 pg_dumpall.c:638 +#: pg_dump.c:1072 pg_dumpall.c:639 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_dump.c:1073 pg_dumpall.c:639 +#: pg_dump.c:1074 pg_dumpall.c:640 #, c-format msgid "" "\n" @@ -1513,62 +1513,62 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_dump.c:1074 pg_dumpall.c:640 +#: pg_dump.c:1075 pg_dumpall.c:641 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only dumpa bara data, inte schema\n" -#: pg_dump.c:1075 +#: pg_dump.c:1076 #, c-format msgid " -b, --large-objects include large objects in dump\n" msgstr " -b, --large-objects inkludera stora objekt i dumpen\n" -#: pg_dump.c:1076 +#: pg_dump.c:1077 #, c-format msgid " --blobs (same as --large-objects, deprecated)\n" msgstr " --blobs (samma som --large-objects, obsolet)\n" -#: pg_dump.c:1077 +#: pg_dump.c:1078 #, c-format msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-large-objects exkludera stora objekt i dumpen\n" -#: pg_dump.c:1078 +#: pg_dump.c:1079 #, c-format msgid " --no-blobs (same as --no-large-objects, deprecated)\n" msgstr " --no-blobs (samma som --no-large-objects, obsolet)\n" -#: pg_dump.c:1079 pg_restore.c:447 +#: pg_dump.c:1080 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean nollställ (drop) databasobjekt innan återskapande\n" -#: pg_dump.c:1080 +#: pg_dump.c:1081 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create inkludera kommandon för att skapa databasen i dumpen\n" -#: pg_dump.c:1081 +#: pg_dump.c:1082 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=MALL dumpa bara de angivna utökningarna\n" -#: pg_dump.c:1082 pg_dumpall.c:642 +#: pg_dump.c:1083 pg_dumpall.c:643 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n" -#: pg_dump.c:1083 +#: pg_dump.c:1084 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MALL dumpa bara de angivna scheman\n" -#: pg_dump.c:1084 +#: pg_dump.c:1085 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MALL dumpa INTE de angivna scheman\n" -#: pg_dump.c:1085 +#: pg_dump.c:1086 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1577,52 +1577,52 @@ msgstr "" " -O, --no-owner hoppa över återställande av objektägare i\n" " textformatdumpar\n" -#: pg_dump.c:1087 pg_dumpall.c:646 +#: pg_dump.c:1088 pg_dumpall.c:647 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only dumpa bara scheman, inte data\n" -#: pg_dump.c:1088 +#: pg_dump.c:1089 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME namn på superuser för textformatdumpar\n" -#: pg_dump.c:1089 +#: pg_dump.c:1090 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n" -#: pg_dump.c:1090 +#: pg_dump.c:1091 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MALL dumpa INTE de angivna tabellerna\n" -#: pg_dump.c:1091 pg_dumpall.c:649 +#: pg_dump.c:1092 pg_dumpall.c:650 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges dumpa inte rättigheter (grant/revoke)\n" -#: pg_dump.c:1092 pg_dumpall.c:650 +#: pg_dump.c:1093 pg_dumpall.c:651 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n" -#: pg_dump.c:1093 pg_dumpall.c:651 +#: pg_dump.c:1094 pg_dumpall.c:652 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts dumpa data som INSERT med kolumnnamn\n" -#: pg_dump.c:1094 pg_dumpall.c:652 +#: pg_dump.c:1095 pg_dumpall.c:653 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting slå av dollar-citering, använd standard SQL-citering\n" -#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#: pg_dump.c:1096 pg_dumpall.c:654 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers slå av triggrar vid återställning av enbart data\n" -#: pg_dump.c:1096 +#: pg_dump.c:1097 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1631,7 +1631,7 @@ msgstr "" " --enable-row-security slå på radsäkerhet (dumpa bara data användaren\n" " har rätt till)\n" -#: pg_dump.c:1098 +#: pg_dump.c:1099 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" @@ -1642,12 +1642,12 @@ msgstr "" " dumpa INTE angivna tabeller, inklusive\n" " barn och partitionstabeller\n" -#: pg_dump.c:1101 +#: pg_dump.c:1102 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MALL dumpa INTE data för de angivna tabellerna\n" -#: pg_dump.c:1102 +#: pg_dump.c:1103 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1658,17 +1658,17 @@ msgstr "" " dumpa INTE data för angivna tabeller,\n" " inklusive barn och partitionstabeller\n" -#: pg_dump.c:1105 pg_dumpall.c:655 +#: pg_dump.c:1106 pg_dumpall.c:656 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM övertrumfa standardinställningen för extra_float_digits\n" -#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#: pg_dump.c:1107 pg_dumpall.c:657 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists använd IF EXISTS när objekt droppas\n" -#: pg_dump.c:1107 +#: pg_dump.c:1108 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1679,87 +1679,87 @@ msgstr "" " inkludera data i främmande tabeller från\n" " främmande servrar som matchar MALL\n" -#: pg_dump.c:1110 pg_dumpall.c:657 +#: pg_dump.c:1111 pg_dumpall.c:658 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts dumpa data som INSERT, istället för COPY\n" -#: pg_dump.c:1111 pg_dumpall.c:658 +#: pg_dump.c:1112 pg_dumpall.c:659 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root ladda partitioner via root-tabellen\n" -#: pg_dump.c:1112 pg_dumpall.c:659 +#: pg_dump.c:1113 pg_dumpall.c:660 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments dumpa inte kommentarer\n" -#: pg_dump.c:1113 pg_dumpall.c:660 +#: pg_dump.c:1114 pg_dumpall.c:661 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications dumpa inte publiceringar\n" -#: pg_dump.c:1114 pg_dumpall.c:662 +#: pg_dump.c:1115 pg_dumpall.c:663 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels dumpa inte tilldelning av säkerhetsetiketter\n" -#: pg_dump.c:1115 pg_dumpall.c:663 +#: pg_dump.c:1116 pg_dumpall.c:664 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions dumpa inte prenumereringar\n" -#: pg_dump.c:1116 pg_dumpall.c:665 +#: pg_dump.c:1117 pg_dumpall.c:666 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method dumpa inte tabellaccessmetoder\n" -#: pg_dump.c:1117 pg_dumpall.c:666 +#: pg_dump.c:1118 pg_dumpall.c:667 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n" -#: pg_dump.c:1118 pg_dumpall.c:667 +#: pg_dump.c:1119 pg_dumpall.c:668 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression dumpa inte komprimeringsmetoder för TOAST\n" -#: pg_dump.c:1119 pg_dumpall.c:668 +#: pg_dump.c:1120 pg_dumpall.c:669 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data dumpa inte ologgad tabelldata\n" -#: pg_dump.c:1120 pg_dumpall.c:669 +#: pg_dump.c:1121 pg_dumpall.c:670 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing addera ON CONFLICT DO NOTHING till INSERT-kommandon\n" -#: pg_dump.c:1121 pg_dumpall.c:670 +#: pg_dump.c:1122 pg_dumpall.c:671 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers citera alla identifierar, även om de inte är nyckelord\n" -#: pg_dump.c:1122 pg_dumpall.c:671 +#: pg_dump.c:1123 pg_dumpall.c:672 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NRADER antal rader per INSERT; implicerar --inserts\n" -#: pg_dump.c:1123 +#: pg_dump.c:1124 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SEKTION dumpa namngiven sektion (pre-data, data eller post-data)\n" -#: pg_dump.c:1124 +#: pg_dump.c:1125 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable wait until the dump can run without anomalies\n" -#: pg_dump.c:1125 +#: pg_dump.c:1126 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT använda namngivet snapshot för att dumpa\n" -#: pg_dump.c:1126 pg_restore.c:476 +#: pg_dump.c:1127 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1768,7 +1768,7 @@ msgstr "" " --strict-names kräv att mallar för tabeller och/eller scheman matchar\n" " minst en sak var\n" -#: pg_dump.c:1128 +#: pg_dump.c:1129 #, c-format msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" @@ -1777,7 +1777,7 @@ msgstr "" " --table-and-children=MALL dumpa bara angivna tabell(er), inklusive\n" " barn och partitionstabeller\n" -#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#: pg_dump.c:1131 pg_dumpall.c:673 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1788,7 +1788,7 @@ msgstr "" " använd kommandot SET SESSION AUTHORIZATION istället för\n" " kommandot ALTER OWNER för att sätta ägare\n" -#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#: pg_dump.c:1135 pg_dumpall.c:677 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1797,42 +1797,42 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_dump.c:1135 +#: pg_dump.c:1136 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n" -#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#: pg_dump.c:1137 pg_dumpall.c:679 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT databasens värdport\n" -#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAMN anslut med datta användarnamn mot databasen\n" -#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga aldrig efter lösenord\n" -#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#: pg_dump.c:1141 pg_dumpall.c:684 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n" -#: pg_dump.c:1141 pg_dumpall.c:684 +#: pg_dump.c:1142 pg_dumpall.c:685 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n" -#: pg_dump.c:1143 +#: pg_dump.c:1144 #, c-format msgid "" "\n" @@ -1845,458 +1845,453 @@ msgstr "" "PGDATABASE att användas.\n" "\n" -#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#: pg_dump.c:1147 pg_dumpall.c:690 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_dump.c:1165 pg_dumpall.c:513 +#: pg_dump.c:1166 pg_dumpall.c:513 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "ogiltig klientteckenkodning \"%s\" angiven" -#: pg_dump.c:1303 +#: pg_dump.c:1312 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "parallella dumpar från standby-server stöds inte av denna serverversion" -#: pg_dump.c:1368 +#: pg_dump.c:1377 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ogiltigt utdataformat \"%s\" angivet" -#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 +#: pg_dump.c:1418 pg_dump.c:1474 pg_dump.c:1527 pg_dumpall.c:1501 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s" -#: pg_dump.c:1417 +#: pg_dump.c:1426 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "hittade inga matchande scheman för mallen \"%s\"" -#: pg_dump.c:1470 +#: pg_dump.c:1479 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "hittade inga matchande utökningar för mallen \"%s\"" -#: pg_dump.c:1523 +#: pg_dump.c:1532 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "hittade inga matchande främmande servrar för mallen \"%s\"" -#: pg_dump.c:1594 +#: pg_dump.c:1603 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ej korrekt relationsnamn (för många namn med punkt): %s" -#: pg_dump.c:1616 +#: pg_dump.c:1625 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "hittade inga matchande tabeller för mallen \"%s\"" -#: pg_dump.c:1643 +#: pg_dump.c:1652 #, c-format msgid "You are currently not connected to a database." msgstr "Du är för närvarande inte uppkopplad mot en databas." -#: pg_dump.c:1646 +#: pg_dump.c:1655 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: pg_dump.c:2077 +#: pg_dump.c:2108 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "dumpar innehållet i tabell \"%s.%s\"" -#: pg_dump.c:2183 +#: pg_dump.c:2218 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQendcopy() misslyckades." -#: pg_dump.c:2184 pg_dump.c:2194 +#: pg_dump.c:2219 pg_dump.c:2229 #, c-format msgid "Error message from server: %s" msgstr "Felmeddelandet från servern: %s" -#: pg_dump.c:2185 pg_dump.c:2195 +#: pg_dump.c:2220 pg_dump.c:2230 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" -#: pg_dump.c:2193 +#: pg_dump.c:2228 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQgetResult() misslyckades." -#: pg_dump.c:2275 +#: pg_dump.c:2319 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "fel antal fält hämtades för tabell \"%s\"" -#: pg_dump.c:2973 +#: pg_dump.c:3021 #, c-format msgid "saving database definition" msgstr "sparar databasdefinition" -#: pg_dump.c:3078 +#: pg_dump.c:3126 #, c-format msgid "unrecognized locale provider: %s" msgstr "okänd lokalleverantör: %s" -#: pg_dump.c:3429 +#: pg_dump.c:3477 #, c-format msgid "saving encoding = %s" msgstr "sparar kodning = %s" -#: pg_dump.c:3454 +#: pg_dump.c:3502 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "sparar standard_conforming_strings = %s" -#: pg_dump.c:3493 +#: pg_dump.c:3541 #, c-format msgid "could not parse result of current_schemas()" msgstr "kunde inte parsa resultat från current_schemas()" -#: pg_dump.c:3512 +#: pg_dump.c:3560 #, c-format msgid "saving search_path = %s" msgstr "sparar search_path = %s" -#: pg_dump.c:3549 +#: pg_dump.c:3597 #, c-format msgid "reading large objects" msgstr "läser stora objekt" -#: pg_dump.c:3687 +#: pg_dump.c:3735 #, c-format msgid "saving large objects" msgstr "sparar stora objekt" -#: pg_dump.c:3728 +#: pg_dump.c:3776 #, c-format msgid "error reading large object %u: %s" msgstr "fel vid läsning av stort objekt %u: %s" -#: pg_dump.c:3834 +#: pg_dump.c:3882 #, c-format msgid "reading row-level security policies" msgstr "läser säkerhetspolicy på radnivå" -#: pg_dump.c:3975 +#: pg_dump.c:4023 #, c-format msgid "unexpected policy command type: %c" msgstr "oväntad kommandotyp för policy: %c" -#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894 -#: pg_dump.c:17896 pg_dump.c:18517 +#: pg_dump.c:4473 pg_dump.c:4839 pg_dump.c:12072 pg_dump.c:17997 +#: pg_dump.c:17999 pg_dump.c:18620 #, c-format msgid "could not parse %s array" msgstr "kunde inte parsa arrayen %s" -#: pg_dump.c:4613 +#: pg_dump.c:4684 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "prenumerationer har inte dumpats få aktuell användare inte är en superuser" -#: pg_dump.c:5149 +#: pg_dump.c:5231 #, c-format msgid "could not find parent extension for %s %s" msgstr "kunde inte hitta föräldrautökning för %s %s" -#: pg_dump.c:5294 +#: pg_dump.c:5376 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: pg_dump.c:6776 pg_dump.c:17158 +#: pg_dump.c:6858 pg_dump.c:17261 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte" -#: pg_dump.c:6919 +#: pg_dump.c:7003 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "misslyckades med riktighetskontroll, hittade inte tabell med OID %u i pg_partitioned_table" -#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671 -#: pg_dump.c:8819 +#: pg_dump.c:7234 pg_dump.c:7505 pg_dump.c:7976 pg_dump.c:8640 pg_dump.c:8759 +#: pg_dump.c:8907 #, c-format msgid "unrecognized table OID %u" msgstr "okänt tabell-OID %u" -#: pg_dump.c:7154 +#: pg_dump.c:7238 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "oväntat indexdata för tabell \"%s\"" -#: pg_dump.c:7649 +#: pg_dump.c:7737 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte" -#: pg_dump.c:7940 +#: pg_dump.c:8028 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "fråga producerade null som refererad tabell för främmande nyckel-trigger \"%s\" i tabell \"%s\" (OID för tabell : %u)" -#: pg_dump.c:8556 +#: pg_dump.c:8644 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "oväntad kolumndata för tabell \"%s\"" -#: pg_dump.c:8585 +#: pg_dump.c:8673 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ogiltigt kolumnnumrering i tabell \"%s\"" -#: pg_dump.c:8633 +#: pg_dump.c:8721 #, c-format msgid "finding table default expressions" msgstr "hittar tabellers default-uttryck" -#: pg_dump.c:8675 +#: pg_dump.c:8763 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "felaktigt adnum-värde %d för tabell \"%s\"" -#: pg_dump.c:8769 +#: pg_dump.c:8857 #, c-format msgid "finding table check constraints" msgstr "hittar tabellers check-villkor" -#: pg_dump.c:8823 +#: pg_dump.c:8911 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" msgstr[1] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" -#: pg_dump.c:8827 +#: pg_dump.c:8915 #, c-format msgid "The system catalogs might be corrupted." msgstr "Systemkatalogerna kan vara trasiga." -#: pg_dump.c:9517 +#: pg_dump.c:9605 #, c-format msgid "role with OID %u does not exist" msgstr "roll med OID %u existerar inte" -#: pg_dump.c:9629 pg_dump.c:9658 +#: pg_dump.c:9717 pg_dump.c:9746 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "ogiltig pg_init_privs-post: %u %u %d" -#: pg_dump.c:10479 +#: pg_dump.c:10567 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype för datatyp \"%s\" verkar vara ogiltig" -#: pg_dump.c:12053 +#: pg_dump.c:12141 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "okänt provolatile-värde för funktion \"%s\"" -#: pg_dump.c:12103 pg_dump.c:13985 +#: pg_dump.c:12191 pg_dump.c:14073 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "okänt proparallel-värde för funktion \"%s\"" -#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346 +#: pg_dump.c:12321 pg_dump.c:12427 pg_dump.c:12434 #, c-format msgid "could not find function definition for function with OID %u" msgstr "kunde inte hitta funktionsdefinitionen för funktion med OID %u" -#: pg_dump.c:12272 +#: pg_dump.c:12360 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castfunc eller pg_cast.castmethod" -#: pg_dump.c:12275 +#: pg_dump.c:12363 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castmethod" -#: pg_dump.c:12365 +#: pg_dump.c:12453 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "felaktig transform-definition, minst en av trffromsql och trftosql måste vara ickenoll" -#: pg_dump.c:12382 +#: pg_dump.c:12470 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "felaktigt värde i fältet pg_transform.trffromsql" -#: pg_dump.c:12403 +#: pg_dump.c:12491 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "felaktigt värde i fältet pg_transform.trftosql" -#: pg_dump.c:12548 +#: pg_dump.c:12636 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "postfix-operatorer stöds inte längre (operator \"%s\")" -#: pg_dump.c:12718 +#: pg_dump.c:12806 #, c-format msgid "could not find operator with OID %s" msgstr "kunde inte hitta en operator med OID %s." -#: pg_dump.c:12786 +#: pg_dump.c:12874 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ogiltig typ \"%c\" för accessmetod \"%s\"" -#: pg_dump.c:13455 +#: pg_dump.c:13543 pg_dump.c:13602 #, c-format msgid "unrecognized collation provider: %s" msgstr "okänd jämförelseleverantör: %s" -#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498 +#: pg_dump.c:13552 pg_dump.c:13561 pg_dump.c:13571 pg_dump.c:13586 #, c-format msgid "invalid collation \"%s\"" msgstr "ogiltig jämförelse \"%s\"" -#: pg_dump.c:13514 -#, c-format -msgid "unrecognized collation provider '%c'" -msgstr "okänd jämförelseleverantör: '%c'" - -#: pg_dump.c:13904 +#: pg_dump.c:13992 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "okänt aggfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:13960 +#: pg_dump.c:14048 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:14677 +#: pg_dump.c:14765 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "okänd objekttyp i standardrättigheter: %d" -#: pg_dump.c:14693 +#: pg_dump.c:14781 #, c-format msgid "could not parse default ACL list (%s)" msgstr "kunde inte parsa standard-ACL-lista (%s)" -#: pg_dump.c:14775 +#: pg_dump.c:14863 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "kunde inte parsa initial ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:14800 +#: pg_dump.c:14888 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "kunde inte parsa ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:15341 +#: pg_dump.c:15429 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "fråga för att hämta definition av vy \"%s\" returnerade ingen data" -#: pg_dump.c:15344 +#: pg_dump.c:15432 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "fråga för att hämta definition av vy \"%s\" returnerade mer än en definition" -#: pg_dump.c:15351 +#: pg_dump.c:15439 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "definition av vy \"%s\" verkar vara tom (längd noll)" -#: pg_dump.c:15435 +#: pg_dump.c:15523 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS stöds inte längre (tabell \"%s\")" -#: pg_dump.c:16359 +#: pg_dump.c:16447 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ogiltigt kolumnnummer %d för tabell \"%s\"" -#: pg_dump.c:16437 +#: pg_dump.c:16525 #, c-format msgid "could not parse index statistic columns" msgstr "kunde inte parsa kolumn i indexstatistik" -#: pg_dump.c:16439 +#: pg_dump.c:16527 #, c-format msgid "could not parse index statistic values" msgstr "kunde inte parsa värden i indexstatistik" -#: pg_dump.c:16441 +#: pg_dump.c:16529 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "antal kolumner och värden stämmer inte i indexstatistik" -#: pg_dump.c:16657 +#: pg_dump.c:16759 #, c-format msgid "missing index for constraint \"%s\"" msgstr "saknar index för integritetsvillkor \"%s\"" -#: pg_dump.c:16892 +#: pg_dump.c:16994 #, c-format msgid "unrecognized constraint type: %c" msgstr "oväntad integritetsvillkorstyp: %c" -#: pg_dump.c:16993 pg_dump.c:17222 +#: pg_dump.c:17095 pg_dump.c:17325 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "fråga för att hämta data för sekvens \"%s\" returnerade %d rad (förväntade 1)" msgstr[1] "fråga för att hämta data för sekvens \"%s\" returnerade %d rader (förväntade 1)" -#: pg_dump.c:17025 +#: pg_dump.c:17127 #, c-format msgid "unrecognized sequence type: %s" msgstr "okänd sekvenstyp: %s" -#: pg_dump.c:17314 +#: pg_dump.c:17417 #, c-format msgid "unexpected tgtype value: %d" msgstr "oväntat tgtype-värde: %d" -#: pg_dump.c:17386 +#: pg_dump.c:17489 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "felaktig argumentsträng (%s) för trigger \"%s\" i tabell \"%s\"" -#: pg_dump.c:17655 +#: pg_dump.c:17758 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "fråga för att hämta regel \"%s\" för tabell \"%s\" misslyckades: fel antal rader returnerades" -#: pg_dump.c:17808 +#: pg_dump.c:17911 #, c-format msgid "could not find referenced extension %u" msgstr "kunde inte hitta refererad utökning %u" -#: pg_dump.c:17898 +#: pg_dump.c:18001 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "antal konfigurationer och villkor stämmer inte för utökning" -#: pg_dump.c:18030 +#: pg_dump.c:18133 #, c-format msgid "reading dependency data" msgstr "läser beroendedata" -#: pg_dump.c:18116 +#: pg_dump.c:18219 #, c-format msgid "no referencing object %u %u" msgstr "inget refererande objekt %u %u" -#: pg_dump.c:18127 +#: pg_dump.c:18230 #, c-format msgid "no referenced object %u %u" msgstr "inget refererat objekt %u %u" @@ -2368,7 +2363,7 @@ msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan int msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "flaggorna \"bara roller\" (-r) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans" -#: pg_dumpall.c:469 pg_dumpall.c:1750 +#: pg_dumpall.c:469 pg_dumpall.c:1802 #, c-format msgid "could not connect to database \"%s\"" msgstr "kunde inte ansluta till databasen \"%s\"" @@ -2382,7 +2377,7 @@ msgstr "" "kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n" "Ange en annan databas." -#: pg_dumpall.c:629 +#: pg_dumpall.c:630 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2391,67 +2386,67 @@ msgstr "" "%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n" "\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:632 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:635 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME utdatafilnamn\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:642 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean nollställ (drop) databaser innan återskapning\n" -#: pg_dumpall.c:643 +#: pg_dumpall.c:644 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only dumpa bara globala objekt, inte databaser\n" -#: pg_dumpall.c:644 pg_restore.c:456 +#: pg_dumpall.c:645 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner återställ inte objektägare\n" -#: pg_dumpall.c:645 +#: pg_dumpall.c:646 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only dumpa endast roller, inte databaser eller tabellutrymmen\n" -#: pg_dumpall.c:647 +#: pg_dumpall.c:648 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAMN namn på superuser för användning i dumpen\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:649 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only dumpa endasdt tabellutrymmen, inte databaser eller roller\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:655 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=MALL uteslut databaser vars namn matchar MALL\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:662 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords dumpa inte lösenord för roller\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:678 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n" -#: pg_dumpall.c:679 +#: pg_dumpall.c:680 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAMN alternativ standarddatabas\n" -#: pg_dumpall.c:686 +#: pg_dumpall.c:687 #, c-format msgid "" "\n" @@ -2463,62 +2458,68 @@ msgstr "" "Om -f/--file inte används så kommer SQL-skriptet skriva till standard ut.\n" "\n" -#: pg_dumpall.c:828 +#: pg_dumpall.c:832 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)" -#: pg_dumpall.c:1050 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1049 pg_dumpall.c:1107 pg_dumpall.c:1116 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "hittade föräldralös pg_auth_members-post för roll %s" + +#: pg_dumpall.c:1082 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "kunde inte hitta en korrekt dumpordning för medlemskap i rollen \"%s\"" -#: pg_dumpall.c:1185 +#: pg_dumpall.c:1237 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "kunde inte parsa ACL-listan (%s) för parameter \"%s\"" -#: pg_dumpall.c:1303 +#: pg_dumpall.c:1355 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "kunde inte tolka ACL-listan (%s) för tabellutrymme \"%s\"" -#: pg_dumpall.c:1510 +#: pg_dumpall.c:1562 #, c-format msgid "excluding database \"%s\"" msgstr "utesluter databas \"%s\"" -#: pg_dumpall.c:1514 +#: pg_dumpall.c:1566 #, c-format msgid "dumping database \"%s\"" msgstr "dumpar databas \"%s\"" -#: pg_dumpall.c:1545 +#: pg_dumpall.c:1597 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump misslyckades med databas \"%s\", avslutar" -#: pg_dumpall.c:1551 +#: pg_dumpall.c:1603 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "kunde inte öppna om utdatafilen \"%s\": %m" -#: pg_dumpall.c:1592 +#: pg_dumpall.c:1644 #, c-format msgid "running \"%s\"" msgstr "kör \"%s\"" -#: pg_dumpall.c:1793 +#: pg_dumpall.c:1845 #, c-format msgid "could not get server version" msgstr "kunde inte hämta serverversionen" -#: pg_dumpall.c:1796 +#: pg_dumpall.c:1848 #, c-format msgid "could not parse server version \"%s\"" msgstr "kunde inte tolka versionsträngen \"%s\"" -#: pg_dumpall.c:1866 pg_dumpall.c:1889 +#: pg_dumpall.c:1918 pg_dumpall.c:1941 #, c-format msgid "executing %s" msgstr "kör: %s" @@ -2765,55 +2766,3 @@ msgstr "" "\n" "Om inget indatafilnamn är angivet, så kommer standard in att användas.\n" "\n" - -#, c-format -#~ msgid " %s" -#~ msgstr " %s" - -#, c-format -#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n" -#~ msgstr " -Z, --compress=0-9 komprimeringsnivå för komprimerade format\n" - -#, c-format -#~ msgid "cannot restore from compressed archive (compression not supported in this installation)" -#~ msgstr "kan inte återställa från komprimerat arkiv (inte konfigurerad med stöd för komprimering)" - -#, c-format -#~ msgid "could not change directory to \"%s\": %m" -#~ msgstr "kunde inte byta katalog till \"%s\": %m" - -#, c-format -#~ msgid "could not close blob data file: %m" -#~ msgstr "kan inte stänga blobbars datafil: %m" - -#, c-format -#~ msgid "could not close blobs TOC file: %m" -#~ msgstr "kunde inte stänga blobbars TOC-fil: %m" - -#, c-format -#~ msgid "could not identify current directory: %m" -#~ msgstr "kunde inte identifiera aktuell katalog: %m" - -#, c-format -#~ msgid "could not read binary \"%s\"" -#~ msgstr "kunde inte läsa binär \"%s\"" - -#, c-format -#~ msgid "could not read symbolic link \"%s\": %m" -#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m" - -#, c-format -#~ msgid "invalid binary \"%s\"" -#~ msgstr "ogiltig binär \"%s\"" - -#, c-format -#~ msgid "invalid compression code: %d" -#~ msgstr "ogiltig komprimeringskod: %d" - -#, c-format -#~ msgid "not built with zlib support" -#~ msgstr "ej byggt med zlib-stöd" - -#, c-format -#~ msgid "requested compression not available in this installation -- archive will be uncompressed" -#~ msgstr "efterfrågad komprimering finns inte i denna installation -- arkivet kommer sparas okomprimerat" diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index 523d6462f14..9573cfe7fb4 100644 --- a/src/bin/pg_rewind/po/ru.po +++ b/src/bin/pg_rewind/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:45+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 13:07+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -901,52 +901,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: xlogreader.c:671 xlogreader.c:1136 +#: xlogreader.c:671 xlogreader.c:1146 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "" "неверная длина записи в позиции %X/%X: ожидалось минимум %u, получено %u" -#: xlogreader.c:760 +#: xlogreader.c:761 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:773 +#: xlogreader.c:774 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: xlogreader.c:1144 +#: xlogreader.c:1154 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: xlogreader.c:1157 xlogreader.c:1173 +#: xlogreader.c:1167 xlogreader.c:1183 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1211 +#: xlogreader.c:1221 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: xlogreader.c:1245 +#: xlogreader.c:1255 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверное магическое число %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1260 xlogreader.c:1302 +#: xlogreader.c:1270 xlogreader.c:1312 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверные информационные биты %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1276 +#: xlogreader.c:1286 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -955,7 +955,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: xlogreader.c:1284 +#: xlogreader.c:1294 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -964,7 +964,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: xlogreader.c:1290 +#: xlogreader.c:1300 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -973,12 +973,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: xlogreader.c:1322 +#: xlogreader.c:1332 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "неожиданный pageaddr %X/%X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1348 +#: xlogreader.c:1358 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -987,23 +987,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1754 +#: xlogreader.c:1764 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1778 +#: xlogreader.c:1788 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1785 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1821 +#: xlogreader.c:1831 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -1012,21 +1012,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1837 +#: xlogreader.c:1847 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1866 +#: xlogreader.c:1876 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -1035,41 +1035,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1882 +#: xlogreader.c:1892 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1894 +#: xlogreader.c:1904 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1961 +#: xlogreader.c:1971 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:1987 +#: xlogreader.c:1997 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2071 +#: xlogreader.c:2081 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2078 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: xlogreader.c:2105 xlogreader.c:2122 +#: xlogreader.c:2115 xlogreader.c:2132 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -1078,7 +1078,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2131 +#: xlogreader.c:2141 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -1086,7 +1086,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2139 +#: xlogreader.c:2149 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po index 36efb8ebf53..07c18b6e4c2 100644 --- a/src/bin/pg_upgrade/po/de.po +++ b/src/bin/pg_upgrade/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-11-03 13:18+0000\n" +"POT-Creation-Date: 2025-08-08 02:24+0000\n" "PO-Revision-Date: 2023-11-03 10:42-0400\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: check.c:72 +#: check.c:73 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -24,7 +24,7 @@ msgstr "" "Führe Konsistenzprüfungen am alten laufenden Server durch\n" "---------------------------------------------------------" -#: check.c:78 +#: check.c:79 #, c-format msgid "" "Performing Consistency Checks\n" @@ -33,7 +33,7 @@ msgstr "" "Führe Konsistenzprüfungen durch\n" "-------------------------------" -#: check.c:234 +#: check.c:242 #, c-format msgid "" "\n" @@ -42,7 +42,7 @@ msgstr "" "\n" "*Cluster sind kompatibel*" -#: check.c:242 +#: check.c:250 #, c-format msgid "" "\n" @@ -54,7 +54,7 @@ msgstr "" "neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n" "werden kann." -#: check.c:283 +#: check.c:291 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -65,7 +65,7 @@ msgstr "" "den neuen Server starten, sollte Sie diesen Befehl ausführen:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:289 +#: check.c:297 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -74,7 +74,7 @@ msgstr "" "Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n" " %s" -#: check.c:294 +#: check.c:302 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -87,57 +87,57 @@ msgstr "" "Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n" "liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden." -#: check.c:306 +#: check.c:314 #, c-format msgid "Checking cluster versions" msgstr "Prüfe Cluster-Versionen" -#: check.c:318 +#: check.c:326 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version %s oder später durchführen." -#: check.c:323 +#: check.c:331 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen." -#: check.c:332 +#: check.c:340 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen." -#: check.c:337 +#: check.c:345 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen." -#: check.c:340 +#: check.c:348 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen." -#: check.c:355 +#: check.c:363 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein." -#: check.c:375 +#: check.c:383 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden" -#: check.c:398 +#: check.c:406 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters" -#: check.c:409 +#: check.c:417 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«" -#: check.c:442 +#: check.c:450 #, c-format msgid "" "\n" @@ -146,7 +146,7 @@ msgstr "" "\n" "WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen" -#: check.c:466 +#: check.c:474 #, c-format msgid "" "\n" @@ -155,61 +155,62 @@ msgstr "" "\n" "WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen" -#: check.c:476 +#: check.c:484 #, c-format msgid "Creating script to delete old cluster" msgstr "Erzeuge Skript zum Löschen des alten Clusters" -#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069 -#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 +#: check.c:487 check.c:660 check.c:776 check.c:871 check.c:1000 check.c:1077 +#: check.c:1155 check.c:1435 check.c:1509 file.c:339 function.c:163 +#: option.c:476 version.c:116 version.c:292 version.c:426 #, c-format msgid "could not open file \"%s\": %s" msgstr "konnte Datei »%s« nicht öffnen: %s" -#: check.c:530 +#: check.c:538 #, c-format msgid "could not add execute permission to file \"%s\": %s" msgstr "konnte Datei »%s« nicht ausführbar machen: %s" -#: check.c:550 +#: check.c:558 #, c-format msgid "Checking database user is the install user" msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist" -#: check.c:566 +#: check.c:574 #, c-format msgid "database user \"%s\" is not the install user" msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer" -#: check.c:577 +#: check.c:585 #, c-format msgid "could not determine the number of users" msgstr "konnte die Anzahl der Benutzer nicht ermitteln" -#: check.c:585 +#: check.c:593 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein." -#: check.c:614 +#: check.c:622 #, c-format msgid "Checking database connection settings" msgstr "Prüfe Verbindungseinstellungen der Datenbank" -#: check.c:640 +#: check.c:648 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein" -#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148 -#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362 -#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:675 check.c:796 check.c:894 check.c:1020 check.c:1097 check.c:1175 +#: check.c:1235 check.c:1296 check.c:1325 check.c:1359 check.c:1390 +#: check.c:1449 check.c:1530 function.c:185 version.c:192 version.c:232 +#: version.c:378 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:668 +#: check.c:676 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -229,27 +230,27 @@ msgstr "" "in der Datei:\n" " %s" -#: check.c:693 +#: check.c:701 #, c-format msgid "Checking for prepared transactions" msgstr "Prüfe auf vorbereitete Transaktionen" -#: check.c:702 +#: check.c:710 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Der alte Cluster enthält vorbereitete Transaktionen" -#: check.c:704 +#: check.c:712 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Der neue Cluster enthält vorbereitete Transaktionen" -#: check.c:729 +#: check.c:737 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe" -#: check.c:789 +#: check.c:797 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -269,12 +270,12 @@ msgstr "" "der problematischen Funktionen ist in der Datei:\n" " %s" -#: check.c:811 +#: check.c:819 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren" -#: check.c:887 +#: check.c:895 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -289,12 +290,12 @@ msgstr "" "Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n" " %s" -#: check.c:911 +#: check.c:919 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Prüfe auf inkompatible polymorphische Funktionen" -#: check.c:1013 +#: check.c:1021 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -315,12 +316,12 @@ msgstr "" "Eine Liste der problematischen Objekte ist in der Datei:\n" " %s" -#: check.c:1037 +#: check.c:1045 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Prüfe auf Tabellen mit WITH OIDS" -#: check.c:1090 +#: check.c:1098 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -335,12 +336,37 @@ msgstr "" "Eine Liste der Tabellen mit dem Problem ist in der Datei:\n" " %s" -#: check.c:1118 +#: check.c:1123 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Prüfe auf Inkonsistenzen bei Not-Null-Constraints" + +#: check.c:1176 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Ihre Installation enthält inkonsistente NOT-NULL-Constraints.\n" +"Wenn die Spalte in der Elterntabelle NOT NULL ist, dann muss die\n" +"Spalte in der abgeleiteten Tabelle auch NOT NULL sein, ansonsten wird\n" +"das Upgrade fehlschlagen.\n" +"Sie können dies reparieren, indem Sie\n" +" ALTER TABLE tabellenname ALTER spalte SET NOT NULL;\n" +"für jede Spalte in dieser Datei ausführen:\n" +" %s" + +#: check.c:1205 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen" -#: check.c:1149 +#: check.c:1236 #, c-format msgid "" "Your installation contains system-defined composite types in user tables.\n" @@ -358,12 +384,12 @@ msgstr "" "Datei:\n" " %s" -#: check.c:1177 +#: check.c:1264 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen" -#: check.c:1210 +#: check.c:1297 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -381,12 +407,12 @@ msgstr "" "ist in der Datei:\n" " %s" -#: check.c:1231 +#: check.c:1318 #, c-format msgid "Checking for incompatible \"%s\" data type in user tables" msgstr "Prüfe auf inkompatiblen Datentyp »%s« in Benutzertabellen" -#: check.c:1239 +#: check.c:1326 #, c-format msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" @@ -403,12 +429,12 @@ msgstr "" "starten. Eine Liste der Problemspalten ist in der Datei:\n" " %s" -#: check.c:1263 +#: check.c:1350 #, c-format msgid "Checking for removed \"%s\" data type in user tables" msgstr "Prüfe auf entfernten Datentyp »%s« in Benutzertabellen" -#: check.c:1273 +#: check.c:1360 #, c-format msgid "" "Your installation contains the \"%s\" data type in user tables.\n" @@ -425,12 +451,12 @@ msgstr "" "starten. Eine Liste der Problemspalten ist in der Datei:\n" " %s" -#: check.c:1295 +#: check.c:1382 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«" -#: check.c:1304 +#: check.c:1391 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -447,12 +473,12 @@ msgstr "" "Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n" " %s" -#: check.c:1331 +#: check.c:1418 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Prüfe auf Rollen, die mit »pg_« anfangen" -#: check.c:1363 +#: check.c:1450 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -467,12 +493,12 @@ msgstr "" "Eine Liste der Rollen, die mit »pg_« anfangen, ist in der Datei:\n" " %s" -#: check.c:1383 +#: check.c:1470 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen" -#: check.c:1444 +#: check.c:1531 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -531,7 +557,7 @@ msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:" msgid "The target cluster lacks cluster state information:" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 +#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:519 pg_upgrade.c:556 #: relfilenumber.c:231 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1460,72 +1486,72 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Setze Locale und Kodierung für neuen Cluster" -#: pg_upgrade.c:450 +#: pg_upgrade.c:452 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analysiere alle Zeilen im neuen Cluster" -#: pg_upgrade.c:463 +#: pg_upgrade.c:465 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Friere alle Zeilen im neuen Cluster ein" -#: pg_upgrade.c:483 +#: pg_upgrade.c:485 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Stelle globale Objekte im neuen Cluster wieder her" -#: pg_upgrade.c:499 +#: pg_upgrade.c:501 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Stelle Datenbankschemas im neuen Cluster wieder her" -#: pg_upgrade.c:605 +#: pg_upgrade.c:607 #, c-format msgid "Deleting files from new %s" msgstr "Lösche Dateien aus neuem %s" -#: pg_upgrade.c:609 +#: pg_upgrade.c:611 #, c-format msgid "could not delete directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: pg_upgrade.c:628 +#: pg_upgrade.c:630 #, c-format msgid "Copying old %s to new server" msgstr "Kopiere altes %s zum neuen Server" -#: pg_upgrade.c:654 +#: pg_upgrade.c:656 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Setze älteste XID im neuen Cluster" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster" -#: pg_upgrade.c:692 +#: pg_upgrade.c:694 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster" -#: pg_upgrade.c:716 +#: pg_upgrade.c:718 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Setze älteste Multixact-ID im neuen Cluster" -#: pg_upgrade.c:736 +#: pg_upgrade.c:738 #, c-format msgid "Resetting WAL archives" msgstr "Setze WAL-Archive zurück" -#: pg_upgrade.c:779 +#: pg_upgrade.c:781 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Setze frozenxid und minmxid im neuen Cluster" -#: pg_upgrade.c:781 +#: pg_upgrade.c:783 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Setze minmxid im neuen Cluster" diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po index 266381962ca..d4d17e61aa3 100644 --- a/src/bin/pg_upgrade/po/fr.po +++ b/src/bin/pg_upgrade/po/fr.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-10-29 17:18+0000\n" -"PO-Revision-Date: 2024-09-16 16:35+0200\n" +"POT-Creation-Date: 2025-07-17 17:52+0000\n" +"PO-Revision-Date: 2025-07-19 07:11+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,9 +19,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.5\n" +"X-Generator: Poedit 3.6\n" -#: check.c:72 +#: check.c:73 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -30,7 +30,7 @@ msgstr "" "Exécution de tests de cohérence sur l'ancien serveur\n" "----------------------------------------------------" -#: check.c:78 +#: check.c:79 #, c-format msgid "" "Performing Consistency Checks\n" @@ -39,7 +39,7 @@ msgstr "" "Exécution de tests de cohérence\n" "-------------------------------" -#: check.c:234 +#: check.c:242 #, c-format msgid "" "\n" @@ -48,7 +48,7 @@ msgstr "" "\n" "*Les instances sont compatibles*" -#: check.c:242 +#: check.c:250 #, c-format msgid "" "\n" @@ -59,7 +59,7 @@ msgstr "" "Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n" "sur la nouvelle instance avant de continuer." -#: check.c:283 +#: check.c:291 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -70,7 +70,7 @@ msgstr "" "Une fois le nouveau serveur démarré, pensez à exécuter :\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:289 +#: check.c:297 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -79,7 +79,7 @@ msgstr "" "Exécuter ce script supprimera les fichiers de données de l'ancienne instance :\n" " %s" -#: check.c:294 +#: check.c:302 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -93,57 +93,57 @@ msgstr "" "de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n" "manuellement." -#: check.c:306 +#: check.c:314 #, c-format msgid "Checking cluster versions" msgstr "Vérification des versions des instances" -#: check.c:318 +#: check.c:326 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "Cet outil peut seulement mettre à jour les versions %s et ultérieures de PostgreSQL." -#: check.c:323 +#: check.c:331 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL." -#: check.c:332 +#: check.c:340 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL." -#: check.c:337 +#: check.c:345 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes." -#: check.c:340 +#: check.c:348 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes." -#: check.c:355 +#: check.c:363 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau." -#: check.c:375 +#: check.c:383 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée" -#: check.c:398 +#: check.c:406 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Vérification des répertoires de tablespace de la nouvelle instance" -#: check.c:409 +#: check.c:417 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »" -#: check.c:442 +#: check.c:450 #, c-format msgid "" "\n" @@ -152,7 +152,7 @@ msgstr "" "\n" "AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s" -#: check.c:466 +#: check.c:474 #, c-format msgid "" "\n" @@ -161,61 +161,62 @@ msgstr "" "\n" "AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s" -#: check.c:476 +#: check.c:484 #, c-format msgid "Creating script to delete old cluster" msgstr "Création du script pour supprimer l'ancienne instance" -#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069 -#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476 +#: check.c:487 check.c:660 check.c:776 check.c:871 check.c:1000 check.c:1077 +#: check.c:1435 check.c:1509 file.c:339 function.c:163 option.c:476 #: version.c:116 version.c:292 version.c:426 #, c-format msgid "could not open file \"%s\": %s" msgstr "n'a pas pu ouvrir le fichier « %s » : %s" -#: check.c:530 +#: check.c:538 #, c-format msgid "could not add execute permission to file \"%s\": %s" msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s" -#: check.c:550 +#: check.c:558 #, c-format msgid "Checking database user is the install user" msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation" -#: check.c:566 +#: check.c:574 #, c-format msgid "database user \"%s\" is not the install user" msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation" -#: check.c:577 +#: check.c:585 #, c-format msgid "could not determine the number of users" msgstr "n'a pas pu déterminer le nombre d'utilisateurs" -#: check.c:585 +#: check.c:593 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance." -#: check.c:614 +#: check.c:622 #, c-format msgid "Checking database connection settings" msgstr "Vérification des paramètres de connexion de la base de données" -#: check.c:640 +#: check.c:648 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false" -#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148 -#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362 -#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:675 check.c:796 check.c:894 check.c:1020 check.c:1097 check.c:1175 +#: check.c:1235 check.c:1296 check.c:1325 check.c:1359 check.c:1390 +#: check.c:1449 check.c:1530 function.c:185 version.c:192 version.c:232 +#: version.c:378 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:668 +#: check.c:676 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -234,27 +235,27 @@ msgstr "" "le fichier :\n" " %s" -#: check.c:693 +#: check.c:701 #, c-format msgid "Checking for prepared transactions" msgstr "Vérification des transactions préparées" -#: check.c:702 +#: check.c:710 #, c-format msgid "The source cluster contains prepared transactions" msgstr "L'instance source contient des transactions préparées" -#: check.c:704 +#: check.c:712 #, c-format msgid "The target cluster contains prepared transactions" msgstr "L'instance cible contient des transactions préparées" -#: check.c:729 +#: check.c:737 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint" -#: check.c:789 +#: check.c:797 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -275,12 +276,12 @@ msgstr "" "dans le fichier :\n" " %s" -#: check.c:811 +#: check.c:819 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Vérification des opérateurs postfixes définis par les utilisateurs" -#: check.c:887 +#: check.c:895 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -295,12 +296,12 @@ msgstr "" "Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n" " %s" -#: check.c:911 +#: check.c:919 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Vérification des fonctions polymorphiques incompatibles" -#: check.c:1013 +#: check.c:1021 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -320,12 +321,12 @@ msgstr "" "des objets problématiques se trouve dans le fichier\n" " %s" -#: check.c:1037 +#: check.c:1045 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Vérification des tables WITH OIDS" -#: check.c:1090 +#: check.c:1098 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -340,12 +341,41 @@ msgstr "" "Une liste des tables ayant ce problème se trouve dans le fichier :\n" " %s" -#: check.c:1118 +#: check.c:1123 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Vérification des incohérences des contraintes NOT NULL" + +#: check.c:1155 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: check.c:1176 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Votre installation contient des contraintes NOT NULL incohérentes.\n" +"Si les colonnes parents sont NOT NULL, alors la colonne enfant doit\n" +"aussi être marquée NOT NULL, sinon la mise à jour échouera.\n" +"Vous pouvez corriger ceci en exécutant\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"sur chaque colonne listée dans le fichier :\n" +" %s" + +#: check.c:1205 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Vérification des types composites définis par le système dans les tables utilisateurs" -#: check.c:1149 +#: check.c:1236 #, c-format msgid "" "Your installation contains system-defined composite types in user tables.\n" @@ -362,12 +392,12 @@ msgstr "" "une liste des colonnes problématiques dans le fichier :\n" " %s" -#: check.c:1177 +#: check.c:1264 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Vérification des types de données reg* dans les tables utilisateurs" -#: check.c:1210 +#: check.c:1297 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -385,12 +415,12 @@ msgstr "" "fichier :\n" " %s" -#: check.c:1231 +#: check.c:1318 #, c-format msgid "Checking for incompatible \"%s\" data type in user tables" msgstr "Vérification du type de données « %s » incompatible dans les tables utilisateurs" -#: check.c:1239 +#: check.c:1326 #, c-format msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" @@ -407,12 +437,12 @@ msgstr "" "est disponible dans le fichier :\n" " %s" -#: check.c:1263 +#: check.c:1350 #, c-format msgid "Checking for removed \"%s\" data type in user tables" msgstr "Vérification du type de données « %s » supprimé dans les tables utilisateurs" -#: check.c:1273 +#: check.c:1360 #, c-format msgid "" "Your installation contains the \"%s\" data type in user tables.\n" @@ -430,12 +460,12 @@ msgstr "" "le fichier :\n" " %s\\" -#: check.c:1295 +#: check.c:1382 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Vérification des types de données « jsonb » incompatibles" -#: check.c:1304 +#: check.c:1391 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -452,12 +482,12 @@ msgstr "" "est disponible dans le fichier :\n" " %s" -#: check.c:1331 +#: check.c:1418 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Vérification des rôles commençant avec « pg_ »" -#: check.c:1363 +#: check.c:1450 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -472,12 +502,12 @@ msgstr "" "Une liste des rôles commençant par « pg_ » se trouve dans le fichier :\n" " %s" -#: check.c:1383 +#: check.c:1470 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Vérification des conversions d'encodage définies par les utilisateurs" -#: check.c:1444 +#: check.c:1531 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -534,7 +564,7 @@ msgstr "Il manque certaines informations d'état requises sur l'instance source msgid "The target cluster lacks cluster state information:" msgstr "Il manque certaines informations d'état requises sur l'instance cible :" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 +#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:519 pg_upgrade.c:556 #: relfilenumber.c:231 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1495,72 +1525,72 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Configuration de la locale et de l'encodage pour la nouvelle instance" -#: pg_upgrade.c:450 +#: pg_upgrade.c:452 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyse de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:463 +#: pg_upgrade.c:465 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Gel de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:483 +#: pg_upgrade.c:485 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Restauration des objets globaux dans la nouvelle instance" -#: pg_upgrade.c:499 +#: pg_upgrade.c:501 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Restauration des schémas des bases de données dans la nouvelle instance" -#: pg_upgrade.c:605 +#: pg_upgrade.c:607 #, c-format msgid "Deleting files from new %s" msgstr "Suppression des fichiers à partir du nouveau %s" -#: pg_upgrade.c:609 +#: pg_upgrade.c:611 #, c-format msgid "could not delete directory \"%s\"" msgstr "n'a pas pu supprimer le répertoire « %s »" -#: pg_upgrade.c:628 +#: pg_upgrade.c:630 #, c-format msgid "Copying old %s to new server" msgstr "Copie de l'ancien %s vers le nouveau serveur" -#: pg_upgrade.c:654 +#: pg_upgrade.c:656 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Configuration du plus ancien XID sur la nouvelle instance" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance" -#: pg_upgrade.c:692 +#: pg_upgrade.c:694 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance" -#: pg_upgrade.c:716 +#: pg_upgrade.c:718 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance" -#: pg_upgrade.c:736 +#: pg_upgrade.c:738 #, c-format msgid "Resetting WAL archives" msgstr "Réinitialisation des archives WAL" -#: pg_upgrade.c:779 +#: pg_upgrade.c:781 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance" -#: pg_upgrade.c:781 +#: pg_upgrade.c:783 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Configuration du compteur minmxid dans la nouvelle instance" diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po index 5d2cff2a8c6..a46b54bec53 100644 --- a/src/bin/pg_upgrade/po/ja.po +++ b/src/bin/pg_upgrade/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL 16)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-09-26 10:21+0900\n" -"PO-Revision-Date: 2025-03-03 17:36+0900\n" +"POT-Creation-Date: 2025-07-07 17:04+0900\n" +"PO-Revision-Date: 2025-07-08 10:54+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -20,7 +20,7 @@ msgstr "" "X-Generator: Poedit 1.8.13\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: check.c:72 +#: check.c:73 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -29,7 +29,7 @@ msgstr "" "元の実行中サーバーの一貫性チェックを実行しています。\n" "--------------------------------------------------" -#: check.c:78 +#: check.c:79 #, c-format msgid "" "Performing Consistency Checks\n" @@ -38,7 +38,7 @@ msgstr "" "整合性チェックを実行しています。\n" "-----------------------------" -#: check.c:234 +#: check.c:242 #, c-format msgid "" "\n" @@ -47,7 +47,7 @@ msgstr "" "\n" "* クラスタは互換性があります *" -#: check.c:242 +#: check.c:250 #, c-format msgid "" "\n" @@ -58,7 +58,7 @@ msgstr "" "この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n" "initdbで再作成する必要があります。" -#: check.c:283 +#: check.c:291 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -69,7 +69,7 @@ msgstr "" "新サーバーを起動した後、以下を行うことを検討してください。\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:289 +#: check.c:297 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -78,7 +78,7 @@ msgstr "" "このスクリプトを実行すると、旧クラスタのデータファイルが削除されます:\n" " %s" -#: check.c:294 +#: check.c:302 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -91,57 +91,57 @@ msgstr "" "ファイルを削除するためのスクリプトを作成できませんでした。 古い\n" "クラスタの内容は手動で削除する必要があります。" -#: check.c:306 +#: check.c:314 #, c-format msgid "Checking cluster versions" msgstr "クラスタのバージョンを確認しています" -#: check.c:318 +#: check.c:326 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "このユーティリティではPostgreSQLバージョン%s以降のバージョンからのみアップグレードできます。" -#: check.c:323 +#: check.c:331 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "このユーティリティは、PostgreSQLバージョン%sにのみアップグレードできます。" -#: check.c:332 +#: check.c:340 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。" -#: check.c:337 +#: check.c:345 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。" -#: check.c:340 +#: check.c:348 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。" -#: check.c:355 +#: check.c:363 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "稼働中のサーバーをチェックする場合、新旧のポート番号が異なっている必要があります。" -#: check.c:375 +#: check.c:383 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました" -#: check.c:398 +#: check.c:406 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "新しいクラスタのテーブル空間ディレクトリを確認しています" -#: check.c:409 +#: check.c:417 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "新しいクラスタのテーブル空間ディレクトリはすでに存在します: \"%s\"" -#: check.c:442 +#: check.c:450 #, c-format msgid "" "\n" @@ -150,7 +150,7 @@ msgstr "" "\n" "警告: 新データディレクトリが旧データディレクトリ、つまり %sの中にあってはなりません" -#: check.c:466 +#: check.c:474 #, c-format msgid "" "\n" @@ -159,61 +159,62 @@ msgstr "" "\n" "警告: ユーザー定義テーブル空間の場所がデータディレクトリ、つまり %s の中にあってはなりません。" -#: check.c:476 +#: check.c:484 #, c-format msgid "Creating script to delete old cluster" msgstr "旧クラスタを削除するスクリプトを作成しています" -#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069 -#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476 +#: check.c:487 check.c:660 check.c:776 check.c:871 check.c:1000 check.c:1077 +#: check.c:1435 check.c:1509 file.c:339 function.c:163 option.c:476 #: version.c:116 version.c:292 version.c:426 #, c-format msgid "could not open file \"%s\": %s" msgstr "ファイル\"%s\"をオープンできませんでした: %s" -#: check.c:530 +#: check.c:538 #, c-format msgid "could not add execute permission to file \"%s\": %s" msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s" -#: check.c:550 +#: check.c:558 #, c-format msgid "Checking database user is the install user" msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています" -#: check.c:566 +#: check.c:574 #, c-format msgid "database user \"%s\" is not the install user" msgstr "データベースユーザー\"%s\"がインストールユーザーではありません" -#: check.c:577 +#: check.c:585 #, c-format msgid "could not determine the number of users" msgstr "ユーザー数を特定できませんでした" -#: check.c:585 +#: check.c:593 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。" -#: check.c:614 +#: check.c:622 #, c-format msgid "Checking database connection settings" msgstr "データベース接続の設定を確認しています" -#: check.c:640 +#: check.c:648 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 には接続を許可してはなりません。すなわち、pg_database.datallowconn は false である必要があります" -#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148 -#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362 -#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:675 check.c:796 check.c:894 check.c:1020 check.c:1097 check.c:1175 +#: check.c:1235 check.c:1296 check.c:1325 check.c:1359 check.c:1390 +#: check.c:1449 check.c:1530 function.c:185 version.c:192 version.c:232 +#: version.c:378 #, c-format msgid "fatal" msgstr "致命的" -#: check.c:668 +#: check.c:676 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -232,27 +233,27 @@ msgstr "" "一覧が以下のファイルにあります:\n" " %s" -#: check.c:693 +#: check.c:701 #, c-format msgid "Checking for prepared transactions" msgstr "準備済みトランザクションをチェックしています" -#: check.c:702 +#: check.c:710 #, c-format msgid "The source cluster contains prepared transactions" msgstr "移行元クラスタに準備済みトランザクションがあります" -#: check.c:704 +#: check.c:712 #, c-format msgid "The target cluster contains prepared transactions" msgstr "移行先クラスタに準備済みトランザクションがあります" -#: check.c:729 +#: check.c:737 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています" -#: check.c:789 +#: check.c:797 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -272,12 +273,12 @@ msgstr "" "問題のある関数の一覧は以下のファイルにあります:\n" " %s" -#: check.c:811 +#: check.c:819 #, c-format msgid "Checking for user-defined postfix operators" msgstr "ユーザー定義の後置演算子を確認しています" -#: check.c:887 +#: check.c:895 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -292,12 +293,12 @@ msgstr "" "以下のファイルにユーザー定義後置演算子の一覧があります:\n" " %s" -#: check.c:911 +#: check.c:919 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "非互換の多態関数を確認しています" -#: check.c:1013 +#: check.c:1021 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -315,12 +316,12 @@ msgstr "" "問題となるオブジェクトの一覧は以下のファイルにあります:\n" " %s" -#: check.c:1037 +#: check.c:1045 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS宣言されたテーブルをチェックしています" -#: check.c:1090 +#: check.c:1098 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -335,12 +336,41 @@ msgstr "" "以下のファイルにこの問題を抱えるテーブルの一覧があります:\n" " %s" -#: check.c:1118 +#: check.c:1123 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "非NULL制約の整合性を確認しています" + +#: check.c:1155 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンできませんでした: %m" + +#: check.c:1176 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"このクラスタには整合性の取れていない NOT NULL 制約があります。\n" +"親テーブルの列が NOT NULL である場合、子テーブルの列も NOT NULL としてマーク\n" +"されていなければ、アップグレードは失敗します。\n" +"この状態は、次のコマンドを\n" +" ALTER TABLE テーブル名 ALTER 列名 SET NOT NULL;\n" +"以下のファイルにリストされている各列に対して実行することで解消できます:\n" +"%s" + +#: check.c:1205 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "ユーザーテーブル内のシステム定義複合型を確認しています" -#: check.c:1149 +#: check.c:1236 #, c-format msgid "" "Your installation contains system-defined composite types in user tables.\n" @@ -357,12 +387,12 @@ msgstr "" "問題のある列の一覧は、以下のファイルにあります: \n" " %s" -#: check.c:1177 +#: check.c:1264 #, c-format msgid "Checking for reg* data types in user tables" msgstr "ユーザーテーブル内の reg * データ型をチェックしています" -#: check.c:1210 +#: check.c:1297 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -379,12 +409,12 @@ msgstr "" "問題のある列の一覧は以下のファイルにあります:\n" " %s" -#: check.c:1231 +#: check.c:1318 #, c-format msgid "Checking for incompatible \"%s\" data type in user tables" msgstr "ユーザーテーブル中で使用されている非互換の\"%s\"データ型をチェックしています" -#: check.c:1239 +#: check.c:1326 #, c-format msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" @@ -401,12 +431,12 @@ msgstr "" "問題のある列の一覧は以下のファイルにあります:\n" " %s" -#: check.c:1263 +#: check.c:1350 #, c-format msgid "Checking for removed \"%s\" data type in user tables" msgstr "ユーザーテーブル中で使用されている削除された\"%s\"データ型をチェックしています" -#: check.c:1273 +#: check.c:1360 #, c-format msgid "" "Your installation contains the \"%s\" data type in user tables.\n" @@ -422,12 +452,12 @@ msgstr "" "アップグレードを再実行できます。問題のある列の一覧は、以下のファイルにあります: \n" " %s" -#: check.c:1295 +#: check.c:1382 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "互換性のない\"jsonb\"データ型をチェックしています" -#: check.c:1304 +#: check.c:1391 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -444,12 +474,12 @@ msgstr "" "問題のある列の一覧は以下のファイルにあります:\n" " %s" -#: check.c:1331 +#: check.c:1418 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "'pg_' で始まるロールをチェックしています" -#: check.c:1363 +#: check.c:1450 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -465,12 +495,12 @@ msgstr "" "\"pg_\"で始まるロールの一覧は以下のファイルにあります:\n" " %s" -#: check.c:1383 +#: check.c:1470 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "ユーザー定義のエンコーディング変換を確認しています" -#: check.c:1444 +#: check.c:1531 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -528,7 +558,7 @@ msgstr "移行元クラスタにクラスタ状態情報がありません:" msgid "The target cluster lacks cluster state information:" msgstr "移行先クラスタにクラスタ状態情報がありません:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 +#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:519 pg_upgrade.c:556 #: relfilenumber.c:231 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1458,72 +1488,72 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "新クラスタの、ロケールとエンコーディングを設定しています" -#: pg_upgrade.c:450 +#: pg_upgrade.c:452 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "新クラスタ内のすべての行を分析しています" -#: pg_upgrade.c:463 +#: pg_upgrade.c:465 #, c-format msgid "Freezing all rows in the new cluster" msgstr "新クラスタ内のすべての行を凍結しています" -#: pg_upgrade.c:483 +#: pg_upgrade.c:485 #, c-format msgid "Restoring global objects in the new cluster" msgstr "新クラスタ内のグローバルオブジェクトを復元しています" -#: pg_upgrade.c:499 +#: pg_upgrade.c:501 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "新クラスタ内にデータベーススキーマを復元しています" -#: pg_upgrade.c:605 +#: pg_upgrade.c:607 #, c-format msgid "Deleting files from new %s" msgstr "新しい %s からファイルを削除しています" -#: pg_upgrade.c:609 +#: pg_upgrade.c:611 #, c-format msgid "could not delete directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: pg_upgrade.c:628 +#: pg_upgrade.c:630 #, c-format msgid "Copying old %s to new server" msgstr "旧の %s を新サーバーにコピーしています" -#: pg_upgrade.c:654 +#: pg_upgrade.c:656 #, c-format msgid "Setting oldest XID for new cluster" msgstr "新クラスタの、最古のXIDを設定しています" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "新クラスタの、次のトランザクションIDと基点を設定しています" -#: pg_upgrade.c:692 +#: pg_upgrade.c:694 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています" -#: pg_upgrade.c:716 +#: pg_upgrade.c:718 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "新クラスタの最古のmultixact IDを設定しています" -#: pg_upgrade.c:736 +#: pg_upgrade.c:738 #, c-format msgid "Resetting WAL archives" msgstr "WAL アーカイブをリセットしています" -#: pg_upgrade.c:779 +#: pg_upgrade.c:781 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています" -#: pg_upgrade.c:781 +#: pg_upgrade.c:783 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "新クラスタのminmxidカウンタを設定しています" diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po index 17129ab951c..1d7434440d6 100644 --- a/src/bin/pg_upgrade/po/ru.po +++ b/src/bin/pg_upgrade/po/ru.po @@ -1,14 +1,14 @@ # Russian message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" -"PO-Revision-Date: 2024-09-07 12:05+0300\n" +"POT-Creation-Date: 2025-08-09 07:12+0300\n" +"PO-Revision-Date: 2025-08-09 07:24+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: check.c:72 +#: check.c:73 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -27,7 +27,7 @@ msgstr "" "Проверка целостности на старом работающем сервере\n" "-------------------------------------------------" -#: check.c:78 +#: check.c:79 #, c-format msgid "" "Performing Consistency Checks\n" @@ -36,7 +36,7 @@ msgstr "" "Проведение проверок целостности\n" "-------------------------------" -#: check.c:234 +#: check.c:242 #, c-format msgid "" "\n" @@ -45,7 +45,7 @@ msgstr "" "\n" "*Кластеры совместимы*" -#: check.c:242 +#: check.c:250 #, c-format msgid "" "\n" @@ -57,7 +57,7 @@ msgstr "" "initdb\n" "для нового кластера, чтобы продолжить." -#: check.c:283 +#: check.c:291 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -68,7 +68,7 @@ msgstr "" "Запустив новый сервер, имеет смысл выполнить:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:289 +#: check.c:297 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -77,7 +77,7 @@ msgstr "" "При запуске этого скрипта будут удалены файлы данных старого кластера:\n" " %s" -#: check.c:294 +#: check.c:302 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -90,24 +90,24 @@ msgstr "" "пространства или каталог данных нового кластера.\n" "Содержимое старого кластера нужно будет удалить вручную." -#: check.c:306 +#: check.c:314 #, c-format msgid "Checking cluster versions" msgstr "Проверка версий кластеров" -#: check.c:318 +#: check.c:326 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "" "Эта утилита может производить обновление только с версии PostgreSQL %s и " "новее." -#: check.c:323 +#: check.c:331 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Эта утилита может повышать версию PostgreSQL только до %s." -#: check.c:332 +#: check.c:340 #, c-format msgid "" "This utility cannot be used to downgrade to older major PostgreSQL versions." @@ -115,7 +115,7 @@ msgstr "" "Эта утилита не может понижать версию до более старой основной версии " "PostgreSQL." -#: check.c:337 +#: check.c:345 #, c-format msgid "" "Old cluster data and binary directories are from different major versions." @@ -123,7 +123,7 @@ msgstr "" "Каталоги данных и исполняемых файлов старого кластера относятся к разным " "основным версиям." -#: check.c:340 +#: check.c:348 #, c-format msgid "" "New cluster data and binary directories are from different major versions." @@ -131,7 +131,7 @@ msgstr "" "Каталоги данных и исполняемых файлов нового кластера относятся к разным " "основным версиям." -#: check.c:355 +#: check.c:363 #, c-format msgid "" "When checking a live server, the old and new port numbers must be different." @@ -139,24 +139,24 @@ msgstr "" "Для проверки работающего сервера новый номер порта должен отличаться от " "старого." -#: check.c:375 +#: check.c:383 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "" "Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\"" -#: check.c:398 +#: check.c:406 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Проверка каталогов табличных пространств в новом кластере" -#: check.c:409 +#: check.c:417 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "" "каталог табличного пространства в новом кластере уже существует: \"%s\"" -#: check.c:442 +#: check.c:450 #, c-format msgid "" "\n" @@ -167,7 +167,7 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого " "каталога данных, то есть, в %s" -#: check.c:466 +#: check.c:474 #, c-format msgid "" "\n" @@ -178,49 +178,49 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны " "располагаться внутри каталога данных, то есть, в %s" -#: check.c:476 +#: check.c:484 #, c-format msgid "Creating script to delete old cluster" msgstr "Создание скрипта для удаления старого кластера" -#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069 -#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 +#: check.c:487 check.c:660 check.c:776 check.c:871 check.c:1000 check.c:1077 +#: check.c:1155 check.c:1435 check.c:1509 file.c:339 function.c:163 +#: option.c:476 version.c:116 version.c:292 version.c:426 #, c-format msgid "could not open file \"%s\": %s" msgstr "не удалось открыть файл \"%s\": %s" -#: check.c:530 +#: check.c:538 #, c-format msgid "could not add execute permission to file \"%s\": %s" msgstr "не удалось добавить право выполнения для файла \"%s\": %s" -#: check.c:550 +#: check.c:558 #, c-format msgid "Checking database user is the install user" msgstr "Проверка, является ли пользователь БД стартовым пользователем" -#: check.c:566 +#: check.c:574 #, c-format msgid "database user \"%s\" is not the install user" msgstr "пользователь БД \"%s\" не является стартовым пользователем" -#: check.c:577 +#: check.c:585 #, c-format msgid "could not determine the number of users" msgstr "не удалось определить количество пользователей" -#: check.c:585 +#: check.c:593 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "В новом кластере может быть определён только стартовый пользователь." -#: check.c:614 +#: check.c:622 #, c-format msgid "Checking database connection settings" msgstr "Проверка параметров подключения к базе данных" -#: check.c:640 +#: check.c:648 #, c-format msgid "" "template0 must not allow connections, i.e. its pg_database.datallowconn must " @@ -229,14 +229,15 @@ msgstr "" "база template0 не должна допускать подключения, то есть её свойство " "pg_database.datallowconn должно быть false" -#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148 -#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362 -#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:675 check.c:796 check.c:894 check.c:1020 check.c:1097 check.c:1175 +#: check.c:1235 check.c:1296 check.c:1325 check.c:1359 check.c:1390 +#: check.c:1449 check.c:1530 function.c:185 version.c:192 version.c:232 +#: version.c:378 #, c-format msgid "fatal" msgstr "сбой" -#: check.c:668 +#: check.c:676 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -255,27 +256,27 @@ msgstr "" "с этой проблемой содержится в файле:\n" " %s" -#: check.c:693 +#: check.c:701 #, c-format msgid "Checking for prepared transactions" msgstr "Проверка наличия подготовленных транзакций" -#: check.c:702 +#: check.c:710 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Исходный кластер содержит подготовленные транзакции" -#: check.c:704 +#: check.c:712 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Целевой кластер содержит подготовленные транзакции" -#: check.c:729 +#: check.c:737 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Проверка несоответствия при передаче bigint в contrib/isn" -#: check.c:789 +#: check.c:797 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -297,12 +298,12 @@ msgstr "" "проблемных функций приведён в файле:\n" " %s" -#: check.c:811 +#: check.c:819 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Проверка пользовательских постфиксных операторов" -#: check.c:887 +#: check.c:895 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -318,12 +319,12 @@ msgstr "" "Список пользовательских постфиксных операторов приведён в файле:\n" " %s" -#: check.c:911 +#: check.c:919 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Проверка несовместимых полиморфных функций" -#: check.c:1013 +#: check.c:1021 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -344,12 +345,12 @@ msgstr "" "Список проблемных объектов приведён в файле:\n" " %s" -#: check.c:1037 +#: check.c:1045 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Проверка таблиц со свойством WITH OIDS" -#: check.c:1090 +#: check.c:1098 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -365,12 +366,36 @@ msgstr "" "Список проблемных таблиц приведён в файле:\n" " %s" -#: check.c:1118 +#: check.c:1123 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Проверка несогласованных ограничений NOT NULL" + +#: check.c:1176 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"В вашей инсталляции содержатся несогласованные ограничения NOT NULL.\n" +"Если родительские столбцы помечены NOT NULL, пометку NOT NULL должны\n" +"иметь и их дочерние столбцы, иначе обновление невозможно.\n" +"Исправить эту ситуацию можно, выполнив:\n" +" ALTER TABLE имя_таблицы ALTER столбец SET NOT NULL;\n" +"для всех столбцов, перечисленных в файле:\n" +" %s" + +#: check.c:1205 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Проверка системных составных типов в пользовательских таблицах" -#: check.c:1149 +#: check.c:1236 #, c-format msgid "" "Your installation contains system-defined composite types in user tables.\n" @@ -387,12 +412,12 @@ msgstr "" "и перезапустить обновление. Список проблемных столбцов приведён в файле:\n" " %s" -#: check.c:1177 +#: check.c:1264 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Проверка типов данных reg* в пользовательских таблицах" -#: check.c:1210 +#: check.c:1297 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -410,12 +435,12 @@ msgstr "" "столбцов приведён в файле:\n" " %s" -#: check.c:1231 +#: check.c:1318 #, c-format msgid "Checking for incompatible \"%s\" data type in user tables" msgstr "Проверка несовместимого типа данных \"%s\" в пользовательских таблицах" -#: check.c:1239 +#: check.c:1326 #, c-format msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" @@ -434,12 +459,12 @@ msgstr "" "перезапустить обновление. Список проблемных столбцов приведён в файле:\n" " %s" -#: check.c:1263 +#: check.c:1350 #, c-format msgid "Checking for removed \"%s\" data type in user tables" msgstr "Проверка удалённого типа данных \"%s\" в пользовательских таблицах" -#: check.c:1273 +#: check.c:1360 #, c-format msgid "" "Your installation contains the \"%s\" data type in user tables.\n" @@ -457,12 +482,12 @@ msgstr "" "проблемных столбцов приведён в файле:\n" " %s" -#: check.c:1295 +#: check.c:1382 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Проверка несовместимого типа данных \"jsonb\"" -#: check.c:1304 +#: check.c:1391 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -479,12 +504,12 @@ msgstr "" "перезапустить обновление. Список проблемных столбцов приведён в файле:\n" " %s" -#: check.c:1331 +#: check.c:1418 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Проверка ролей с именами, начинающимися с \"pg_\"" -#: check.c:1363 +#: check.c:1450 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -499,12 +524,12 @@ msgstr "" "Список ролей с префиксом \"pg_\" приведён в файле:\n" " %s" -#: check.c:1383 +#: check.c:1470 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Проверка пользовательских перекодировок" -#: check.c:1444 +#: check.c:1531 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -2012,6 +2037,10 @@ msgstr "" "будучи выполненным администратором БД в psql, обновит все\n" "эти расширения." +#, c-format +#~ msgid "could not open file \"%s\": %m" +#~ msgstr "не удалось открыть файл \"%s\": %m" + #, c-format #~ msgid "" #~ "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po index b15caea63c6..0f2fb671e91 100644 --- a/src/bin/pg_upgrade/po/sv.po +++ b/src/bin/pg_upgrade/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-07-13 16:07+0000\n" -"PO-Revision-Date: 2024-07-14 22:05+0200\n" +"POT-Creation-Date: 2025-08-09 05:36+0000\n" +"PO-Revision-Date: 2025-08-09 20:08+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: check.c:72 +#: check.c:73 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -26,7 +26,7 @@ msgstr "" "Utför konsistenskontroller på gamla live-servern\n" "------------------------------------------------" -#: check.c:78 +#: check.c:79 #, c-format msgid "" "Performing Consistency Checks\n" @@ -35,7 +35,7 @@ msgstr "" "Utför konsistenskontroller\n" "--------------------------" -#: check.c:234 +#: check.c:242 #, c-format msgid "" "\n" @@ -44,7 +44,7 @@ msgstr "" "\n" "*Klustren är kompatibla*" -#: check.c:242 +#: check.c:250 #, c-format msgid "" "\n" @@ -55,7 +55,7 @@ msgstr "" "Om pg_upgrade misslyckas efter denna punkt så måste du\n" "köra om initdb på nya klustret innan du fortsätter." -#: check.c:283 +#: check.c:291 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -66,7 +66,7 @@ msgstr "" "När du startar nya servern så vill du nog köra:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:289 +#: check.c:297 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -75,7 +75,7 @@ msgstr "" "När detta skript körs så raderas gamla klustrets datafiler:\n" " %s" -#: check.c:294 +#: check.c:302 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -88,57 +88,57 @@ msgstr "" "ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n" "måste raderas för hand." -#: check.c:306 +#: check.c:314 #, c-format msgid "Checking cluster versions" msgstr "Kontrollerar klustrets versioner" -#: check.c:318 +#: check.c:326 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version %s eller senare." -#: check.c:323 +#: check.c:331 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s." -#: check.c:332 +#: check.c:340 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL." -#: check.c:337 +#: check.c:345 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner." -#: check.c:340 +#: check.c:348 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "Nya klusterdata och binära kataloger är från olika major-versioner." -#: check.c:355 +#: check.c:363 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika." -#: check.c:375 +#: check.c:383 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"" -#: check.c:398 +#: check.c:406 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Letar efter nya tablespace-kataloger i klustret" -#: check.c:409 +#: check.c:417 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"" -#: check.c:442 +#: check.c:450 #, c-format msgid "" "\n" @@ -147,7 +147,7 @@ msgstr "" "\n" "VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s" -#: check.c:466 +#: check.c:474 #, c-format msgid "" "\n" @@ -156,61 +156,62 @@ msgstr "" "\n" "VARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s" -#: check.c:476 +#: check.c:484 #, c-format msgid "Creating script to delete old cluster" msgstr "Skapar skript för att radera gamla klustret" -#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069 -#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 +#: check.c:487 check.c:660 check.c:776 check.c:871 check.c:1000 check.c:1077 +#: check.c:1155 check.c:1435 check.c:1509 file.c:339 function.c:163 +#: option.c:476 version.c:116 version.c:292 version.c:426 #, c-format msgid "could not open file \"%s\": %s" msgstr "kunde inte öppna fil \"%s\": %s" -#: check.c:530 +#: check.c:538 #, c-format msgid "could not add execute permission to file \"%s\": %s" msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s" -#: check.c:550 +#: check.c:558 #, c-format msgid "Checking database user is the install user" msgstr "Kontrollerar att databasanvändaren är installationsanvändaren" -#: check.c:566 +#: check.c:574 #, c-format msgid "database user \"%s\" is not the install user" msgstr "databasanvändare \"%s\" är inte installationsanvändaren" -#: check.c:577 +#: check.c:585 #, c-format msgid "could not determine the number of users" msgstr "kunde inte bestämma antalet användare" -#: check.c:585 +#: check.c:593 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Bara installationsanvändaren får finnas i nya klustret." -#: check.c:614 +#: check.c:622 #, c-format msgid "Checking database connection settings" msgstr "Kontrollerar databasens anslutningsinställningar" -#: check.c:640 +#: check.c:648 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false" -#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148 -#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362 -#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:675 check.c:796 check.c:894 check.c:1020 check.c:1097 check.c:1175 +#: check.c:1235 check.c:1296 check.c:1325 check.c:1359 check.c:1390 +#: check.c:1449 check.c:1530 function.c:185 version.c:192 version.c:232 +#: version.c:378 #, c-format msgid "fatal" msgstr "fatalt" -#: check.c:668 +#: check.c:676 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -229,27 +230,27 @@ msgstr "" "problemdatabaser finns i filen:\n" " %s" -#: check.c:693 +#: check.c:701 #, c-format msgid "Checking for prepared transactions" msgstr "Letar efter förberedda transaktioner" -#: check.c:702 +#: check.c:710 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Källklustret innehåller förberedda transaktioner" -#: check.c:704 +#: check.c:712 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Målklustret innehåller förberedda transaktioner" -#: check.c:729 +#: check.c:737 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Letar efter contrib/isn med bigint-anropsfel" -#: check.c:789 +#: check.c:797 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -268,12 +269,12 @@ msgstr "" "En lista med problemfunktionerna finns i filen:\n" " %s" -#: check.c:811 +#: check.c:819 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Letar efter användardefinierade postfix-operatorer" -#: check.c:887 +#: check.c:895 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -288,12 +289,12 @@ msgstr "" "En lista med användardefinierade postfix-operatorer finns i filen:\n" " %s" -#: check.c:911 +#: check.c:919 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Letar efter inkompatibla polymorfa funktioner" -#: check.c:1013 +#: check.c:1021 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -314,12 +315,12 @@ msgstr "" "En lista med problemobjekten finns i filen:\n" " %s" -#: check.c:1037 +#: check.c:1045 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Letar efter tabeller med WITH OIDS" -#: check.c:1090 +#: check.c:1098 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -334,12 +335,36 @@ msgstr "" "En lista över tabeller med detta problem finns i filen:\n" " %s" -#: check.c:1118 +#: check.c:1123 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Kontrollerar att icke-null-villkor är konsistenta" + +#: check.c:1176 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Din installation har inkonsistenta NOT NULL-villkor.\n" +"Om en föräldrakolumn är NOT NULL så måste barnkolumnen också\n" +"sättas till NOT NULL annars så kommer uppgraderingen misslyckas.\n" +"Du kan lösa detta genom att köra\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"för varje kolumn som listas i filen:\n" +" %s" + +#: check.c:1205 #, c-format msgid "Checking for system-defined composite types in user tables" msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\"" -#: check.c:1149 +#: check.c:1236 #, c-format msgid "" "Your installation contains system-defined composite types in user tables.\n" @@ -357,12 +382,12 @@ msgstr "" " %s" # FIXME: is this msgid correct? -#: check.c:1177 +#: check.c:1264 #, c-format msgid "Checking for reg* data types in user tables" msgstr "Letar efter reg*-datatyper i användartabeller" -#: check.c:1210 +#: check.c:1297 #, c-format msgid "" "Your installation contains one of the reg* data types in user tables.\n" @@ -379,12 +404,12 @@ msgstr "" "En lista med problemkolumner finns i filen:\n" " %s" -#: check.c:1231 +#: check.c:1318 #, c-format msgid "Checking for incompatible \"%s\" data type in user tables" msgstr "Letar efter inkompatibel \"%s\"-datatyp i användartabeller" -#: check.c:1239 +#: check.c:1326 #, c-format msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" @@ -401,12 +426,12 @@ msgstr "" "En lista med problemkolumner finns i filen:\n" " %s" -#: check.c:1263 +#: check.c:1350 #, c-format msgid "Checking for removed \"%s\" data type in user tables" msgstr "Letar efter borttagen \"%s\"-datatype i användartabeller" -#: check.c:1273 +#: check.c:1360 #, c-format msgid "" "Your installation contains the \"%s\" data type in user tables.\n" @@ -424,12 +449,12 @@ msgstr "" " %s" # FIXME: is this msgid correct? -#: check.c:1295 +#: check.c:1382 #, c-format msgid "Checking for incompatible \"jsonb\" data type" msgstr "Letar efter inkompatibel \"jsonb\"-datatyp" -#: check.c:1304 +#: check.c:1391 #, c-format msgid "" "Your installation contains the \"jsonb\" data type in user tables.\n" @@ -446,12 +471,12 @@ msgstr "" "En lista med problemkolumner finns i filen:\n" " %s" -#: check.c:1331 +#: check.c:1418 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Letar efter roller som startar med \"pg_\"" -#: check.c:1363 +#: check.c:1450 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -466,12 +491,12 @@ msgstr "" "En lista med rollerna som startar på \"pg_\" finns i denna fil:\n" " %s" -#: check.c:1383 +#: check.c:1470 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Letar efter användardefinierade teckenkodkonverteringar" -#: check.c:1444 +#: check.c:1531 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -528,7 +553,7 @@ msgstr "Källklustret saknar information om kluster-state:" msgid "The target cluster lacks cluster state information:" msgstr "Målklustret saknar information om kluster-state:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 +#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:519 pg_upgrade.c:556 #: relfilenumber.c:231 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1219,7 +1244,7 @@ msgstr " -V, --version visa versionsinformation, avsluta sedan\ #: option.c:290 #, c-format msgid " --clone clone instead of copying files to new cluster\n" -msgstr " -clone klona istället för att kopiera filer till nya klustret\n" +msgstr " --clone klona istället för att kopiera filer till nya klustret\n" #: option.c:291 #, c-format @@ -1455,72 +1480,72 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Sätter lokal och teckenkodning för nya klustret" -#: pg_upgrade.c:450 +#: pg_upgrade.c:452 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyserar alla rader i nya klustret" -#: pg_upgrade.c:463 +#: pg_upgrade.c:465 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Fryser alla rader i nya klustret" -#: pg_upgrade.c:483 +#: pg_upgrade.c:485 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Återställer globala objekt i nya klustret" -#: pg_upgrade.c:499 +#: pg_upgrade.c:501 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Återställer databasscheman i nya klustret" -#: pg_upgrade.c:605 +#: pg_upgrade.c:607 #, c-format msgid "Deleting files from new %s" msgstr "Raderar filer från ny %s" -#: pg_upgrade.c:609 +#: pg_upgrade.c:611 #, c-format msgid "could not delete directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" -#: pg_upgrade.c:628 +#: pg_upgrade.c:630 #, c-format msgid "Copying old %s to new server" msgstr "Kopierar gammal %s till ny server" -#: pg_upgrade.c:654 +#: pg_upgrade.c:656 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Sätter äldsta XID för nya klustret" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster" -#: pg_upgrade.c:692 +#: pg_upgrade.c:694 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Sätter nästa multixact-ID och offset för nytt kluster" -#: pg_upgrade.c:716 +#: pg_upgrade.c:718 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Sätter äldsta multixact-ID i nytt kluster" -#: pg_upgrade.c:736 +#: pg_upgrade.c:738 #, c-format msgid "Resetting WAL archives" msgstr "Resettar WAL-arkiv" -#: pg_upgrade.c:779 +#: pg_upgrade.c:781 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster" -#: pg_upgrade.c:781 +#: pg_upgrade.c:783 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Sätter räknarenm minmxid för nytt kluster" diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po index a552b7399d1..a25b535f642 100644 --- a/src/bin/pg_verifybackup/po/ru.po +++ b/src/bin/pg_verifybackup/po/ru.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-08-28 07:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 09:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -46,74 +46,74 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../../common/jsonapi.c:1144 +#: ../../common/jsonapi.c:1147 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%s\"." -#: ../../common/jsonapi.c:1147 +#: ../../common/jsonapi.c:1150 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:1150 +#: ../../common/jsonapi.c:1153 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"." -#: ../../common/jsonapi.c:1153 +#: ../../common/jsonapi.c:1156 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1156 +#: ../../common/jsonapi.c:1159 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1159 +#: ../../common/jsonapi.c:1162 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ожидалось \":\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1162 +#: ../../common/jsonapi.c:1165 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1165 +#: ../../common/jsonapi.c:1168 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:1167 +#: ../../common/jsonapi.c:1170 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1170 +#: ../../common/jsonapi.c:1173 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1173 +#: ../../common/jsonapi.c:1176 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ожидалась строка, но обнаружено \"%s\"." -#: ../../common/jsonapi.c:1176 +#: ../../common/jsonapi.c:1179 #, c-format msgid "Token \"%s\" is invalid." msgstr "Ошибочный элемент \"%s\"." -#: ../../common/jsonapi.c:1179 +#: ../../common/jsonapi.c:1182 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:1181 +#: ../../common/jsonapi.c:1184 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:1184 +#: ../../common/jsonapi.c:1187 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -121,18 +121,18 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:1187 +#: ../../common/jsonapi.c:1190 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../../common/jsonapi.c:1190 +#: ../../common/jsonapi.c:1193 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:1192 +#: ../../common/jsonapi.c:1195 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po index 34f3886078a..aef959eda4a 100644 --- a/src/bin/pg_waldump/po/ru.po +++ b/src/bin/pg_waldump/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-02-02 18:10+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 08:59+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -460,52 +460,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: xlogreader.c:671 xlogreader.c:1136 +#: xlogreader.c:671 xlogreader.c:1146 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "" "неверная длина записи в позиции %X/%X: ожидалось минимум %u, получено %u" -#: xlogreader.c:760 +#: xlogreader.c:761 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:773 +#: xlogreader.c:774 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: xlogreader.c:1144 +#: xlogreader.c:1154 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: xlogreader.c:1157 xlogreader.c:1173 +#: xlogreader.c:1167 xlogreader.c:1183 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1211 +#: xlogreader.c:1221 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: xlogreader.c:1245 +#: xlogreader.c:1255 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверное магическое число %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1260 xlogreader.c:1302 +#: xlogreader.c:1270 xlogreader.c:1312 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неверные информационные биты %04X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1276 +#: xlogreader.c:1286 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -514,7 +514,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: xlogreader.c:1284 +#: xlogreader.c:1294 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -523,7 +523,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: xlogreader.c:1290 +#: xlogreader.c:1300 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -532,12 +532,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: xlogreader.c:1322 +#: xlogreader.c:1332 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "неожиданный pageaddr %X/%X в сегменте WAL %s, LSN %X/%X, смещение %u" -#: xlogreader.c:1348 +#: xlogreader.c:1358 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -546,23 +546,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1754 +#: xlogreader.c:1764 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1778 +#: xlogreader.c:1788 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1785 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1821 +#: xlogreader.c:1831 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -571,21 +571,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1837 +#: xlogreader.c:1847 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1866 +#: xlogreader.c:1876 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -594,41 +594,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1882 +#: xlogreader.c:1892 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1894 +#: xlogreader.c:1904 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1961 +#: xlogreader.c:1971 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:1987 +#: xlogreader.c:1997 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2071 +#: xlogreader.c:2081 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2078 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: xlogreader.c:2105 xlogreader.c:2122 +#: xlogreader.c:2115 xlogreader.c:2132 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -637,7 +637,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2131 +#: xlogreader.c:2141 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -645,7 +645,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2139 +#: xlogreader.c:2149 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po index c897383e2ad..84e2c497960 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2025-02-08 08:33+0200\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -6825,7 +6825,7 @@ msgstr "лишний аргумент \"%s\" проигнорирован" msgid "could not find own program executable" msgstr "не удалось найти свой исполняемый файл" -#: tab-complete.c:6078 +#: tab-complete.c:6092 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/src/interfaces/ecpg/ecpglib/po/ru.po b/src/interfaces/ecpg/ecpglib/po/ru.po index 16560ed8d3b..d4dddfb23ba 100644 --- a/src/interfaces/ecpg/ecpglib/po/ru.po +++ b/src/interfaces/ecpg/ecpglib/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ecpglib (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-08-28 07:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2019-09-09 13:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,11 +17,11 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: connect.c:243 +#: connect.c:248 msgid "empty message text" msgstr "пустое сообщение" -#: connect.c:410 connect.c:675 +#: connect.c:415 connect.c:680 msgid "" msgstr "<ПО_УМОЛЧАНИЮ>" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index d94c040ac9f..68680560c28 100644 --- a/src/interfaces/libpq/po/ru.po +++ b/src/interfaces/libpq/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2025-05-03 16:34+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -82,11 +82,12 @@ msgstr "не удалось сгенерировать разовый код" #: fe-connect.c:6206 fe-connect.c:6233 fe-connect.c:6309 fe-connect.c:6332 #: fe-connect.c:6356 fe-connect.c:6391 fe-connect.c:6477 fe-connect.c:6485 #: fe-connect.c:6842 fe-connect.c:6992 fe-exec.c:527 fe-exec.c:1323 -#: fe-exec.c:3132 fe-exec.c:4157 fe-exec.c:4323 fe-gssapi-common.c:109 +#: fe-exec.c:3132 fe-exec.c:4159 fe-exec.c:4325 fe-gssapi-common.c:109 #: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:251 #: fe-protocol3.c:268 fe-protocol3.c:348 fe-protocol3.c:715 fe-protocol3.c:954 #: fe-protocol3.c:1765 fe-protocol3.c:2165 fe-secure-common.c:110 -#: fe-secure-gssapi.c:496 fe-secure-openssl.c:435 fe-secure-openssl.c:1271 +#: fe-secure-gssapi.c:506 fe-secure-gssapi.c:696 fe-secure-openssl.c:435 +#: fe-secure-openssl.c:1271 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -809,21 +810,21 @@ msgstr "неверный символ, закодированный с %%: \"%s\ msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "недопустимое значение %%00 для символа, закодированного с %%: \"%s\"" -#: fe-connect.c:7244 +#: fe-connect.c:7246 msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7252 fe-exec.c:710 fe-exec.c:972 fe-exec.c:3321 +#: fe-connect.c:7254 fe-exec.c:710 fe-exec.c:972 fe-exec.c:3321 #: fe-protocol3.c:969 fe-protocol3.c:1002 msgid "out of memory\n" msgstr "нехватка памяти\n" -#: fe-connect.c:7543 +#: fe-connect.c:7545 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:7552 +#: fe-connect.c:7554 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -832,7 +833,7 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: к файлу паролей \"%s\" имеют доступ все или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7659 +#: fe-connect.c:7661 #, c-format msgid "password retrieved from file \"%s\"" msgstr "пароль получен из файла \"%s\"" @@ -988,12 +989,12 @@ msgstr "номер параметра %d вне диапазона 0..%d" msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:4006 fe-exec.c:4119 +#: fe-exec.c:4007 fe-exec.c:4121 #, c-format msgid "incomplete multibyte character" msgstr "неполный многобайтный символ" -#: fe-exec.c:4008 fe-exec.c:4138 +#: fe-exec.c:4009 fe-exec.c:4140 #, c-format msgid "invalid multibyte character" msgstr "неверный многобайтный символ" @@ -1054,12 +1055,12 @@ msgstr "функция pqGetInt не поддерживает integer разме msgid "integer of size %lu not supported by pqPutInt" msgstr "функция pqPutInt не поддерживает integer размером %lu байт" -#: fe-misc.c:573 +#: fe-misc.c:599 #, c-format msgid "connection not open" msgstr "соединение не открыто" -#: fe-misc.c:751 fe-secure-openssl.c:210 fe-secure-openssl.c:316 +#: fe-misc.c:777 fe-secure-openssl.c:210 fe-secure-openssl.c:316 #: fe-secure.c:259 fe-secure.c:426 #, c-format msgid "" @@ -1071,21 +1072,21 @@ msgstr "" "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса." -#: fe-misc.c:818 +#: fe-misc.c:844 msgid "connection not open\n" msgstr "соединение не открыто\n" -#: fe-misc.c:1003 +#: fe-misc.c:1029 #, c-format msgid "timeout expired" msgstr "тайм-аут" -#: fe-misc.c:1047 +#: fe-misc.c:1073 #, c-format msgid "invalid socket" msgstr "неверный сокет" -#: fe-misc.c:1069 +#: fe-misc.c:1095 #, c-format msgid "%s() failed: %s" msgstr "ошибка в %s(): %s" @@ -1299,46 +1300,42 @@ msgstr "серверный сертификат для \"%s\" не соотве msgid "could not get server's host name from server certificate" msgstr "не удалось получить имя сервера из серверного сертификата" -#: fe-secure-gssapi.c:194 +#: fe-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:215 fe-secure-gssapi.c:723 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "клиент попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:599 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "сервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:386 +#: fe-secure-gssapi.c:393 msgid "GSSAPI unwrap error" msgstr "ошибка развёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:395 +#: fe-secure-gssapi.c:402 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "входящее сообщение GSSAPI не защищено" -#: fe-secure-gssapi.c:652 +#: fe-secure-gssapi.c:662 msgid "could not initiate GSSAPI security context" msgstr "не удалось инициализировать контекст безопасности GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:712 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: fe-secure-gssapi.c:692 -msgid "GSSAPI context establishment error" -msgstr "ошибка установления контекста в GSSAPI" - #: fe-secure-openssl.c:214 fe-secure-openssl.c:320 fe-secure-openssl.c:1518 #, c-format msgid "SSL SYSCALL error: %s" @@ -1576,6 +1573,9 @@ msgstr "не удалось передать данные серверу: %s" msgid "unrecognized socket error: 0x%08X/%d" msgstr "нераспознанная ошибка сокета: 0x%08X/%d" +#~ msgid "GSSAPI context establishment error" +#~ msgstr "ошибка установления контекста в GSSAPI" + #, c-format #~ msgid "keepalives parameter must be an integer" #~ msgstr "параметр keepalives должен быть целым числом" diff --git a/src/pl/plpgsql/src/po/ru.po b/src/pl/plpgsql/src/po/ru.po index 0d15ee48a19..5ca2e1eff66 100644 --- a/src/pl/plpgsql/src/po/ru.po +++ b/src/pl/plpgsql/src/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-03 15:59+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2022-09-05 13:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -79,7 +79,7 @@ msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Подразумевается ссылка на переменную PL/pgSQL или столбец таблицы." #: pl_comp.c:1314 pl_exec.c:5258 pl_exec.c:5431 pl_exec.c:5518 pl_exec.c:5609 -#: pl_exec.c:6634 +#: pl_exec.c:6638 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "в записи \"%s\" нет поля \"%s\"" @@ -104,7 +104,7 @@ msgstr "переменная \"%s\" имеет псевдотип %s" msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" является пустышкой" -#: pl_comp.c:2194 pl_exec.c:6935 +#: pl_comp.c:2194 pl_exec.c:6939 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" @@ -354,7 +354,7 @@ msgstr "" msgid "structure of query does not match function result type" msgstr "структура запроса не соответствует типу результата функции" -#: pl_exec.c:3632 pl_exec.c:4468 pl_exec.c:8759 +#: pl_exec.c:3632 pl_exec.c:4468 pl_exec.c:8763 #, c-format msgid "query string argument of EXECUTE is null" msgstr "в качестве текста запроса в EXECUTE передан NULL" @@ -486,7 +486,7 @@ msgstr "присвоить значение системному столбцу msgid "query did not return data" msgstr "запрос не вернул данные" -#: pl_exec.c:5717 pl_exec.c:5729 pl_exec.c:5754 pl_exec.c:5830 pl_exec.c:5835 +#: pl_exec.c:5717 pl_exec.c:5729 pl_exec.c:5754 pl_exec.c:5834 pl_exec.c:5839 #, c-format msgid "query: %s" msgstr "запрос: %s" @@ -499,17 +499,17 @@ msgstr[0] "запрос вернул %d столбец" msgstr[1] "запрос вернул %d столбца" msgstr[2] "запрос вернул %d столбцов" -#: pl_exec.c:5829 +#: pl_exec.c:5833 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "запрос - не просто SELECT, а SELECT INTO" -#: pl_exec.c:5834 +#: pl_exec.c:5838 #, c-format msgid "query is not a SELECT" msgstr "запрос - не SELECT" -#: pl_exec.c:6648 pl_exec.c:6688 pl_exec.c:6728 +#: pl_exec.c:6652 pl_exec.c:6692 pl_exec.c:6732 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -517,35 +517,35 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: pl_exec.c:7139 pl_exec.c:7173 pl_exec.c:7247 pl_exec.c:7273 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "в левой и правой части присваивания разное количество полей" #. translator: %s represents a name of an extra check -#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 +#: pl_exec.c:7145 pl_exec.c:7179 pl_exec.c:7253 pl_exec.c:7279 #, c-format msgid "%s check of %s is active." msgstr "Включена проверка %s (с %s)." -#: pl_exec.c:7145 pl_exec.c:7179 pl_exec.c:7253 pl_exec.c:7279 +#: pl_exec.c:7149 pl_exec.c:7183 pl_exec.c:7257 pl_exec.c:7283 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "" "Измените запрос, чтобы он возвращал в точности требуемый список столбцов." -#: pl_exec.c:7666 +#: pl_exec.c:7670 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "записи \"%s\" не присвоено значение" -#: pl_exec.c:7667 +#: pl_exec.c:7671 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "" "Для записи, которой не присвоено значение, структура кортежа не определена." -#: pl_exec.c:8357 pl_gram.y:3473 +#: pl_exec.c:8361 pl_gram.y:3473 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "переменная \"%s\" объявлена как CONSTANT" diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 8088333cd4f..55c717b2d70 100644 --- a/src/pl/plpython/po/ru.po +++ b/src/pl/plpython/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:45+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -66,7 +66,7 @@ msgstr "" msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" -#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 +#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" From 850caae60c49c15ed021f8051dc39c6e24f2a380 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Mon, 11 Aug 2025 06:18:59 -0700 Subject: [PATCH 112/115] Convert newlines to spaces in names written in v11+ pg_dump comments. Maliciously-crafted object names could achieve SQL injection during restore. CVE-2012-0868 fixed this class of problem at the time, but later work reintroduced three cases. Commit bc8cd50fefd369b217f80078585c486505aafb62 (back-patched to v11+ in 2023-05 releases) introduced the pg_dump case. Commit 6cbdbd9e8d8f2986fde44f2431ed8d0c8fce7f5d (v12+) introduced the two pg_dumpall cases. Move sanitize_line(), unchanged, to dumputils.c so pg_dumpall has access to it in all supported versions. Back-patch to v13 (all supported versions). Reviewed-by: Robert Haas Reviewed-by: Nathan Bossart Backpatch-through: 13 Security: CVE-2025-8715 --- src/bin/pg_dump/dumputils.c | 37 ++++++++++++++++++++ src/bin/pg_dump/dumputils.h | 1 + src/bin/pg_dump/pg_backup_archiver.c | 37 -------------------- src/bin/pg_dump/pg_dump.c | 5 ++- src/bin/pg_dump/pg_dumpall.c | 13 +++++-- src/bin/pg_dump/t/002_pg_dump.pl | 21 +++++++++++ src/bin/pg_dump/t/003_pg_dump_with_server.pl | 17 ++++++++- 7 files changed, 90 insertions(+), 41 deletions(-) diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index d2851cf568e..43891955761 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -29,6 +29,43 @@ static void AddAcl(PQExpBuffer aclbuf, const char *keyword, const char *subname); +/* + * Sanitize a string to be included in an SQL comment or TOC listing, by + * replacing any newlines with spaces. This ensures each logical output line + * is in fact one physical output line, to prevent corruption of the dump + * (which could, in the worst case, present an SQL injection vulnerability + * if someone were to incautiously load a dump containing objects with + * maliciously crafted names). + * + * The result is a freshly malloc'd string. If the input string is NULL, + * return a malloc'ed empty string, unless want_hyphen, in which case return a + * malloc'ed hyphen. + * + * Note that we currently don't bother to quote names, meaning that the name + * fields aren't automatically parseable. "pg_restore -L" doesn't care because + * it only examines the dumpId field, but someday we might want to try harder. + */ +char * +sanitize_line(const char *str, bool want_hyphen) +{ + char *result; + char *s; + + if (!str) + return pg_strdup(want_hyphen ? "-" : ""); + + result = pg_strdup(str); + + for (s = result; *s != '\0'; s++) + { + if (*s == '\n' || *s == '\r') + *s = ' '; + } + + return result; +} + + /* * Build GRANT/REVOKE command(s) for an object. * diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index 2c81f51837b..a6b8b478638 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -36,6 +36,7 @@ #endif +extern char *sanitize_line(const char *str, bool want_hyphen); extern bool buildACLCommands(const char *name, const char *subname, const char *nspname, const char *type, const char *acls, const char *baseacls, const char *owner, const char *prefix, int remoteVersion, diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 3448aba12f4..b1ea5db46ee 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -69,7 +69,6 @@ static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, SetupWorkerPtrType setupWorkerPtr); static void _getObjectDescription(PQExpBuffer buf, const TocEntry *te); static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData); -static char *sanitize_line(const char *str, bool want_hyphen); static void _doSetFixedOutputState(ArchiveHandle *AH); static void _doSetSessionAuth(ArchiveHandle *AH, const char *user); static void _reconnectToDB(ArchiveHandle *AH, const char *dbname); @@ -3684,42 +3683,6 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) } } -/* - * Sanitize a string to be included in an SQL comment or TOC listing, by - * replacing any newlines with spaces. This ensures each logical output line - * is in fact one physical output line, to prevent corruption of the dump - * (which could, in the worst case, present an SQL injection vulnerability - * if someone were to incautiously load a dump containing objects with - * maliciously crafted names). - * - * The result is a freshly malloc'd string. If the input string is NULL, - * return a malloc'ed empty string, unless want_hyphen, in which case return a - * malloc'ed hyphen. - * - * Note that we currently don't bother to quote names, meaning that the name - * fields aren't automatically parseable. "pg_restore -L" doesn't care because - * it only examines the dumpId field, but someday we might want to try harder. - */ -static char * -sanitize_line(const char *str, bool want_hyphen) -{ - char *result; - char *s; - - if (!str) - return pg_strdup(want_hyphen ? "-" : ""); - - result = pg_strdup(str); - - for (s = result; *s != '\0'; s++) - { - if (*s == '\n' || *s == '\r') - *s = ' '; - } - - return result; -} - /* * Write the file header for a custom-format archive */ diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 21fac81fa09..427e4ae1322 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2609,11 +2609,14 @@ dumpTableData(Archive *fout, const TableDataInfo *tdinfo) forcePartitionRootLoad(tbinfo))) { TableInfo *parentTbinfo; + char *sanitized; parentTbinfo = getRootTableInfo(tbinfo); copyFrom = fmtQualifiedDumpable(parentTbinfo); + sanitized = sanitize_line(copyFrom, true); printfPQExpBuffer(copyBuf, "-- load via partition root %s", - copyFrom); + sanitized); + free(sanitized); tdDefn = pg_strdup(copyBuf->data); } else diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 36408b3676c..41dc2cbaaca 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1447,7 +1447,13 @@ dumpUserConfig(PGconn *conn, const char *username) res = executeQuery(conn, buf->data); if (PQntuples(res) > 0) - fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", username); + { + char *sanitized; + + sanitized = sanitize_line(username, true); + fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", sanitized); + free(sanitized); + } for (int i = 0; i < PQntuples(res); i++) { @@ -1549,6 +1555,7 @@ dumpDatabases(PGconn *conn) for (i = 0; i < PQntuples(res); i++) { char *dbname = PQgetvalue(res, i, 0); + char *sanitized; const char *create_opts; int ret; @@ -1565,7 +1572,9 @@ dumpDatabases(PGconn *conn) pg_log_info("dumping database \"%s\"", dbname); - fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname); + sanitized = sanitize_line(dbname, true); + fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", sanitized); + free(sanitized); /* * We assume that "template1" and "postgres" already exist in the diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index b633b95f0d7..b052510537d 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -1907,6 +1907,27 @@ }, }, + 'newline of role or table name in comment' => { + create_sql => qq{CREATE ROLE regress_newline; + ALTER ROLE regress_newline SET enable_seqscan = off; + ALTER ROLE regress_newline + RENAME TO "regress_newline\nattack"; + + -- meet getPartitioningInfo() "unsafe" condition + CREATE TYPE pp_colors AS + ENUM ('green', 'blue', 'black'); + CREATE TABLE pp_enumpart (a pp_colors) + PARTITION BY HASH (a); + CREATE TABLE pp_enumpart1 PARTITION OF pp_enumpart + FOR VALUES WITH (MODULUS 2, REMAINDER 0); + CREATE TABLE pp_enumpart2 PARTITION OF pp_enumpart + FOR VALUES WITH (MODULUS 2, REMAINDER 1); + ALTER TABLE pp_enumpart + RENAME TO "pp_enumpart\nattack";}, + regexp => qr/\n--[^\n]*\nattack/s, + like => {}, + }, + 'CREATE DATABASE regression_invalid...' => { create_order => 1, create_sql => q( diff --git a/src/bin/pg_dump/t/003_pg_dump_with_server.pl b/src/bin/pg_dump/t/003_pg_dump_with_server.pl index ab025c44a43..6c6bee4fe0c 100644 --- a/src/bin/pg_dump/t/003_pg_dump_with_server.pl +++ b/src/bin/pg_dump/t/003_pg_dump_with_server.pl @@ -16,6 +16,22 @@ $node->init; $node->start; +######################################### +# pg_dumpall: newline in database name + +$node->safe_psql('postgres', qq{CREATE DATABASE "regress_\nattack"}); + +my (@cmd, $stdout, $stderr); +@cmd = ("pg_dumpall", '--port' => $port, '--exclude-database=postgres'); +print("# Running: " . join(" ", @cmd) . "\n"); +my $result = IPC::Run::run \@cmd, '>' => \$stdout, '2>' => \$stderr; +ok(!$result, "newline in dbname: exit code not 0"); +like( + $stderr, + qr/shell command argument contains a newline/, + "newline in dbname: stderr matches"); +unlike($stdout, qr/^attack/m, "newline in dbname: no comment escape"); + ######################################### # Verify that dumping foreign data includes only foreign tables of # matching servers @@ -26,7 +42,6 @@ $node->safe_psql('postgres', "CREATE SERVER s2 FOREIGN DATA WRAPPER dummy"); $node->safe_psql('postgres', "CREATE FOREIGN TABLE t0 (a int) SERVER s0"); $node->safe_psql('postgres', "CREATE FOREIGN TABLE t1 (a int) SERVER s1"); -my ($cmd, $stdout, $stderr, $result); command_fails_like( [ "pg_dump", '-p', $port, '--include-foreign-data=s0', 'postgres' ], From 7ad8e790988d3a49010ec00e0cec0dace4c7416f Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Mon, 11 Aug 2025 09:00:00 -0500 Subject: [PATCH 113/115] Restrict psql meta-commands in plain-text dumps. A malicious server could inject psql meta-commands into plain-text dump output (i.e., scripts created with pg_dump --format=plain, pg_dumpall, or pg_restore --file) that are run at restore time on the machine running psql. To fix, introduce a new "restricted" mode in psql that blocks all meta-commands (except for \unrestrict to exit the mode), and teach pg_dump, pg_dumpall, and pg_restore to use this mode in plain-text dumps. While at it, encourage users to only restore dumps generated from trusted servers or to inspect it beforehand, since restoring causes the destination to execute arbitrary code of the source superusers' choice. However, the client running the dump and restore needn't trust the source or destination superusers. Reported-by: Martin Rakhmanov Reported-by: Matthieu Denais Reported-by: RyotaK Suggested-by: Tom Lane Reviewed-by: Noah Misch Reviewed-by: Michael Paquier Reviewed-by: Peter Eisentraut Security: CVE-2025-8714 Backpatch-through: 13 --- doc/src/sgml/ref/pg_dump.sgml | 35 +++++++++ doc/src/sgml/ref/pg_dumpall.sgml | 30 ++++++++ doc/src/sgml/ref/pg_restore.sgml | 34 ++++++++ doc/src/sgml/ref/pgupgrade.sgml | 8 ++ doc/src/sgml/ref/psql-ref.sgml | 36 +++++++++ src/bin/pg_dump/dumputils.c | 38 +++++++++ src/bin/pg_dump/dumputils.h | 3 + src/bin/pg_dump/pg_backup.h | 4 + src/bin/pg_dump/pg_backup_archiver.c | 32 +++++++- src/bin/pg_dump/pg_dump.c | 21 +++++ src/bin/pg_dump/pg_dumpall.c | 36 +++++++++ src/bin/pg_dump/pg_restore.c | 22 ++++++ src/bin/pg_dump/t/002_pg_dump.pl | 19 +++-- src/bin/pg_upgrade/t/002_pg_upgrade.pl | 2 + src/bin/psql/command.c | 94 ++++++++++++++++++++++- src/bin/psql/help.c | 4 + src/bin/psql/t/001_basic.pl | 7 ++ src/bin/psql/tab-complete.c | 4 +- src/test/recovery/t/027_stream_regress.pl | 4 + src/test/regress/expected/psql.out | 2 + src/test/regress/sql/psql.sql | 2 + 21 files changed, 427 insertions(+), 10 deletions(-) diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index ec8ea8fd985..dc1342260b6 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -92,6 +92,18 @@ PostgreSQL documentation light of the limitations listed below. + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Non-plain-text dumps can be inspected + by using pg_restore's + option. Note that the client running the dump and restore need not trust + the source or destination superusers. + + + @@ -1078,6 +1090,29 @@ PostgreSQL documentation + + + + + Use the provided string as the psql + \restrict key in the dump output. This can only be + specified for plain-text dumps, i.e., when is + set to plain or the option + is omitted. If no restrict key is specified, + pg_dump will generate a random one as + needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index ba005ff19e2..1bddc8883f0 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -66,6 +66,16 @@ PostgreSQL documentation linkend="libpq-pgpass"/> for more information. + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Note that the client running the dump + and restore need not trust the source or destination superusers. + + + @@ -524,6 +534,26 @@ PostgreSQL documentation + + + + + Use the provided string as the psql + \restrict key in the dump output. If no restrict + key is specified, pg_dumpall will generate a + random one as needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index a81583191c1..d2ff765dc74 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -68,6 +68,18 @@ PostgreSQL documentation pg_restore will not be able to load the data using COPY statements. + + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Non-plain-text dumps can be inspected + by using pg_restore's + option. Note that the client running the dump and restore need not trust + the source or destination superusers. + + @@ -675,6 +687,28 @@ PostgreSQL documentation + + + + + Use the provided string as the psql + \restrict key in the dump output. This can only be + specified for SQL script output, i.e., when the + option is used. If no restrict key is specified, + pg_restore will generate a random one as + needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index 494aa0b5bbc..0459fc3777e 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -70,6 +70,14 @@ PostgreSQL documentation pg_upgrade supports upgrades from 9.2.X and later to the current major release of PostgreSQL, including snapshot and beta releases. + + + + Upgrading a cluster causes the destination to execute arbitrary code of the + source superusers' choice. Ensure that the source superusers are trusted + before upgrading. + + diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 7ff6e1d95d7..747408932a7 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -3340,6 +3340,24 @@ lo_import 152801 + + \restrict restrict_key + + + Enter "restricted" mode with the provided key. In this mode, the only + allowed meta-command is \unrestrict, to exit + restricted mode. The key may contain only alphanumeric characters. + + + This command is primarily intended for use in plain-text dumps + generated by pg_dump, + pg_dumpall, and + pg_restore, but it may be useful elsewhere. + + + + + \s [ filename ] @@ -3514,6 +3532,24 @@ testdb=> \setenv LESS -imx4F + + \unrestrict restrict_key + + + Exit "restricted" mode (i.e., where all other meta-commands are + blocked), provided the specified key matches the one given to + \restrict when restricted mode was entered. + + + This command is primarily intended for use in plain-text dumps + generated by pg_dump, + pg_dumpall, and + pg_restore, but it may be useful elsewhere. + + + + + \unset name diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 43891955761..44ff2b17f1d 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -19,6 +19,7 @@ #include "dumputils.h" #include "fe_utils/string_utils.h" +static const char restrict_chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static bool parseAclItem(const char *item, const char *type, const char *name, const char *subname, int remoteVersion, @@ -919,3 +920,40 @@ makeAlterConfigCommand(PGconn *conn, const char *configitem, pg_free(mine); } + +/* + * Generates a valid restrict key (i.e., an alphanumeric string) for use with + * psql's \restrict and \unrestrict meta-commands. For safety, the value is + * chosen at random. + */ +char * +generate_restrict_key(void) +{ + uint8 buf[64]; + char *ret = palloc(sizeof(buf)); + + if (!pg_strong_random(buf, sizeof(buf))) + return NULL; + + for (int i = 0; i < sizeof(buf) - 1; i++) + { + uint8 idx = buf[i] % strlen(restrict_chars); + + ret[i] = restrict_chars[idx]; + } + ret[sizeof(buf) - 1] = '\0'; + + return ret; +} + +/* + * Checks that a given restrict key (intended for use with psql's \restrict and + * \unrestrict meta-commands) contains only alphanumeric characters. + */ +bool +valid_restrict_key(const char *restrict_key) +{ + return restrict_key != NULL && + restrict_key[0] != '\0' && + strspn(restrict_key, restrict_chars) == strlen(restrict_key); +} diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index a6b8b478638..8f8964c390e 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -64,4 +64,7 @@ extern void makeAlterConfigCommand(PGconn *conn, const char *configitem, const char *type2, const char *name2, PQExpBuffer buf); +extern char *generate_restrict_key(void); +extern bool valid_restrict_key(const char *restrict_key); + #endif /* DUMPUTILS_H */ diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index aba780ef4b1..558a8f00abf 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -154,6 +154,8 @@ typedef struct _restoreOptions int enable_row_security; int sequence_data; /* dump sequence data even in schema-only mode */ int binary_upgrade; + + char *restrict_key; } RestoreOptions; typedef struct _dumpOptions @@ -200,6 +202,8 @@ typedef struct _dumpOptions int sequence_data; /* dump sequence data even in schema-only mode */ int do_nothing; + + char *restrict_key; } DumpOptions; /* diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index b1ea5db46ee..1c1675fa2f8 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -204,6 +204,7 @@ dumpOptionsFromRestoreOptions(RestoreOptions *ropt) dopt->include_everything = ropt->include_everything; dopt->enable_row_security = ropt->enable_row_security; dopt->sequence_data = ropt->sequence_data; + dopt->restrict_key = ropt->restrict_key ? pg_strdup(ropt->restrict_key) : NULL; return dopt; } @@ -466,6 +467,17 @@ RestoreArchive(Archive *AHX) ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); + /* + * If generating plain-text output, enter restricted mode to block any + * unexpected psql meta-commands. A malicious source might try to inject + * a variety of things via bogus responses to queries. While we cannot + * prevent such sources from affecting the destination at restore time, we + * can block psql meta-commands so that the client machine that runs psql + * with the dump output remains unaffected. + */ + if (ropt->restrict_key) + ahprintf(AH, "\\restrict %s\n\n", ropt->restrict_key); + if (AH->archiveRemoteVersion) ahprintf(AH, "-- Dumped from database version %s\n", AH->archiveRemoteVersion); @@ -741,6 +753,14 @@ RestoreArchive(Archive *AHX) ahprintf(AH, "--\n-- PostgreSQL database dump complete\n--\n\n"); + /* + * If generating plain-text output, exit restricted mode at the very end + * of the script. This is not pro forma; in particular, pg_dumpall + * requires this when transitioning from one database to another. + */ + if (ropt->restrict_key) + ahprintf(AH, "\\unrestrict %s\n\n", ropt->restrict_key); + /* * Clean up & we're done. */ @@ -3228,11 +3248,21 @@ _reconnectToDB(ArchiveHandle *AH, const char *dbname) else { PQExpBufferData connectbuf; + RestoreOptions *ropt = AH->public.ropt; + + /* + * We must temporarily exit restricted mode for \connect, etc. + * Anything added between this line and the following \restrict must + * be careful to avoid any possible meta-command injection vectors. + */ + ahprintf(AH, "\\unrestrict %s\n", ropt->restrict_key); initPQExpBuffer(&connectbuf); appendPsqlMetaConnect(&connectbuf, dbname); - ahprintf(AH, "%s\n", connectbuf.data); + ahprintf(AH, "%s", connectbuf.data); termPQExpBuffer(&connectbuf); + + ahprintf(AH, "\\restrict %s\n\n", ropt->restrict_key); } /* diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 427e4ae1322..829800ec812 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -432,6 +432,7 @@ main(int argc, char **argv) {"table-and-children", required_argument, NULL, 12}, {"exclude-table-and-children", required_argument, NULL, 13}, {"exclude-table-data-and-children", required_argument, NULL, 14}, + {"restrict-key", required_argument, NULL, 25}, {NULL, 0, NULL, 0} }; @@ -658,6 +659,10 @@ main(int argc, char **argv) optarg); break; + case 25: + dopt.restrict_key = pg_strdup(optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -720,8 +725,22 @@ main(int argc, char **argv) /* archiveFormat specific setup */ if (archiveFormat == archNull) + { plainText = 1; + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!dopt.restrict_key) + dopt.restrict_key = generate_restrict_key(); + if (!dopt.restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(dopt.restrict_key)) + pg_fatal("invalid restrict key"); + } + else if (dopt.restrict_key) + pg_fatal("option --restrict-key can only be used with --format=plain"); + /* * Custom and directory formats are compressed by default with gzip when * available, not the others. If gzip is not available, no compression is @@ -1017,6 +1036,7 @@ main(int argc, char **argv) ropt->enable_row_security = dopt.enable_row_security; ropt->sequence_data = dopt.sequence_data; ropt->binary_upgrade = dopt.binary_upgrade; + ropt->restrict_key = dopt.restrict_key ? pg_strdup(dopt.restrict_key) : NULL; ropt->compression_spec = compression_spec; @@ -1120,6 +1140,7 @@ help(const char *progname) printf(_(" --no-unlogged-table-data do not dump unlogged table data\n")); printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n")); printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n")); printf(_(" --section=SECTION dump named section (pre-data, data, or post-data)\n")); printf(_(" --serializable-deferrable wait until the dump can run without anomalies\n")); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 41dc2cbaaca..b534df14b9e 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -121,6 +121,8 @@ static char *filename = NULL; static SimpleStringList database_exclude_patterns = {NULL, NULL}; static SimpleStringList database_exclude_names = {NULL, NULL}; +static char *restrict_key; + #define exit_nicely(code) exit(code) int @@ -177,6 +179,7 @@ main(int argc, char *argv[]) {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1}, {"on-conflict-do-nothing", no_argument, &on_conflict_do_nothing, 1}, {"rows-per-insert", required_argument, NULL, 7}, + {"restrict-key", required_argument, NULL, 9}, {NULL, 0, NULL, 0} }; @@ -360,6 +363,12 @@ main(int argc, char *argv[]) appendShellString(pgdumpopts, optarg); break; + case 9: + restrict_key = pg_strdup(optarg); + appendPQExpBufferStr(pgdumpopts, " --restrict-key "); + appendShellString(pgdumpopts, optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -455,6 +464,16 @@ main(int argc, char *argv[]) if (on_conflict_do_nothing) appendPQExpBufferStr(pgdumpopts, " --on-conflict-do-nothing"); + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!restrict_key) + restrict_key = generate_restrict_key(); + if (!restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(restrict_key)) + pg_fatal("invalid restrict key"); + /* * If there was a database specified on the command line, use that, * otherwise try to connect to database "postgres", and failing that @@ -542,6 +561,16 @@ main(int argc, char *argv[]) if (verbose) dumpTimestamp("Started on"); + /* + * Enter restricted mode to block any unexpected psql meta-commands. A + * malicious source might try to inject a variety of things via bogus + * responses to queries. While we cannot prevent such sources from + * affecting the destination at restore time, we can block psql + * meta-commands so that the client machine that runs psql with the dump + * output remains unaffected. + */ + fprintf(OPF, "\\restrict %s\n\n", restrict_key); + /* * We used to emit \connect postgres here, but that served no purpose * other than to break things for installations without a postgres @@ -602,6 +631,12 @@ main(int argc, char *argv[]) dumpTablespaces(conn); } + /* + * Exit restricted mode just before dumping the databases. pg_dump will + * handle entering restricted mode again as appropriate. + */ + fprintf(OPF, "\\unrestrict %s\n\n", restrict_key); + if (!globals_only && !roles_only && !tablespaces_only) dumpDatabases(conn); @@ -669,6 +704,7 @@ help(void) printf(_(" --no-unlogged-table-data do not dump unlogged table data\n")); printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n")); printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n")); printf(_(" --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 049a1006347..f05c24510ac 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -123,6 +123,7 @@ main(int argc, char **argv) {"no-publications", no_argument, &no_publications, 1}, {"no-security-labels", no_argument, &no_security_labels, 1}, {"no-subscriptions", no_argument, &no_subscriptions, 1}, + {"restrict-key", required_argument, NULL, 6}, {NULL, 0, NULL, 0} }; @@ -286,6 +287,10 @@ main(int argc, char **argv) set_dump_section(optarg, &(opts->dumpSections)); break; + case 6: + opts->restrict_key = pg_strdup(optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -321,8 +326,24 @@ main(int argc, char **argv) pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } + + if (opts->restrict_key) + pg_fatal("options -d/--dbname and --restrict-key cannot be used together"); + opts->useDB = 1; } + else + { + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!opts->restrict_key) + opts->restrict_key = generate_restrict_key(); + if (!opts->restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(opts->restrict_key)) + pg_fatal("invalid restrict key"); + } if (opts->dataOnly && opts->schemaOnly) pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together"); @@ -472,6 +493,7 @@ usage(const char *progname) printf(_(" --no-subscriptions do not restore subscriptions\n")); printf(_(" --no-table-access-method do not restore table access methods\n")); printf(_(" --no-tablespaces do not restore tablespace assignments\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n")); printf(_(" --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n")); diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index b052510537d..b491e461158 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -729,6 +729,16 @@ # This is where the actual tests are defined. my %tests = ( + 'restrict' => { + all_runs => 1, + regexp => qr/^\\restrict [a-zA-Z0-9]+$/m, + }, + + 'unrestrict' => { + all_runs => 1, + regexp => qr/^\\unrestrict [a-zA-Z0-9]+$/m, + }, + 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT' => { create_order => 14, create_sql => 'ALTER DEFAULT PRIVILEGES @@ -3874,7 +3884,6 @@ }, 'ALTER TABLE measurement PRIMARY KEY' => { - all_runs => 1, catch_all => 'CREATE ... commands', create_order => 93, create_sql => @@ -3927,7 +3936,6 @@ }, 'ALTER INDEX ... ATTACH PARTITION (primary key)' => { - all_runs => 1, catch_all => 'CREATE ... commands', regexp => qr/^ \QALTER INDEX dump_test.measurement_pkey ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_pkey\E @@ -4959,9 +4967,10 @@ next; } - # Run the test listed as a like, unless it is specifically noted - # as an unlike (generally due to an explicit exclusion or similar). - if ($tests{$test}->{like}->{$test_key} + # Run the test if all_runs is set or if listed as a like, unless it is + # specifically noted as an unlike (generally due to an explicit + # exclusion or similar). + if (($tests{$test}->{like}->{$test_key} || $tests{$test}->{all_runs}) && !defined($tests{$test}->{unlike}->{$test_key})) { if (!ok($output_file =~ $tests{$test}->{regexp}, diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 3bf4e87b178..056538af53c 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -264,6 +264,7 @@ sub filter_dump # that we need to use pg_dumpall from the new node here. my @dump_command = ( 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'), + '--restrict-key=test', '-f', $dump1_file); # --extra-float-digits is needed when upgrading from a version older than 11. push(@dump_command, '--extra-float-digits', '0') @@ -449,6 +450,7 @@ sub filter_dump # Second dump from the upgraded instance. @dump_command = ( 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'), + '--restrict-key=test', '-f', $dump2_file); # --extra-float-digits is needed when upgrading from a version older than 11. push(@dump_command, '--extra-float-digits', '0') diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 0cf32d156a8..faad3790907 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -123,6 +123,8 @@ static backslashResult exec_command_pset(PsqlScanState scan_state, bool active_b static backslashResult exec_command_quit(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_reset(PsqlScanState scan_state, bool active_branch, PQExpBuffer query_buf); +static backslashResult exec_command_restrict(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_s(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_set(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_setenv(PsqlScanState scan_state, bool active_branch, @@ -132,6 +134,8 @@ static backslashResult exec_command_sf_sv(PsqlScanState scan_state, bool active_ static backslashResult exec_command_t(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_T(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_timing(PsqlScanState scan_state, bool active_branch); +static backslashResult exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_unset(PsqlScanState scan_state, bool active_branch, const char *cmd); static backslashResult exec_command_write(PsqlScanState scan_state, bool active_branch, @@ -181,6 +185,8 @@ static char *pset_value_string(const char *param, printQueryOpt *popt); static void checkWin32Codepage(void); #endif +static bool restricted; +static char *restrict_key; /*---------- @@ -226,8 +232,19 @@ HandleSlashCmds(PsqlScanState scan_state, /* Parse off the command name */ cmd = psql_scan_slash_command(scan_state); - /* And try to execute it */ - status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf); + /* + * And try to execute it. + * + * If we are in "restricted" mode, the only allowable backslash command is + * \unrestrict (to exit restricted mode). + */ + if (restricted && strcmp(cmd, "unrestrict") != 0) + { + pg_log_error("backslash commands are restricted; only \\unrestrict is allowed"); + status = PSQL_CMD_ERROR; + } + else + status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf); if (status == PSQL_CMD_UNKNOWN) { @@ -388,6 +405,8 @@ exec_command(const char *cmd, status = exec_command_quit(scan_state, active_branch); else if (strcmp(cmd, "r") == 0 || strcmp(cmd, "reset") == 0) status = exec_command_reset(scan_state, active_branch, query_buf); + else if (strcmp(cmd, "restrict") == 0) + status = exec_command_restrict(scan_state, active_branch, cmd); else if (strcmp(cmd, "s") == 0) status = exec_command_s(scan_state, active_branch); else if (strcmp(cmd, "set") == 0) @@ -404,6 +423,8 @@ exec_command(const char *cmd, status = exec_command_T(scan_state, active_branch); else if (strcmp(cmd, "timing") == 0) status = exec_command_timing(scan_state, active_branch); + else if (strcmp(cmd, "unrestrict") == 0) + status = exec_command_unrestrict(scan_state, active_branch, cmd); else if (strcmp(cmd, "unset") == 0) status = exec_command_unset(scan_state, active_branch, cmd); else if (strcmp(cmd, "w") == 0 || strcmp(cmd, "write") == 0) @@ -2344,6 +2365,35 @@ exec_command_reset(PsqlScanState scan_state, bool active_branch, return PSQL_CMD_SKIP_LINE; } +/* + * \restrict -- enter "restricted mode" with the provided key + */ +static backslashResult +exec_command_restrict(PsqlScanState scan_state, bool active_branch, + const char *cmd) +{ + if (active_branch) + { + char *opt; + + Assert(!restricted); + + opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + if (opt == NULL || opt[0] == '\0') + { + pg_log_error("\\%s: missing required argument", cmd); + return PSQL_CMD_ERROR; + } + + restrict_key = pstrdup(opt); + restricted = true; + } + else + ignore_slash_options(scan_state); + + return PSQL_CMD_SKIP_LINE; +} + /* * \s -- save history in a file or show it on the screen */ @@ -2631,6 +2681,46 @@ exec_command_timing(PsqlScanState scan_state, bool active_branch) return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR; } +/* + * \unrestrict -- exit "restricted mode" if provided key matches + */ +static backslashResult +exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, + const char *cmd) +{ + if (active_branch) + { + char *opt; + + opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + if (opt == NULL || opt[0] == '\0') + { + pg_log_error("\\%s: missing required argument", cmd); + return PSQL_CMD_ERROR; + } + + if (!restricted) + { + pg_log_error("\\%s: not currently in restricted mode", cmd); + return PSQL_CMD_ERROR; + } + else if (strcmp(opt, restrict_key) == 0) + { + pfree(restrict_key); + restricted = false; + } + else + { + pg_log_error("\\%s: wrong key", cmd); + return PSQL_CMD_ERROR; + } + } + else + ignore_slash_options(scan_state); + + return PSQL_CMD_SKIP_LINE; +} + /* * \unset -- unset variable */ diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index b5c192c3cdd..110e694e46e 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -200,6 +200,10 @@ slashUsage(unsigned short int pager) HELP0(" \\gset [PREFIX] execute query and store result in psql variables\n"); HELP0(" \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"); HELP0(" \\q quit psql\n"); + HELP0(" \\restrict RESTRICT_KEY\n" + " enter restricted mode with provided key\n"); + HELP0(" \\unrestrict RESTRICT_KEY\n" + " exit restricted mode if key matches\n"); HELP0(" \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"); HELP0("\n"); diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 3599cc1ef09..f5ec8fab1f3 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -388,4 +388,11 @@ sub psql_fails_like qr/iteration count is specified more than once/, '\watch, iteration count is specified more than once'); +psql_fails_like( + $node, + qq{\\restrict test +\\! should_fail}, + qr/backslash commands are restricted; only \\unrestrict is allowed/, + 'meta-command in restrict mode fails'); + done_testing(); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 23d89d0720f..585a79293d9 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1733,10 +1733,10 @@ psql_completion(const char *text, int start, int end) "\\out", "\\password", "\\print", "\\prompt", "\\pset", "\\qecho", "\\quit", - "\\reset", + "\\reset", "\\restrict", "\\s", "\\set", "\\setenv", "\\sf", "\\sv", "\\t", "\\T", "\\timing", - "\\unset", + "\\unrestrict", "\\unset", "\\x", "\\warn", "\\watch", "\\write", "\\z", diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index f7e46a70718..eda4e6904cb 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -103,6 +103,7 @@ command_ok( [ 'pg_dumpall', '-f', $outputdir . '/primary.dump', + '--restrict-key=test', '--no-sync', '-p', $node_primary->port, '--no-unlogged-table-data' # if unlogged, standby has schema only ], @@ -110,6 +111,7 @@ command_ok( [ 'pg_dumpall', '-f', $outputdir . '/standby.dump', + '--restrict-key=test', '--no-sync', '-p', $node_standby_1->port ], 'dump standby server'); @@ -128,6 +130,7 @@ ('--schema', 'pg_catalog'), ('-f', $outputdir . '/catalogs_primary.dump'), '--no-sync', + '--restrict-key=test', ('-p', $node_primary->port), '--no-unlogged-table-data', 'regression' @@ -139,6 +142,7 @@ ('--schema', 'pg_catalog'), ('-f', $outputdir . '/catalogs_standby.dump'), '--no-sync', + '--restrict-key=test', ('-p', $node_standby_1->port), 'regression' ], diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 7cd0c27cca8..c28548da4da 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -4537,6 +4537,7 @@ invalid command \lo \pset arg1 arg2 \q \reset + \restrict test \s arg1 \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 \setenv arg1 arg2 @@ -4545,6 +4546,7 @@ invalid command \lo \t arg1 \T arg1 \timing arg1 + \unrestrict not_valid \unset arg1 \w arg1 \watch arg1 arg2 diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index f3bc6cd07e8..25ae4507f13 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -1020,6 +1020,7 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \pset arg1 arg2 \q \reset + \restrict test \s arg1 \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 \setenv arg1 arg2 @@ -1028,6 +1029,7 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \t arg1 \T arg1 \timing arg1 + \unrestrict not_valid \unset arg1 \w arg1 \watch arg1 arg2 From 18d01671ef2576f7f950c2797a467370bc1a654d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 11 Aug 2025 15:37:32 -0400 Subject: [PATCH 114/115] Last-minute updates for release notes. Security: CVE-2025-8713, CVE-2025-8714, CVE-2025-8715 --- doc/src/sgml/release-16.sgml | 128 ++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml index d2dc1dab648..b41ca61dad3 100644 --- a/doc/src/sgml/release-16.sgml +++ b/doc/src/sgml/release-16.sgml @@ -25,7 +25,7 @@ However, if you have any BRIN numeric_minmax_multi_ops indexes, it is - advisable to reindex them after updating. See the first changelog + advisable to reindex them after updating. See the fourth changelog entry below. @@ -42,6 +42,132 @@ + + Tighten security checks in planner estimation functions + (Dean Rasheed) + § + + + + The fix for CVE-2017-7484, plus followup fixes, intended to prevent + leaky functions from being applied to statistics data for columns + that the calling user does not have permission to read. Two gaps in + that protection have been found. One gap applies to partitioning + and inheritance hierarchies where RLS policies on the tables should + restrict access to statistics data, but did not. + + + + The other gap applies to cases where the query accesses a table via + a view, and the view owner has permissions to read the underlying + table but the calling user does not have permissions on the view. + The view owner's permissions satisfied the security checks, and the + leaky function would get applied to the underlying table's + statistics before we check the calling user's permissions on the + view. This has been fixed by making security checks on views occur + at the start of planning. That might cause permissions failures to + occur earlier than before. + + + + The PostgreSQL Project thanks + Dean Rasheed for reporting this problem. + (CVE-2025-8713) + + + + + + + Prevent pg_dump scripts from being used + to attack the user running the restore (Nathan Bossart) + § + + + + Since dump/restore operations typically involve running SQL commands + as superuser, the target database installation must trust the source + server. However, it does not follow that the operating system user + who executes psql to perform the restore + should have to trust the source server. The risk here is that an + attacker who has gained superuser-level control over the source + server might be able to cause it to emit text that would be + interpreted as psql meta-commands. + That would provide shell-level access to the restoring user's own + account, independently of access to the target database. + + + + To provide a positive guarantee that this can't happen, + extend psql with + a \restrict command that prevents execution of + further meta-commands, and teach pg_dump + to issue that before any data coming from the source server. + + + + The PostgreSQL Project thanks Martin Rakhmanov, Matthieu Denais, and + RyotaK for reporting this problem. + (CVE-2025-8714) + + + + + + + Convert newlines to spaces in names included in comments + in pg_dump output + (Noah Misch) + § + + + + Object names containing newlines offered the ability to inject + arbitrary SQL commands into the output script. (Without the + preceding fix, injection of psql + meta-commands would also be possible this way.) + CVE-2012-0868 fixed this class of problem at the time, but later + work reintroduced several cases. + + + + The PostgreSQL Project thanks + Noah Misch for reporting this problem. + (CVE-2025-8715) + + + + +