From f286f64bcf01106fc08ea1c14252ae2c26b7d189 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 19 Nov 2024 18:26:19 -0500 Subject: [PATCH 001/119] Compare collations before merging UNION operations. In the dim past we figured it was okay to ignore collations when combining UNION set-operation nodes into a single N-way UNION operation. I believe that was fine at the time, but it stopped being fine when we added nondeterministic collations: the semantics of distinct-ness are affected by those. v17 made it even less fine by allowing per-child sorting operations to be merged via MergeAppend, although I think we accidentally avoided any live bug from that. Add a check that collations match before deciding that two UNION nodes are equivalent. I also failed to resist the temptation to comment plan_union_children() a little better. Back-patch to all supported branches (v13 now), since they all have nondeterministic collations. Discussion: https://postgr.es/m/3605568.1731970579@sss.pgh.pa.us --- src/backend/optimizer/prep/prepunion.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 0c68ec011be..49f0150056d 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -577,9 +577,9 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, /* * If any of my children are identical UNION nodes (same op, all-flag, and - * colTypes) then they can be merged into this node so that we generate - * only one Append and unique-ification for the lot. Recurse to find such - * nodes and compute their children's paths. + * colTypes/colCollations) then they can be merged into this node so that + * we generate only one Append and unique-ification for the lot. Recurse + * to find such nodes and compute their children's paths. */ rellist = plan_union_children(root, op, refnames_tlist, &tlist_list); @@ -868,17 +868,15 @@ generate_nonunion_paths(SetOperationStmt *op, PlannerInfo *root, } /* - * Pull up children of a UNION node that are identically-propertied UNIONs. + * Pull up children of a UNION node that are identically-propertied UNIONs, + * and perform planning of the queries underneath the N-way UNION. + * + * The result is a list of RelOptInfos containing Paths for sub-nodes, with + * one entry for each descendant that is a leaf query or non-identical setop. + * We also return a parallel list of the childrens' targetlists. * * NOTE: we can also pull a UNION ALL up into a UNION, since the distinct * output rows will be lost anyway. - * - * NOTE: currently, we ignore collations while determining if a child has - * the same properties. This is semantically sound only so long as all - * collations have the same notion of equality. It is valid from an - * implementation standpoint because we don't care about the ordering of - * a UNION child's result: UNION ALL results are always unordered, and - * generate_union_paths will force a fresh sort if the top level is a UNION. */ static List * plan_union_children(PlannerInfo *root, @@ -904,7 +902,8 @@ plan_union_children(PlannerInfo *root, if (op->op == top_union->op && (op->all == top_union->all || op->all) && - equal(op->colTypes, top_union->colTypes)) + equal(op->colTypes, top_union->colTypes) && + equal(op->colCollations, top_union->colCollations)) { /* Same UNION, so fold children into parent */ pending_rels = lcons(op->rarg, pending_rels); From 1c99d8186fbf3a55de4d7b6dd03a1a0ba4ed8997 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 20 Nov 2024 14:21:17 +0900 Subject: [PATCH 002/119] doc: Fix section of functions age(xid) and mxid_age(xid) In 17~, age(xid) and mxid_age(xid) were listed as deprecated. Based on the discussion that led to 48b5aa3143, this is not intentional as this could break many existing monitoring queries. Note that vacuumdb also uses both of them. In 16, both functions were listed under "Control Data Functions", which is incorrect, so let's move them to the list of functions related to transaction IDs and snapshots. Author: Bertrand Drouvot Discussion: https://postgr.es/m/Zzr2zZFyeFKXWe8a@ip-10-97-1-34.eu-west-3.compute.internal Discussion: https://postgr.es/m/20231114013224.4z6oxa6p6va33rxr@awork3.anarazel.de Backpatch-through: 16 --- doc/src/sgml/func.sgml | 58 ++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 51fcfc26c91..042b225b920 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25365,6 +25365,34 @@ SELECT collation for ('foo' COLLATE "de_DE"); + + + + age + + age ( xid ) + integer + + + Returns the number of transactions between the supplied + transaction id and the current transaction counter. + + + + + + + mxid_age + + mxid_age ( xid ) + integer + + + Returns the number of multixacts IDs between the supplied + multixact ID and the current multixacts counter. + + + @@ -25509,7 +25537,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 use a + the functions shown in , except + age and mxid_age, 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. @@ -25806,33 +25835,6 @@ SELECT collation for ('foo' COLLATE "de_DE"); - - - - age - - age ( xid ) - integer - - - Returns the number of transactions between the supplied - transaction id and the current transaction counter. - - - - - - - mxid_age - - mxid_age ( xid ) - integer - - - Returns the number of multixacts IDs between the supplied - multixact ID and the current multixacts counter. - - From fe084039e482673c2d7fbd881f7ce918c2512d50 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 20 Nov 2024 12:03:47 -0500 Subject: [PATCH 003/119] Avoid assertion failure if a setop leaf query contains setops. Ordinarily transformSetOperationTree will collect all UNION/ INTERSECT/EXCEPT steps into the setOperations tree of the topmost Query, so that leaf queries do not contain any setOperations. However, it cannot thus flatten a subquery that also contains WITH, ORDER BY, FOR UPDATE, or LIMIT. I (tgl) forgot that in commit 07b4c48b6 and wrote an assertion in rule deparsing that a leaf's setOperations would always be empty. If it were nonempty then we would want to parenthesize the subquery to ensure that the output represents the setop nesting correctly (e.g. UNION below INTERSECT had better get parenthesized). So rather than just removing the faulty Assert, let's change it into an additional case to check to decide whether to add parens. We don't expect that the additional case will ever fire, but it's cheap insurance. Man Zeng and Tom Lane Discussion: https://postgr.es/m/tencent_7ABF9B1F23B0C77606FC5FE3@qq.com --- src/backend/utils/adt/ruleutils.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index f0b053e2f67..615ed1f410e 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -6155,13 +6155,19 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context) Query *subquery = rte->subquery; Assert(subquery != NULL); - Assert(subquery->setOperations == NULL); - /* Need parens if WITH, ORDER BY, FOR UPDATE, or LIMIT; see gram.y */ + + /* + * We need parens if WITH, ORDER BY, FOR UPDATE, or LIMIT; see gram.y. + * Also add parens if the leaf query contains its own set operations. + * (That shouldn't happen unless one of the other clauses is also + * present, see transformSetOperationTree; but let's be safe.) + */ need_paren = (subquery->cteList || subquery->sortClause || subquery->rowMarks || subquery->limitOffset || - subquery->limitCount); + subquery->limitCount || + subquery->setOperations); if (need_paren) appendStringInfoChar(buf, '('); get_query_def(subquery, buf, context->namespaces, From e749eaf46e9b05d25592d9c83bde7fb026e9c6eb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 21 Nov 2024 15:14:13 +0900 Subject: [PATCH 004/119] Fix memory leak in pgoutput for the WAL sender RelationSyncCache, the hash table in charge of tracking the relation schemas sent through pgoutput, was forgetting to free the TupleDesc associated to the two slots used to store the new and old tuples, causing some memory to be leaked each time a relation is invalidated when the slots of an existing relation entry are cleaned up. This is rather hard to notice as the bloat is pretty minimal, but a long-running WAL sender would be in trouble over time depending on the workload. sysbench has proved to be pretty good at showing the problem, coupled with some memory monitoring of the WAL sender. Issue introduced in 52e4f0cd472d, that has added row filters for tables logically replicated. Author: Boyu Yang Reviewed-by: Michael Paquier, Hou Zhijie Discussion: https://postgr.es/m/DM3PR84MB3442E14B340E553313B5C816E3252@DM3PR84MB3442.NAMPRD84.PROD.OUTLOOK.COM Backpatch-through: 15 --- src/backend/replication/pgoutput/pgoutput.c | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index c57c5ed8de9..bb8f3ea702f 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -2046,10 +2046,34 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) * Tuple slots cleanups. (Will be rebuilt later if needed). */ if (entry->old_slot) + { + TupleDesc desc = entry->old_slot->tts_tupleDescriptor; + + Assert(desc->tdrefcount == -1); + ExecDropSingleTupleTableSlot(entry->old_slot); + + /* + * ExecDropSingleTupleTableSlot() would not free the TupleDesc, so + * do it now to avoid any leaks. + */ + FreeTupleDesc(desc); + } if (entry->new_slot) + { + TupleDesc desc = entry->new_slot->tts_tupleDescriptor; + + Assert(desc->tdrefcount == -1); + ExecDropSingleTupleTableSlot(entry->new_slot); + /* + * ExecDropSingleTupleTableSlot() would not free the TupleDesc, so + * do it now to avoid any leaks. + */ + FreeTupleDesc(desc); + } + entry->old_slot = NULL; entry->new_slot = NULL; From aca1599d694d672d65d4f9d2f8378bb93de14c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Thu, 21 Nov 2024 16:54:36 +0100 Subject: [PATCH 005/119] Fix outdated bit in README.tuplock Apparently this information has been outdated since first committed, because we adopted a different implementation during development per reviews and this detail was not updated in the README. This has been wrong since commit 0ac5ad5134f2 introduced the file in 2013. Backpatch to all live branches. Reported-by: Will Mortensen Discussion: https://postgr.es/m/CAMpnoC6yEQ=c0Rdq-J7uRedrP7Zo9UMp6VZyP23QMT68n06cvA@mail.gmail.com --- src/backend/access/heap/README.tuplock | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/backend/access/heap/README.tuplock b/src/backend/access/heap/README.tuplock index 818cd7f9806..750684d3398 100644 --- a/src/backend/access/heap/README.tuplock +++ b/src/backend/access/heap/README.tuplock @@ -70,13 +70,8 @@ KEY SHARE conflict When there is a single locker in a tuple, we can just store the locking info in the tuple itself. We do this by storing the locker's Xid in XMAX, and -setting infomask bits specifying the locking strength. There is one exception -here: since infomask space is limited, we do not provide a separate bit -for SELECT FOR SHARE, so we have to use the extended info in a MultiXact in -that case. (The other cases, SELECT FOR UPDATE and SELECT FOR KEY SHARE, are -presumably more commonly used due to being the standards-mandated locking -mechanism, or heavily used by the RI code, so we want to provide fast paths -for those.) +setting infomask bits specifying the locking strength. See "Infomask Bits" +below for details on the bit patterns we use. MultiXacts ---------- From 50010c6f6c4d10e8d78d2d550bdaea461d0c83a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Thu, 21 Nov 2024 17:04:26 +0100 Subject: [PATCH 006/119] Fix newly introduced 010_keep_recycled_wals.pl It failed to set the archive_command as it desired because of a syntax problem. Oversight in commit 90bcc7c2db1d. This bug doesn't cause the test to fail, because the test only checks pg_rewind's output messages, not the actual outcome (and the outcome in both cases is that the file is kept, not deleted). But in either case the message about the file being kept is there, so it's hard to get excited about doing much more. Reported-by: Antonin Houska Author: Alexander Kukushkin Discussion: https://postgr.es/m/7822.1732167825@antos --- src/bin/pg_rewind/t/010_keep_recycled_wals.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_rewind/t/010_keep_recycled_wals.pl b/src/bin/pg_rewind/t/010_keep_recycled_wals.pl index e6dfce2a54a..bf0084d3bc3 100644 --- a/src/bin/pg_rewind/t/010_keep_recycled_wals.pl +++ b/src/bin/pg_rewind/t/010_keep_recycled_wals.pl @@ -23,9 +23,9 @@ RewindTest::primary_psql("CHECKPOINT"); # last common checkpoint -# We use "perl -e 'exit(1)'" as an alternative to "false", because the latter +# We use `perl -e "exit(1)"` as an alternative to "false", because the latter # might not be available on Windows. -my $false = "$^X -e 'exit(1)'"; +my $false = "$^X -e \"exit(1)\""; $node_primary->append_conf( 'postgresql.conf', qq( archive_command = '$false' From 6de14dbb3629eb5393db9bfab8ea3d5b1b8a0c23 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 22 Nov 2024 14:53:21 +1300 Subject: [PATCH 007/119] jit: Use -mno-outline-atomics for bitcode on ARM. If the executable's .o files were produced by a compiler (probably gcc) not using -moutline-atomics, and the corresponding .bc files were produced by clang using -moutline-atomics (probably by default), then the generated bitcode functions would have the target attribute "+outline-atomics", and could fail at runtime when inlined. If the target ISA at bitcode generation time was armv8-a (the most conservative aarch64 target, no LSE), then LLVM IR atomic instructions would generate calls to functions in libgcc.a or libclang_rt.*.a that switch between LL/SC and faster LSE instructions depending on a runtime AT_HWCAP check. Since the corresponding .o files didn't need those functions, they wouldn't have been included in the executable, and resolution would fail. At least Debian and Ubuntu are known to ship gcc and clang compilers that target armv8-a but differ on the use of outline atomics by default. Fix, by suppressing the outline atomics attribute in bitcode explicitly. Inline LL/SC instructions will be generated for atomic operations in bitcode built for armv8-a. Only configure scripts are adjusted for now, because the meson build system doesn't generate bitcode yet. This doesn't seem to be a new phenomenon, so real cases of functions using atomics that are inlined by JIT must be rare in the wild given how long it took for a bug report to arrive. The reported case could be reduced to: postgres=# set jit_inline_above_cost = 0; SET postgres=# set jit_above_cost = 0; SET postgres=# select pg_last_wal_receive_lsn(); WARNING: failed to resolve name __aarch64_swp4_acq_rel FATAL: fatal llvm error: Program used external function '__aarch64_swp4_acq_rel' which could not be resolved! The change doesn't affect non-ARM systems or later target ISAs. Back-patch to all supported releases. Reported-by: Alexander Kozhemyakin Discussion: https://postgr.es/m/18610-37bf303f904fede3%40postgresql.org --- configure | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 7 ++++ 2 files changed, 112 insertions(+) diff --git a/configure b/configure index 2d5f6a68ffa..e6a76aefd0f 100755 --- a/configure +++ b/configure @@ -7654,6 +7654,111 @@ if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes"; fi + # Ideally bitcode should perhaps match $CC's use, or not, of outline atomic + # functions, but for now we err on the side of suppressing them in bitcode, + # because we can't assume they're available at runtime. This affects aarch64 + # builds using the basic armv8-a ISA without LSE support. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CXXFLAGS=$CXXFLAGS +pgac_save_CXX=$CXX +CXX=${CLANG} +CXXFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics" +ac_save_cxx_werror_flag=$ac_cxx_werror_flag +ac_cxx_werror_flag=yes +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes +else + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_cxx_werror_flag=$ac_save_cxx_werror_flag +CXXFLAGS="$pgac_save_CXXFLAGS" +CXX="$pgac_save_CXX" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5 +$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; } +if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CXXFLAGS=$CXXFLAGS +pgac_save_CXX=$CXX +CXX=${CLANG} +CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics" +ac_save_cxx_werror_flag=$ac_cxx_werror_flag +ac_cxx_werror_flag=yes +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes +else + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_cxx_werror_flag=$ac_save_cxx_werror_flag +CXXFLAGS="$pgac_save_CXXFLAGS" +CXX="$pgac_save_CXX" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5 +$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; } +if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics" +fi + + NOT_THE_CFLAGS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS" >&5 $as_echo_n "checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS... " >&6; } diff --git a/configure.ac b/configure.ac index d5c8bbb500c..aea266d9104 100644 --- a/configure.ac +++ b/configure.ac @@ -652,6 +652,13 @@ if test "$with_llvm" = yes ; then PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-Xclang -no-opaque-pointers]) PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-Xclang -no-opaque-pointers]) + # Ideally bitcode should perhaps match $CC's use, or not, of outline atomic + # functions, but for now we err on the side of suppressing them in bitcode, + # because we can't assume they're available at runtime. This affects aarch64 + # builds using the basic armv8-a ISA without LSE support. + PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-mno-outline-atomics]) + PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CXXFLAGS, [-mno-outline-atomics]) + NOT_THE_CFLAGS="" PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, NOT_THE_CFLAGS, [-Wunused-command-line-argument]) if test -n "$NOT_THE_CFLAGS"; then From 4ecb136bfaa72780332c495259d99ffd236da50e Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 22 Nov 2024 12:17:55 +0900 Subject: [PATCH 008/119] psql: Include \pset xheader_width in --help=commands|variables psql's --help was missed the description of the \pset variable xheader_width, that should be listed when using \? or --help=commands, and described for --help=variables. Oversight in a45388d6e098. Author: Pavel Luzanov Discussion: https://postgr.es/m/1e3e06d6-0807-4e62-a9f6-c11481e6eb10@postgrespro.ru Backpatch-through: 16 --- src/bin/psql/help.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index b2b749d69a5..14538bf3a7b 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -317,7 +317,7 @@ slashUsage(unsigned short int pager) " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" - " unicode_header_linestyle)\n"); + " unicode_header_linestyle|xheader_width)\n"); HELPN(" \\t [on|off] show only rows (currently %s)\n", ON(pset.popt.topt.tuples_only)); HELP0(" \\T [STRING] set HTML tag attributes, or unset if none\n"); @@ -517,6 +517,9 @@ helpVariables(unsigned short int pager) " unicode_column_linestyle\n" " unicode_header_linestyle\n" " set the style of Unicode line drawing [single, double]\n"); + HELP0(" xheader_width\n" + " set the maximum width of the header for expanded output\n" + " [full, column, page, integer value]\n"); HELP0("\nEnvironment variables:\n"); HELP0("Usage:\n"); From ee3415c00a3156d9355ba75e369e10a25ce96c55 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 25 Nov 2024 09:15:43 +0900 Subject: [PATCH 009/119] doc: Fix example with __next__() in PL/Python function Per PEP 3114, iterator.next() has been renamed to iterator.__next__(), and one example in the documentation still used next(). This caused the example provided to fail the function creation since Python 2 is not supported anymore since 19252e8ec93. Author: Erik Wienhold Discussion: https://postgr.es/m/173209043143.2092749.13692266486972491694@wrigleys.postgresql.org Backpatch-through: 15 --- doc/src/sgml/plpython.sgml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml index e5d51d6e9f5..bee817ea822 100644 --- a/doc/src/sgml/plpython.sgml +++ b/doc/src/sgml/plpython.sgml @@ -553,7 +553,7 @@ $$ LANGUAGE plpython3u; Iterator (any object providing __iter__ and - next methods) + __next__ methods) @@ -569,7 +569,7 @@ AS $$ def __iter__ (self): return self - def next (self): + def __next__(self): self.ndx += 1 if self.ndx == len(self.who): raise StopIteration From 0f6d902308a82db2edaa0bc33f6ed5e5a00e8752 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Mon, 25 Nov 2024 13:11:28 +1300 Subject: [PATCH 010/119] Assume that conforms to the C standard. Previously we checked "for that conforms to C99" using autoconf's AC_HEADER_STDBOOL macro. We've required C99 since PostgreSQL 12, so the test was redundant, and under C23 it was broken: autoconf 2.69's implementation doesn't understand C23's new empty header (the macros it's looking for went away, replaced by language keywords). Later autoconf versions fixed that, but let's just remove the anachronistic test. HAVE_STDBOOL_H and HAVE__BOOL will no longer be defined, but they weren't directly tested in core or likely extensions (except in 11, see below). PG_USE_STDBOOL (or USE_STDBOOL in 11 and 12) is still defined when sizeof(bool) is 1, which should be true on all modern systems. Otherwise we define our own bool type and values of size 1, which would fail to compile under C23 as revealed by the broken test. (We'll probably clean that dead code up in master, but here we want a minimal back-patchable change.) This came to our attention when GCC 15 recently started using using C23 by default and failed to compile the replacement code, as reported by Sam James and build farm animal alligator. Back-patch to all supported releases, and then two older versions that also know about , per the recently-out-of-support policy[1]. 12 requires C99 so it's much like the supported releases, but 11 only assumes C89 so it now uses AC_CHECK_HEADERS instead of the overly picky AC_HEADER_STDBOOL. (I could find no discussion of which historical systems had but failed the conformance test; if they ever existed, they surely aren't relevant to that policy's goals.) [1] https://wiki.postgresql.org/wiki/Committing_checklist#Policies Reported-by: Sam James Reviewed-by: Peter Eisentraut (master version) Reviewed-by: Tom Lane (approach) Discussion: https://www.postgresql.org/message-id/flat/87o72eo9iu.fsf%40gentoo.org --- configure | 182 +++++++++---------------------------- configure.ac | 13 +-- meson.build | 9 +- src/include/c.h | 2 +- src/include/pg_config.h.in | 6 -- src/tools/msvc/Solution.pm | 2 - 6 files changed, 51 insertions(+), 163 deletions(-) diff --git a/configure b/configure index e6a76aefd0f..171dad83300 100755 --- a/configure +++ b/configure @@ -2094,116 +2094,116 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_func -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else - eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$4 +$5 int main () { -if (sizeof ($2)) - return 0; +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$4 +$5 int main () { -if (sizeof (($2))) - return 0; +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - + eval "$4=yes" else - eval "$3=yes" + eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -eval ac_res=\$$3 +eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_type +} # ac_fn_c_check_member -# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES -# ---------------------------------------------------- -# Tries to find if the field MEMBER exists in type AGGR, after including -# INCLUDES, setting cache variable VAR accordingly. -ac_fn_c_check_member () +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else + eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$5 +$4 int main () { -static $2 ac_aggr; -if (ac_aggr.$3) -return 0; +if (sizeof ($2)) + return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$5 +$4 int main () { -static $2 ac_aggr; -if (sizeof ac_aggr.$3) -return 0; +if (sizeof (($2))) + return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" + else - eval "$4=no" + eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -eval ac_res=\$$4 +eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_member +} # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- @@ -13768,100 +13768,6 @@ fi ## Header files ## -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 -$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } -if ${ac_cv_header_stdbool_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include - #ifndef bool - "error: bool is not defined" - #endif - #ifndef false - "error: false is not defined" - #endif - #if false - "error: false is not 0" - #endif - #ifndef true - "error: true is not defined" - #endif - #if true != 1 - "error: true is not 1" - #endif - #ifndef __bool_true_false_are_defined - "error: __bool_true_false_are_defined is not defined" - #endif - - struct s { _Bool s: 1; _Bool t; } s; - - char a[true == 1 ? 1 : -1]; - char b[false == 0 ? 1 : -1]; - char c[__bool_true_false_are_defined == 1 ? 1 : -1]; - char d[(bool) 0.5 == true ? 1 : -1]; - /* See body of main program for 'e'. */ - char f[(_Bool) 0.0 == false ? 1 : -1]; - char g[true]; - char h[sizeof (_Bool)]; - char i[sizeof s.t]; - enum { j = false, k = true, l = false * true, m = true * 256 }; - /* The following fails for - HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ - _Bool n[m]; - char o[sizeof n == m * sizeof n[0] ? 1 : -1]; - char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; - /* Catch a bug in an HP-UX C compiler. See - http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html - http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html - */ - _Bool q = true; - _Bool *pq = &q; - -int -main () -{ - - bool e = &s; - *pq |= q; - *pq |= ! q; - /* Refer to every declared value, to avoid compiler optimizations. */ - return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l - + !m + !n + !o + !p + !q + !pq); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdbool_h=yes -else - ac_cv_header_stdbool_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 -$as_echo "$ac_cv_header_stdbool_h" >&6; } - ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" -if test "x$ac_cv_type__Bool" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE__BOOL 1 -_ACEOF - - -fi - - -if test $ac_cv_header_stdbool_h = yes; then - -$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h - -fi - - for ac_header in atomic.h copyfile.h execinfo.h getopt.h ifaddrs.h langinfo.h mbarrier.h sys/epoll.h sys/event.h sys/personality.h sys/prctl.h sys/procctl.h sys/signalfd.h sys/ucred.h termios.h ucred.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -15675,9 +15581,7 @@ $as_echo_n "checking size of bool... " >&6; } if ${ac_cv_sizeof_bool+:} false; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#ifdef HAVE_STDBOOL_H -#include -#endif + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#include "; then : else @@ -15703,7 +15607,7 @@ _ACEOF -if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then +if test "$ac_cv_sizeof_bool" = 1; then $as_echo "#define PG_USE_STDBOOL 1" >>confdefs.h diff --git a/configure.ac b/configure.ac index aea266d9104..78c8be31f47 100644 --- a/configure.ac +++ b/configure.ac @@ -1497,8 +1497,6 @@ AC_SUBST(UUID_LIBS) ## Header files ## -AC_HEADER_STDBOOL - AC_CHECK_HEADERS(m4_normalize([ atomic.h copyfile.h @@ -1773,14 +1771,11 @@ if test "$ac_cv_sizeof_off_t" -lt 8; then fi fi -AC_CHECK_SIZEOF([bool], [], -[#ifdef HAVE_STDBOOL_H -#include -#endif]) +AC_CHECK_SIZEOF([bool], [], [#include ]) -dnl We use if we have it and it declares type bool as having -dnl size 1. Otherwise, c.h will fall back to declaring bool as unsigned char. -if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then +dnl We use if bool has size 1 after including it. Otherwise, c.h +dnl will fall back to declaring bool as unsigned char. +if test "$ac_cv_sizeof_bool" = 1; then AC_DEFINE([PG_USE_STDBOOL], 1, [Define to 1 to use to define type bool.]) fi diff --git a/meson.build b/meson.build index 175a105aa11..f00a860a51c 100644 --- a/meson.build +++ b/meson.build @@ -1757,12 +1757,9 @@ if cc.compiles(''' endif -# We use if we have it and it declares type bool as having -# size 1. Otherwise, c.h will fall back to declaring bool as unsigned char. -if cc.has_type('_Bool', args: test_c_args) \ - and cc.has_type('bool', prefix: '#include ', args: test_c_args) \ - and cc.sizeof('bool', prefix: '#include ', args: test_c_args) == 1 - cdata.set('HAVE__BOOL', 1) +# We use if bool has size 1 after including it. Otherwise, c.h +# will fall back to declaring bool as unsigned char. +if cc.sizeof('bool', prefix: '#include ', args: test_c_args) == 1 cdata.set('PG_USE_STDBOOL', 1) endif diff --git a/src/include/c.h b/src/include/c.h index f69d739be57..a7258cce1fc 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -419,7 +419,7 @@ typedef void (*pg_funcptr_t) (void); * bool * Boolean value, either true or false. * - * We use stdbool.h if available and its bool has size 1. That's useful for + * We use stdbool.h if bool has size 1 after including it. That's useful for * better compiler and debugger output and for compatibility with third-party * libraries. But PostgreSQL currently cannot deal with bool of other sizes; * there are static assertions around the code to prevent that. diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index cb380c96e26..ce3063b2b22 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -403,9 +403,6 @@ /* Define to 1 if you have the `SSL_CTX_set_num_tickets' function. */ #undef HAVE_SSL_CTX_SET_NUM_TICKETS -/* Define to 1 if stdbool.h conforms to C99. */ -#undef HAVE_STDBOOL_H - /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H @@ -535,9 +532,6 @@ /* Define to 1 if the assembler supports X86_64's POPCNTQ instruction. */ #undef HAVE_X86_64_POPCNTQ -/* Define to 1 if the system has the type `_Bool'. */ -#undef HAVE__BOOL - /* Define to 1 if your compiler understands __builtin_bswap16. */ #undef HAVE__BUILTIN_BSWAP16 diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 2a4c4f35566..557feb00866 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -330,7 +330,6 @@ sub GenerateFiles HAVE_SPINLOCKS => 1, HAVE_SSL_CTX_SET_CERT_CB => undef, HAVE_SSL_CTX_SET_NUM_TICKETS => undef, - HAVE_STDBOOL_H => 1, HAVE_STDINT_H => 1, HAVE_STDLIB_H => 1, HAVE_STRCHRNUL => undef, @@ -374,7 +373,6 @@ sub GenerateFiles HAVE_X509_GET_SIGNATURE_NID => 1, HAVE_X509_GET_SIGNATURE_INFO => undef, HAVE_X86_64_POPCNTQ => undef, - HAVE__BOOL => undef, HAVE__BUILTIN_BSWAP16 => undef, HAVE__BUILTIN_BSWAP32 => undef, HAVE__BUILTIN_BSWAP64 => undef, From 07c77803c82bf251b085611f72e2a10ebe8ab51c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 25 Nov 2024 08:03:16 +0100 Subject: [PATCH 011/119] Add support for Tcl 9 Tcl 9 changed several API functions to take Tcl_Size, which is ptrdiff_t, instead of int, for 64-bit enablement. We have to change a few local variables to be compatible with that. We also provide a fallback typedef of Tcl_Size for older Tcl versions. The affected variables are used for quantities that will not approach values beyond the range of int, so this doesn't change any functionality. Reviewed-by: Tristan Partin Discussion: https://www.postgresql.org/message-id/flat/bce0fe54-75b4-438e-b42b-8e84bc7c0e9c%40eisentraut.org --- src/pl/tcl/pltcl.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 13341592b5c..bff00aec350 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -56,6 +56,10 @@ PG_MODULE_MAGIC; #define CONST86 #endif +#if !HAVE_TCL_VERSION(8,7) +typedef int Tcl_Size; +#endif + /* define our text domain for translations */ #undef TEXTDOMAIN #define TEXTDOMAIN PG_TEXTDOMAIN("pltcl") @@ -987,7 +991,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, HeapTuple tup; Tcl_Obj *resultObj; Tcl_Obj **resultObjv; - int resultObjc; + Tcl_Size resultObjc; /* * Set up data about result type. XXX it's tempting to consider @@ -1063,7 +1067,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, int tcl_rc; int i; const char *result; - int result_Objc; + Tcl_Size result_Objc; Tcl_Obj **result_Objv; int rc PG_USED_FOR_ASSERTS_ONLY; @@ -2008,7 +2012,7 @@ pltcl_quote(ClientData cdata, Tcl_Interp *interp, char *tmp; const char *cp1; char *cp2; - int length; + Tcl_Size length; /************************************************************ * Check call syntax @@ -2202,7 +2206,7 @@ pltcl_returnnext(ClientData cdata, Tcl_Interp *interp, if (prodesc->fn_retistuple) { Tcl_Obj **rowObjv; - int rowObjc; + Tcl_Size rowObjc; /* result should be a list, so break it down */ if (Tcl_ListObjGetElements(interp, objv[1], &rowObjc, &rowObjv) == TCL_ERROR) @@ -2543,7 +2547,7 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { volatile MemoryContext plan_cxt = NULL; - int nargs; + Tcl_Size nargs; Tcl_Obj **argsObj; pltcl_query_desc *qdesc; int i; @@ -2681,7 +2685,7 @@ pltcl_SPI_execute_plan(ClientData cdata, Tcl_Interp *interp, const char *arrayname = NULL; Tcl_Obj *loop_body = NULL; int count = 0; - int callObjc; + Tcl_Size callObjc; Tcl_Obj **callObjv = NULL; Datum *argvalues; MemoryContext oldcontext = CurrentMemoryContext; From 1f4aadec41b8655e4e37c18c3c11552091ef7123 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 25 Nov 2024 12:50:17 -0500 Subject: [PATCH 012/119] Update configure probes for CFLAGS needed for ARM CRC instructions. On ARM platforms where the baseline CPU target lacks CRC instructions, we need to supply a -march flag to persuade the compiler to compile such instructions. It turns out that our existing choice of "-march=armv8-a+crc" has not worked for some time, because recent gcc will interpret that as selecting software floating point, and then will spit up if the platform requires hard-float ABI, as most do nowadays. The end result was to silently fall back to software CRC, which isn't very desirable since in practice almost all currently produced ARM chips do have hardware CRC. We can fix this by using "-march=armv8-a+crc+simd" to enable the correct ABI choice. (This has no impact on the code actually generated, since neither of the files we compile with this flag does any floating-point stuff, let alone SIMD.) Keep the test for "-march=armv8-a+crc" since that's required for soft-float ABI, but try that second since most platforms we're likely to build on use hard-float. Since this isn't working as-intended on the last several years' worth of gcc releases, back-patch to all supported branches. Discussion: https://postgr.es/m/4496616.iHFcN1HehY@portable-bastien --- configure | 47 +++++++++++++++++++++++++++++++++++++++++++++-- configure.ac | 8 ++++++-- meson.build | 7 +++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 171dad83300..8c2ab3a1973 100755 --- a/configure +++ b/configure @@ -18050,7 +18050,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Check for ARMv8 CRC Extension intrinsics to do CRC calculations. # # First check if __crc32c* intrinsics can be used with the default compiler -# flags. If not, check if adding -march=armv8-a+crc flag helps. +# flags. If not, check if adding "-march=armv8-a+crc+simd" flag helps. +# On systems using soft-float ABI, "-march=armv8-a+crc" is required instead. # CFLAGS_CRC is set if the extra flag is required. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=" >&5 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=... " >&6; } @@ -18093,7 +18094,48 @@ if test x"$pgac_cv_armv8_crc32c_intrinsics_" = x"yes"; then fi if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc+simd" >&5 +$as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc+simd... " >&6; } +if ${pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS -march=armv8-a+crc+simd" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +unsigned int crc = 0; + crc = __crc32cb(crc, 0); + crc = __crc32ch(crc, 0); + crc = __crc32cw(crc, 0); + crc = __crc32cd(crc, 0); + /* return computed value, to prevent the above being optimized away */ + return crc == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd=yes +else + pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" >&5 +$as_echo "$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" >&6; } +if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" = x"yes"; then + CFLAGS_CRC="-march=armv8-a+crc+simd" + pgac_armv8_crc32c_intrinsics=yes +fi + + if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc" >&5 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc... " >&6; } if ${pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc+:} false; then : $as_echo_n "(cached) " >&6 @@ -18133,6 +18175,7 @@ if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" = x"yes"; then pgac_armv8_crc32c_intrinsics=yes fi + fi fi diff --git a/configure.ac b/configure.ac index 78c8be31f47..23add80d8fd 100644 --- a/configure.ac +++ b/configure.ac @@ -2124,11 +2124,15 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ # Check for ARMv8 CRC Extension intrinsics to do CRC calculations. # # First check if __crc32c* intrinsics can be used with the default compiler -# flags. If not, check if adding -march=armv8-a+crc flag helps. +# flags. If not, check if adding "-march=armv8-a+crc+simd" flag helps. +# On systems using soft-float ABI, "-march=armv8-a+crc" is required instead. # CFLAGS_CRC is set if the extra flag is required. PGAC_ARMV8_CRC32C_INTRINSICS([]) if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then - PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc]) + PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc+simd]) + if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then + PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc]) + fi fi AC_SUBST(CFLAGS_CRC) diff --git a/meson.build b/meson.build index f00a860a51c..bab28893285 100644 --- a/meson.build +++ b/meson.build @@ -2178,6 +2178,13 @@ int main(void) # Use ARM CRC Extension unconditionally cdata.set('USE_ARMV8_CRC32C', 1) have_optimized_crc = true + elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc+simd', + args: test_c_args + ['-march=armv8-a+crc+simd']) + # Use ARM CRC Extension, with runtime check + cflags_crc += '-march=armv8-a+crc+simd' + cdata.set('USE_ARMV8_CRC32C', false) + cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1) + have_optimized_crc = true elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc', args: test_c_args + ['-march=armv8-a+crc']) # Use ARM CRC Extension, with runtime check From 5609b474dba3f8e4874fa8ac08a98f4f00bd063c Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 26 Nov 2024 11:29:31 +1300 Subject: [PATCH 013/119] Clean up reference in meson.build. Commit bc5a4dfc accidentally left a check for in meson.build's header_checks. Synchronize with configure, which no longer defines HAVE_STDBOOL_H. There is still a reference to in an earlier test to see if we need -std=c99 to get C99 features, like autoconf 2.69's AC_PROG_CC_C99. (Therefore the test remove by this commit was tautological since day one: you'd have copped "C compiler does not support C99" before making it this far.) Back-patch to 16, where meson begins. --- meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/meson.build b/meson.build index bab28893285..8ea42dea81f 100644 --- a/meson.build +++ b/meson.build @@ -2258,7 +2258,6 @@ header_checks = [ 'ifaddrs.h', 'langinfo.h', 'mbarrier.h', - 'stdbool.h', 'strings.h', 'sys/epoll.h', 'sys/event.h', From c1285bbeb962750d9d1aa5e84a6761d7d135146a Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Mon, 25 Nov 2024 14:42:35 -0800 Subject: [PATCH 014/119] Avoid "you don't own a lock of type ExclusiveLock" in GRANT TABLESPACE. This WARNING appeared because SearchSysCacheLocked1() read cc_relisshared before catcache initialization, when the field is false unconditionally. On the basis of reading false there, it constructed a locktag as though pg_tablespace weren't relisshared. Only shared catalogs could be affected, and only GRANT TABLESPACE was affected in practice. SearchSysCacheLocked1() callers use one other shared-relation syscache, DATABASEOID. DATABASEOID is initialized by the end of CheckMyDatabase(), making the problem unreachable for pg_database. Back-patch to v13 (all supported versions). This has no known impact before v16, where ExecGrant_common() first appeared. Earlier branches avoid trouble by having a separate ExecGrant_Tablespace() that doesn't use LOCKTAG_TUPLE. However, leaving this unfixed in v15 could ensnare a future back-patch of a SearchSysCacheLocked1() call. Reported by Aya Iwata. Discussion: https://postgr.es/m/OS7PR01MB11964507B5548245A7EE54E70EA212@OS7PR01MB11964.jpnprd01.prod.outlook.com --- src/backend/utils/cache/syscache.c | 15 ++++++++++----- src/test/regress/expected/tablespace.out | 5 +++++ src/test/regress/sql/tablespace.sql | 6 ++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 697b17bdd74..40517895d82 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -887,11 +887,9 @@ HeapTuple SearchSysCacheLocked1(int cacheId, Datum key1) { + CatCache *cache = SysCache[cacheId]; ItemPointerData tid; LOCKTAG tag; - Oid dboid = - SysCache[cacheId]->cc_relisshared ? InvalidOid : MyDatabaseId; - Oid reloid = cacheinfo[cacheId].reloid; /*---------- * Since inplace updates may happen just before our LockTuple(), we must @@ -943,8 +941,15 @@ SearchSysCacheLocked1(int cacheId, tid = tuple->t_self; ReleaseSysCache(tuple); - /* like: LockTuple(rel, &tid, lockmode) */ - SET_LOCKTAG_TUPLE(tag, dboid, reloid, + + /* + * Do like LockTuple(rel, &tid, lockmode). While cc_relisshared won't + * change from one iteration to another, it may have been a temporary + * "false" until our first SearchSysCache1(). + */ + SET_LOCKTAG_TUPLE(tag, + cache->cc_relisshared ? InvalidOid : MyDatabaseId, + cache->cc_reloid, ItemPointerGetBlockNumber(&tid), ItemPointerGetOffsetNumber(&tid)); (void) LockAcquire(&tag, lockmode, false, false); diff --git a/src/test/regress/expected/tablespace.out b/src/test/regress/expected/tablespace.out index 9aabb853497..9c561395970 100644 --- a/src/test/regress/expected/tablespace.out +++ b/src/test/regress/expected/tablespace.out @@ -927,6 +927,11 @@ ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; -- Fail, not empty DROP TABLESPACE regress_tblspace; ERROR: tablespace "regress_tblspace" is not empty +-- Adequate cache initialization before GRANT +\c - +BEGIN; +GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC; +ROLLBACK; CREATE ROLE regress_tablespace_user1 login; CREATE ROLE regress_tablespace_user2 login; GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; diff --git a/src/test/regress/sql/tablespace.sql b/src/test/regress/sql/tablespace.sql index d274d9615ef..0f9c136d317 100644 --- a/src/test/regress/sql/tablespace.sql +++ b/src/test/regress/sql/tablespace.sql @@ -396,6 +396,12 @@ ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; -- Fail, not empty DROP TABLESPACE regress_tblspace; +-- Adequate cache initialization before GRANT +\c - +BEGIN; +GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC; +ROLLBACK; + CREATE ROLE regress_tablespace_user1 login; CREATE ROLE regress_tablespace_user2 login; GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; From 4aba56adcd29c5d9a6f38f9bc428b916e3d08d5d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 25 Nov 2024 18:08:58 -0500 Subject: [PATCH 015/119] Fix NULLIF()'s handling of read-write expanded objects. If passed a read-write expanded object pointer, the EEOP_NULLIF code would hand that same pointer to the equality function and then (unless equality was reported) also return the same pointer as its value. This is no good, because a function that receives a read-write expanded object pointer is fully entitled to scribble on or even delete the object, thus corrupting the NULLIF output. (This problem is likely unobservable with the equality functions provided in core Postgres, but it's easy to demonstrate with one coded in plpgsql.) To fix, make sure the pointer passed to the equality function is read-only. We can still return the original read-write pointer as the NULLIF result, allowing optimization of later operations. Per bug #18722 from Alexander Lakhin. This has been wrong since we invented expanded objects, so back-patch to all supported branches. Discussion: https://postgr.es/m/18722-fd9e645448cc78b4@postgresql.org --- src/backend/executor/execExpr.c | 8 +++++++ src/backend/executor/execExprInterp.c | 14 +++++++++++- src/backend/jit/llvm/llvmjit_expr.c | 33 +++++++++++++++++++++++---- src/include/executor/execExpr.h | 1 + src/test/regress/expected/case.out | 8 +++++++ src/test/regress/sql/case.sql | 5 ++++ 6 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 60f9eb28cd4..ca0d38b3095 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -1170,6 +1170,14 @@ ExecInitExprRec(Expr *node, ExprState *state, op->args, op->opfuncid, op->inputcollid, state); + /* + * If first argument is of varlena type, we'll need to ensure + * that the value passed to the comparison function is a + * read-only pointer. + */ + scratch.d.func.make_ro = + (get_typlen(exprType((Node *) linitial(op->args))) == -1); + /* * Change opcode of call instruction to EEOP_NULLIF. * diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 6b7997465d0..30ea9627c75 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -1280,12 +1280,24 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) * The arguments are already evaluated into fcinfo->args. */ FunctionCallInfo fcinfo = op->d.func.fcinfo_data; + Datum save_arg0 = fcinfo->args[0].value; /* if either argument is NULL they can't be equal */ if (!fcinfo->args[0].isnull && !fcinfo->args[1].isnull) { Datum result; + /* + * If first argument is of varlena type, it might be an + * expanded datum. We need to ensure that the value passed to + * the comparison function is a read-only pointer. However, + * if we end by returning the first argument, that will be the + * original read-write pointer if it was read-write. + */ + if (op->d.func.make_ro) + fcinfo->args[0].value = + MakeExpandedObjectReadOnlyInternal(save_arg0); + fcinfo->isnull = false; result = op->d.func.fn_addr(fcinfo); @@ -1300,7 +1312,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) } /* Arguments aren't equal, so return the first one */ - *op->resvalue = fcinfo->args[0].value; + *op->resvalue = save_arg0; *op->resnull = fcinfo->args[0].isnull; EEO_NEXT(); diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index e2b566b9d53..600262fd99d 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -1550,6 +1550,9 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); + /* save original arg[0] */ + v_arg0 = l_funcvalue(b, v_fcinfo, 0); + /* if either argument is NULL they can't be equal */ v_argnull0 = l_funcnull(b, v_fcinfo, 0); v_argnull1 = l_funcnull(b, v_fcinfo, 1); @@ -1566,7 +1569,6 @@ llvm_compile_expr(ExprState *state) /* one (or both) of the arguments are null, return arg[0] */ LLVMPositionBuilderAtEnd(b, b_hasnull); - v_arg0 = l_funcvalue(b, v_fcinfo, 0); LLVMBuildStore(b, v_argnull0, v_resnullp); LLVMBuildStore(b, v_arg0, v_resvaluep); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1574,12 +1576,35 @@ llvm_compile_expr(ExprState *state) /* build block to invoke function and check result */ LLVMPositionBuilderAtEnd(b, b_nonull); + /* + * If first argument is of varlena type, it might be an + * expanded datum. We need to ensure that the value + * passed to the comparison function is a read-only + * pointer. However, if we end by returning the first + * argument, that will be the original read-write pointer + * if it was read-write. + */ + if (op->d.func.make_ro) + { + LLVMValueRef v_params[1]; + LLVMValueRef v_arg0_ro; + + v_params[0] = v_arg0; + v_arg0_ro = + l_call(b, + llvm_pg_var_func_type("MakeExpandedObjectReadOnlyInternal"), + llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), + v_params, lengthof(v_params), ""); + LLVMBuildStore(b, v_arg0_ro, + l_funcvaluep(b, v_fcinfo, 0)); + } + v_retval = BuildV1Call(context, b, mod, fcinfo, &v_fcinfo_isnull); /* - * If result not null, and arguments are equal return null - * (same result as if there'd been NULLs, hence reuse - * b_hasnull). + * If result not null and arguments are equal return null, + * else return arg[0] (same result as if there'd been + * NULLs, hence reuse b_hasnull). */ v_argsequal = LLVMBuildAnd(b, LLVMBuildICmp(b, LLVMIntEQ, diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 048573c2bcb..0e67484cdd3 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -350,6 +350,7 @@ typedef struct ExprEvalStep /* faster to access without additional indirection: */ PGFunction fn_addr; /* actual call address */ int nargs; /* number of arguments */ + bool make_ro; /* make arg0 R/O (used only for NULLIF) */ } func; /* for EEOP_BOOL_*_STEP */ diff --git a/src/test/regress/expected/case.out b/src/test/regress/expected/case.out index f5136c17abb..efee7fc4317 100644 --- a/src/test/regress/expected/case.out +++ b/src/test/regress/expected/case.out @@ -397,6 +397,14 @@ SELECT CASE make_ad(1,2) right (1 row) +-- While we're here, also test handling of a NULLIF arg that is a read/write +-- object (bug #18722) +SELECT NULLIF(make_ad(1,2), array[2,3]::arrdomain); + nullif +-------- + {1,2} +(1 row) + ROLLBACK; -- Test interaction of CASE with ArrayCoerceExpr (bug #15471) BEGIN; diff --git a/src/test/regress/sql/case.sql b/src/test/regress/sql/case.sql index 83fe43be6b8..388d4c6f528 100644 --- a/src/test/regress/sql/case.sql +++ b/src/test/regress/sql/case.sql @@ -242,6 +242,11 @@ SELECT CASE make_ad(1,2) WHEN array[1,2]::arrdomain THEN 'right' END; +-- While we're here, also test handling of a NULLIF arg that is a read/write +-- object (bug #18722) + +SELECT NULLIF(make_ad(1,2), array[2,3]::arrdomain); + ROLLBACK; -- Test interaction of CASE with ArrayCoerceExpr (bug #15471) From ae145d1de6773d43169f7aefb5666fe9ecb6d470 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 13 Aug 2024 06:15:28 +0200 Subject: [PATCH 016/119] Rename C23 keyword constexpr is a keyword in C23. Rename a conflicting identifier for future-proofing. Reviewed-by: Robert Haas Discussion: https://www.postgresql.org/message-id/flat/08abc832-1384-4aca-a535-1a79765b565e%40eisentraut.org Discussion: https://www.postgresql.org/message-id/flat/87o72eo9iu.fsf%40gentoo.org --- src/backend/optimizer/util/predtest.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/backend/optimizer/util/predtest.c b/src/backend/optimizer/util/predtest.c index 237c8838743..23bf308e135 100644 --- a/src/backend/optimizer/util/predtest.c +++ b/src/backend/optimizer/util/predtest.c @@ -948,7 +948,7 @@ boolexpr_startup_fn(Node *clause, PredIterInfo info) typedef struct { OpExpr opexpr; - Const constexpr; + Const const_expr; int next_elem; int num_elems; Datum *elem_values; @@ -992,13 +992,13 @@ arrayconst_startup_fn(Node *clause, PredIterInfo info) state->opexpr.args = list_copy(saop->args); /* Set up a dummy Const node to hold the per-element values */ - state->constexpr.xpr.type = T_Const; - state->constexpr.consttype = ARR_ELEMTYPE(arrayval); - state->constexpr.consttypmod = -1; - state->constexpr.constcollid = arrayconst->constcollid; - state->constexpr.constlen = elmlen; - state->constexpr.constbyval = elmbyval; - lsecond(state->opexpr.args) = &state->constexpr; + state->const_expr.xpr.type = T_Const; + state->const_expr.consttype = ARR_ELEMTYPE(arrayval); + state->const_expr.consttypmod = -1; + state->const_expr.constcollid = arrayconst->constcollid; + state->const_expr.constlen = elmlen; + state->const_expr.constbyval = elmbyval; + lsecond(state->opexpr.args) = &state->const_expr; /* Initialize iteration state */ state->next_elem = 0; @@ -1011,8 +1011,8 @@ arrayconst_next_fn(PredIterInfo info) if (state->next_elem >= state->num_elems) return NULL; - state->constexpr.constvalue = state->elem_values[state->next_elem]; - state->constexpr.constisnull = state->elem_nulls[state->next_elem]; + state->const_expr.constvalue = state->elem_values[state->next_elem]; + state->const_expr.constisnull = state->elem_nulls[state->next_elem]; state->next_elem++; return (Node *) &(state->opexpr); } From f7a929a007e64aa9a2c7d65555029ae90c5ed6bd Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 22 Oct 2024 08:12:43 +0200 Subject: [PATCH 017/119] Fix C23 compiler warning The approach of declaring a function pointer with an empty argument list and hoping that the compiler will not complain about casting it to another type no longer works with C23, because foo() is now equivalent to foo(void). We don't need to do this here. With a few struct forward declarations we can supply a correct argument list without having to pull in another header file. (This is the only new warning with C23. Together with the previous fix a67a49648d9, this makes the whole code compile cleanly under C23.) Reviewed-by: Tom Lane Discussion: https://www.postgresql.org/message-id/flat/95c6a9bf-d306-43d8-b880-664ef08f2944%40eisentraut.org Discussion: https://www.postgresql.org/message-id/flat/87o72eo9iu.fsf%40gentoo.org --- src/include/nodes/pathnodes.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 94aebadd9f9..5e89dbffce2 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1086,6 +1086,9 @@ typedef struct IndexOptInfo IndexOptInfo; #define HAVE_INDEXOPTINFO_TYPEDEF 1 #endif +struct IndexPath; /* avoid including pathnodes.h here */ +struct PlannerInfo; /* avoid including pathnodes.h here */ + struct IndexOptInfo { pg_node_attr(no_copy_equal, no_read, no_query_jumble) @@ -1185,7 +1188,7 @@ struct IndexOptInfo bool amcanmarkpos; /* AM's cost estimator */ /* Rather than include amapi.h here, we declare amcostestimate like this */ - void (*amcostestimate) () pg_node_attr(read_write_ignore); + void (*amcostestimate) (struct PlannerInfo *, struct IndexPath *, double, Cost *, Cost *, Selectivity *, double *, double *) pg_node_attr(read_write_ignore); }; /* From 766b0b40aa6a537e8bf899c48736c2ec3ae89869 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 26 Nov 2024 18:06:08 +0100 Subject: [PATCH 018/119] meson: Build pgevent as shared_module rather than shared_library This matches the behavior of the makefiles and the old MSVC build system. The main effect is that the build result gets installed into pkglibdir rather than bindir. The documentation says to locate the library in pkglibdir, so this makes the code match the documentation again. Reviewed-by: Ryohei Takahashi (Fujitsu) Discussion: https://www.postgresql.org/message-id/flat/TY3PR01MB118912125614599641CA881B782522%40TY3PR01MB11891.jpnprd01.prod.outlook.com --- src/bin/pgevent/meson.build | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build index eca930ae472..8a3324d455b 100644 --- a/src/bin/pgevent/meson.build +++ b/src/bin/pgevent/meson.build @@ -20,13 +20,11 @@ if cc.get_id() == 'msvc' pgevent_link_args += '/ignore:4104' endif -pgevent = shared_library('pgevent', +pgevent = shared_module('pgevent', pgevent_sources, dependencies: [frontend_code], link_args: pgevent_link_args, vs_module_defs: 'pgevent.def', - kwargs: default_lib_args + { - 'name_prefix': '', - }, + kwargs: default_mod_args, ) bin_targets += pgevent From 1250adfdf07da7eb6e1f629d7ffafd8372e0ad6d Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Sun, 26 May 2024 17:34:45 -0400 Subject: [PATCH 019/119] Fix meson uuid header check so it works with MSVC The OSSP uuid.h file includes unistd.h, so to use it with MSVC we need to include the postgres include directories so it picks up our version of that in src/include/port/win32_msvc. Adjust the meson test accordingly. Backported from commit 7c655a04a2, so we can build release 16 with UUID per request from Marina Polyakova --- meson.build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 8ea42dea81f..4e59feb91da 100644 --- a/meson.build +++ b/meson.build @@ -1463,7 +1463,10 @@ if uuidopt != 'none' error('unknown uuid build option value: @0@'.format(uuidopt)) endif - if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid) + if not cc.has_header_symbol(uuidheader, uuidfunc, + args: test_c_args, + include_directories: postgres_inc, + dependencies: uuid) error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc)) endif cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1) From a8abd36e88f50531177d5b52026194af52d45421 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 27 Nov 2024 09:31:38 +0900 Subject: [PATCH 020/119] Handle better implicit transaction state of pipeline mode When using a pipeline, a transaction starts from the first command and is committed with a Sync message or when the pipeline ends. Functions like IsInTransactionBlock() or PreventInTransactionBlock() were already able to understand a pipeline as being in a transaction block, but it was not the case of CheckTransactionBlock(). This function is called for example to generate a WARNING for SET LOCAL, complaining that it is used outside of a transaction block. The current state of the code caused multiple problems, like: - SET LOCAL executed at any stage of a pipeline issued a WARNING, even if the command was at least second in line where the pipeline is in a transaction state. - LOCK TABLE failed when invoked at any step of a pipeline, even if it should be able to work within a transaction block. The pipeline protocol assumes that the first command of a pipeline is not part of a transaction block, and that any follow-up commands is considered as within a transaction block. This commit changes the backend so as an implicit transaction block is started each time the first Execute message of a pipeline has finished processing, with this implicit transaction block ended once a sync is processed. The checks based on XACT_FLAGS_PIPELINING in the routines checking if we are in a transaction block are not necessary: it is enough to rely on the existing ones. Some tests are added to pgbench, that can be backpatched down to v17 when \syncpipeline is involved and down to v14 where \startpipeline and \endpipeline are available. This is unfortunately limited regarding the error patterns that can be checked, but it provides coverage for various pipeline combinations to check if these succeed or fail. These tests are able to capture the case of SET LOCAL's WARNING. The author has proposed a different feature to improve the coverage by adding similar meta-commands to psql where error messages could be checked, something more useful for the cases where commands cannot be used in transaction blocks, like REINDEX CONCURRENTLY or VACUUM. This is considered as future work for v18~. Author: Anthonin Bonnefoy Reviewed-by: Jelte Fennema-Nio, Michael Paquier Discussion: https://postgr.es/m/CAO6_XqrWO8uNBQrSu5r6jh+vTGi5Oiyk4y8yXDORdE2jbzw8xw@mail.gmail.com Backpatch-through: 13 --- doc/src/sgml/protocol.sgml | 21 +-- src/backend/access/transam/xact.c | 13 -- src/backend/tcop/postgres.c | 18 +++ src/bin/pgbench/t/001_pgbench_with_server.pl | 155 +++++++++++++++++++ 4 files changed, 184 insertions(+), 23 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 59dbd13d6f6..84eec5da7e3 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -1070,16 +1070,17 @@ SELCT 1/0; If the client has not issued an explicit BEGIN, - then each Sync ordinarily causes an implicit COMMIT - if the preceding step(s) succeeded, or an - implicit ROLLBACK if they failed. However, there - are a few DDL commands (such as CREATE DATABASE) - that cannot be executed inside a transaction block. If one of - these is executed in a pipeline, it will fail unless it is the first - command in the pipeline. Furthermore, upon success it will force an - immediate commit to preserve database consistency. Thus a Sync - immediately following one of these commands has no effect except to - respond with ReadyForQuery. + then an implicit transaction block is started and each Sync ordinarily + causes an implicit COMMIT if the preceding step(s) + succeeded, or an implicit ROLLBACK if they failed. + This implicit transaction block will only be detected by the server + when the first command ends without a sync. There are a few DDL + commands (such as CREATE DATABASE) that cannot be + executed inside a transaction block. If one of these is executed in a + pipeline, it will fail unless it is the first command after a Sync. + Furthermore, upon success it will force an immediate commit to preserve + database consistency. Thus a Sync immediately following one of these + commands has no effect except to respond with ReadyForQuery. diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 4a2ea4adbaf..cb8bedc46df 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -3500,16 +3500,6 @@ PreventInTransactionBlock(bool isTopLevel, const char *stmtType) errmsg("%s cannot run inside a subtransaction", stmtType))); - /* - * inside a pipeline that has started an implicit transaction? - */ - if (MyXactFlags & XACT_FLAGS_PIPELINING) - ereport(ERROR, - (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), - /* translator: %s represents an SQL statement name */ - errmsg("%s cannot be executed within a pipeline", - stmtType))); - /* * inside a function call? */ @@ -3621,9 +3611,6 @@ IsInTransactionBlock(bool isTopLevel) if (IsSubTransaction()) return true; - if (MyXactFlags & XACT_FLAGS_PIPELINING) - return true; - if (!isTopLevel) return true; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 3f427f1b47f..26aaaf19e19 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2780,6 +2780,17 @@ start_xact_command(void) xact_started = true; } + else if (MyXactFlags & XACT_FLAGS_PIPELINING) + { + /* + * When the first Execute message is completed, following commands + * will be done in an implicit transaction block created via + * pipelining. The transaction state needs to be updated to an + * implicit block if we're not already in a transaction block (like + * one started by an explicit BEGIN). + */ + BeginImplicitTransactionBlock(); + } /* * Start statement timeout if necessary. Note that this'll intentionally @@ -4918,6 +4929,13 @@ PostgresMain(const char *dbname, const char *username) case 'S': /* sync */ pq_getmsgend(&input_message); + + /* + * If pipelining was used, we may be in an implicit + * transaction block. Close it before calling + * finish_xact_command. + */ + EndImplicitTransactionBlock(); finish_xact_command(); valgrind_report_error_query("SYNC message"); send_ready_for_query = true; diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index afc9ecfaf77..44a98b4d5df 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -897,6 +897,161 @@ } }); +# Try SET LOCAL as first pipeline command. This succeeds and the first +# command is not executed inside an implicit transaction block, causing +# a WARNING. +$node->pgbench( + '-t 1 -n -M extended', + 0, + [], + [qr{WARNING: SET LOCAL can only be used in transaction blocks}], + 'SET LOCAL outside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_set_local_1' => q{ +\startpipeline +SET LOCAL statement_timeout='1h'; +\endpipeline +} + }); + +# Try SET LOCAL as second pipeline command. This succeeds and the second +# command does not cause a WARNING to be generated. +$node->pgbench( + '-t 1 -n -M extended', + 0, + [], + [qr{^$}], + 'SET LOCAL inside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_set_local_2' => q{ +\startpipeline +SELECT 1; +SET LOCAL statement_timeout='1h'; +\endpipeline +} + }); + +# Try REINDEX CONCURRENTLY as first pipeline command. This succeeds +# as the first command is outside the implicit transaction block of +# a pipeline. +$node->pgbench( + '-t 1 -n -M extended', + 0, + [], + [], + 'REINDEX CONCURRENTLY outside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_reindex_1' => q{ +\startpipeline +REINDEX TABLE CONCURRENTLY pgbench_accounts; +SELECT 1; +\endpipeline +} + }); + +# Try REINDEX CONCURRENTLY as second pipeline command. This fails +# as the second command is inside an implicit transaction block. +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [], + 'error: REINDEX CONCURRENTLY inside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_reindex_2' => q{ +\startpipeline +SELECT 1; +REINDEX TABLE CONCURRENTLY pgbench_accounts; +\endpipeline +} + }); + +# Try VACUUM as first pipeline command. Like REINDEX CONCURRENTLY, this +# succeeds as this is outside the implicit transaction block of a pipeline. +$node->pgbench( + '-t 1 -n -M extended', + 0, + [], + [], + 'VACUUM outside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_vacuum_1' => q{ +\startpipeline +VACUUM pgbench_accounts; +\endpipeline +} + }); + +# Try VACUUM as second pipeline command. This fails, as the second command +# of a pipeline is inside an implicit transaction block. +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [], + 'error: VACUUM inside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_vacuum_2' => q{ +\startpipeline +SELECT 1; +VACUUM pgbench_accounts; +\endpipeline +} + }); + +# Try subtransactions in a pipeline. These are forbidden in implicit +# transaction blocks. +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [], + 'error: subtransactions not allowed in pipeline', + { + '001_pgbench_pipeline_subtrans' => q{ +\startpipeline +SAVEPOINT a; +SELECT 1; +ROLLBACK TO SAVEPOINT a; +SELECT 2; +\endpipeline +} + }); + +# Try LOCK TABLE as first pipeline command. This fails as LOCK is outside +# an implicit transaction block. +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [], + 'error: LOCK TABLE outside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_lock_1' => q{ +\startpipeline +LOCK pgbench_accounts; +SELECT 1; +\endpipeline +} + }); + +# Try LOCK TABLE as second pipeline command. This succeeds as LOCK is inside +# an implicit transaction block. +$node->pgbench( + '-t 1 -n -M extended', + 0, + [], + [], + 'LOCK TABLE inside implicit transaction block of pipeline', + { + '001_pgbench_pipeline_lock_2' => q{ +\startpipeline +SELECT 1; +LOCK pgbench_accounts; +\endpipeline +} + }); + # Working \startpipeline in prepared query mode with serializable $node->pgbench( '-c4 -t 10 -n -M prepared', From 467df7f561dde102029e20e0011dc98987de47ff Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 27 Nov 2024 11:08:12 +0100 Subject: [PATCH 021/119] Exclude LLVM files from whitespace checks Commit 9044fc1d45a added some files from upstream LLVM. These files have different whitespace rules, which make the git whitespace checks powered by gitattributes fail. To fix, add those files to the exclude list. --- .gitattributes | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitattributes b/.gitattributes index 45e508d5799..7ce9120c29d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -23,9 +23,12 @@ src/interfaces/ecpg/test/expected/* -whitespace # These files are maintained or generated elsewhere. We take them as is. configure -whitespace ppport.h -whitespace +src/backend/jit/llvm/SectionMemoryManager.cpp -whitespace +src/backend/jit/llvm/SectionMemoryManager.LICENSE -whitespace src/backend/regex/COPYRIGHT -whitespace src/backend/snowball/libstemmer/*.c -whitespace src/backend/utils/mb/Unicode/*-std.txt -whitespace +src/include/jit/SectionMemoryManager.h -whitespace src/include/snowball/libstemmer/* -whitespace src/timezone/data/* -whitespace src/tools/pg_bsd_indent/* -whitespace From 56265ed6a12c3ccf13a1a702748fcab8d1c6111b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 27 Nov 2024 11:12:09 +0100 Subject: [PATCH 022/119] Fix typo from commit 9044fc1d45a --- src/tools/pgindent/exclude_file_patterns | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns index c9af89c6222..9fe80cb48e8 100644 --- a/src/tools/pgindent/exclude_file_patterns +++ b/src/tools/pgindent/exclude_file_patterns @@ -4,7 +4,7 @@ src/include/storage/s_lock\.h$ src/include/port/atomics/ # -# These contains C++ constructs that confuse pgindent. +# These contain C++ constructs that confuse pgindent. src/include/jit/llvmjit\.h$ src/include/jit/SectionMemoryManager\.h$ # From 1cf646957135d1200c2b7765e6446fb91bb47d86 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Wed, 27 Nov 2024 23:03:44 +0900 Subject: [PATCH 023/119] pgbench: Ensure previous progress message is fully cleared when updating. During pgbench's table initialization, progress updates could display leftover characters from the previous message if the new message was shorter. This commit resolves the issue by appending spaces to the current message to fully overwrite any remaining characters from the previous line. Back-patch to all the supported versions. Author: Yushi Ogiwara, Tatsuo Ishii, Fujii Masao Reviewed-by: Tatsuo Ishii, Fujii Masao Discussion: https://postgr.es/m/9a9b8b95b6a709877ae48ad5b0c59bb9@oss.nttdata.com --- src/bin/pgbench/pgbench.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index c1134eae5b5..fd2c8f42c50 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4890,6 +4890,8 @@ initGenerateDataClientSide(PGconn *con) PGresult *res; int i; int64 k; + int chars = 0; + int prev_chars = 0; char *copy_statement; /* used to track elapsed time and estimate of the remaining time */ @@ -4975,10 +4977,10 @@ initGenerateDataClientSide(PGconn *con) double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start); double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j; - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), - elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)", + j, (int64) naccounts * scale, + (int) (((int64) j * 100) / (naccounts * (int64) scale)), + elapsed_sec, remaining_sec); } /* let's not call the timing for each row, but only each 100 rows */ else if (use_quiet && (j % 100 == 0)) @@ -4989,14 +4991,24 @@ initGenerateDataClientSide(PGconn *con) /* have we reached the next interval (or end)? */ if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS)) { - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)", + j, (int64) naccounts * scale, + (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec); /* skip to the next interval */ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS); } } + + /* + * If the previous progress message is longer than the current one, + * add spaces to the current line to fully overwrite any remaining + * characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; } if (eol != '\n') From c26831e7362487b4f2c606e1223207baa1d495cb Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 27 Nov 2024 11:30:08 -0500 Subject: [PATCH 024/119] ci: Fix cached MacPorts installation management 1. The error reporting of "port setrequested list-of-packages..." changed, hiding errors we were relying on to know if all packages in our list were already installed. Use a loop instead. 2. The cached MacPorts installation was shared between PostgreSQL major branches, though each branch wanted different packages. Add the list of packages to cache key, so that different branches, when tested in one github account/repo such as postgres/postgres, stop fighting with each other, adding and removing packages. Back-patch to 15 where CI began. Author: Thomas Munro Author: Nazir Bilal Yavuz Suggested-by: Andres Freund Discussion: https://postgr.es/m/au2uqfuy2nf43nwy2txmc5t2emhwij7kzupygto3d2ffgtrdgr%40ckvrlwyflnh2 --- .cirrus.tasks.yml | 34 +++++++++++++++------------- src/tools/ci/ci_macports_packages.sh | 15 ++++++++---- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index d8b7f9d32ab..197270feeaa 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -424,6 +424,20 @@ task: CCACHE_DIR: ${HOME}/ccache MACPORTS_CACHE: ${HOME}/macports-cache + MACOS_PACKAGE_LIST: >- + ccache + icu + kerberos5 + lz4 + meson + openldap + openssl + p5.34-io-tty + p5.34-ipc-run + python312 + tcl + zstd + CC: ccache cc CXX: ccache c++ CFLAGS: -Og -ggdb @@ -457,26 +471,14 @@ task: macports_cache: folder: ${MACPORTS_CACHE} fingerprint_script: | - # Include the OS major version in the cache key. If the OS image changes - # to a different major version, we need to reinstall. + # Reinstall packages if the OS major version, the list of the packages + # to install or the MacPorts install script changes. sw_vers -productVersion | sed 's/\..*//' - # Also start afresh if we change our MacPorts install script. + echo $MACOS_PACKAGE_LIST md5 src/tools/ci/ci_macports_packages.sh reupload_on_changes: true setup_additional_packages_script: | - sh src/tools/ci/ci_macports_packages.sh \ - ccache \ - icu \ - kerberos5 \ - lz4 \ - meson \ - openldap \ - openssl \ - p5.34-io-tty \ - p5.34-ipc-run \ - python312 \ - tcl \ - zstd + sh src/tools/ci/ci_macports_packages.sh $MACOS_PACKAGE_LIST # system python doesn't provide headers sudo /opt/local/bin/port select python3 python312 # Make macports install visible for subsequent steps diff --git a/src/tools/ci/ci_macports_packages.sh b/src/tools/ci/ci_macports_packages.sh index 692fa88c325..8aa60f701cf 100755 --- a/src/tools/ci/ci_macports_packages.sh +++ b/src/tools/ci/ci_macports_packages.sh @@ -59,11 +59,18 @@ if [ -n "$(port -q installed installed)" ] ; then sudo port unsetrequested installed fi -# if setting all the required packages as requested fails, we need -# to install at least one of them -if ! sudo port setrequested $packages > /dev/null 2>&1 ; then - echo not all required packages installed, doing so now +# If setting all the required packages as requested fails, we need +# to install at least one of them. Need to do so one-by-one as +# port setrequested only reports failures for the first package. +echo "checking if all required packages are installed" +for package in $packages ; do + if ! sudo port setrequested $package > /dev/null 2>&1 ; then update_cached_image=1 + fi +done +echo "done" +if [ "$update_cached_image" -eq 1 ]; then + echo not all required packages installed, doing so now # to keep the image small, we deleted the ports tree from the image... sudo port selfupdate # XXX likely we'll need some other way to force an upgrade at some From 76653134ae87c7c08e1eb58da07af9f64ec78ccb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 28 Nov 2024 09:43:22 +0900 Subject: [PATCH 025/119] Revert "Handle better implicit transaction state of pipeline mode" This reverts commit d77f91214fb7 on all stable branches, due to concerns regarding the compatility side effects this could create in a minor release. The change still exists on HEAD. Discussion: https://postgr.es/m/CA+TgmoZqRgeFTg4+Yf_CMRRXiHuNz1u6ZC4FvVk+rxw0RmOPnw@mail.gmail.com Backpatch-through: 13 --- doc/src/sgml/protocol.sgml | 21 ++- src/backend/access/transam/xact.c | 13 ++ src/backend/tcop/postgres.c | 18 --- src/bin/pgbench/t/001_pgbench_with_server.pl | 155 ------------------- 4 files changed, 23 insertions(+), 184 deletions(-) diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index 84eec5da7e3..59dbd13d6f6 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -1070,17 +1070,16 @@ SELCT 1/0; If the client has not issued an explicit BEGIN, - then an implicit transaction block is started and each Sync ordinarily - causes an implicit COMMIT if the preceding step(s) - succeeded, or an implicit ROLLBACK if they failed. - This implicit transaction block will only be detected by the server - when the first command ends without a sync. There are a few DDL - commands (such as CREATE DATABASE) that cannot be - executed inside a transaction block. If one of these is executed in a - pipeline, it will fail unless it is the first command after a Sync. - Furthermore, upon success it will force an immediate commit to preserve - database consistency. Thus a Sync immediately following one of these - commands has no effect except to respond with ReadyForQuery. + then each Sync ordinarily causes an implicit COMMIT + if the preceding step(s) succeeded, or an + implicit ROLLBACK if they failed. However, there + are a few DDL commands (such as CREATE DATABASE) + that cannot be executed inside a transaction block. If one of + these is executed in a pipeline, it will fail unless it is the first + command in the pipeline. Furthermore, upon success it will force an + immediate commit to preserve database consistency. Thus a Sync + immediately following one of these commands has no effect except to + respond with ReadyForQuery. diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index cb8bedc46df..4a2ea4adbaf 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -3500,6 +3500,16 @@ PreventInTransactionBlock(bool isTopLevel, const char *stmtType) errmsg("%s cannot run inside a subtransaction", stmtType))); + /* + * inside a pipeline that has started an implicit transaction? + */ + if (MyXactFlags & XACT_FLAGS_PIPELINING) + ereport(ERROR, + (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION), + /* translator: %s represents an SQL statement name */ + errmsg("%s cannot be executed within a pipeline", + stmtType))); + /* * inside a function call? */ @@ -3611,6 +3621,9 @@ IsInTransactionBlock(bool isTopLevel) if (IsSubTransaction()) return true; + if (MyXactFlags & XACT_FLAGS_PIPELINING) + return true; + if (!isTopLevel) return true; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 26aaaf19e19..3f427f1b47f 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -2780,17 +2780,6 @@ start_xact_command(void) xact_started = true; } - else if (MyXactFlags & XACT_FLAGS_PIPELINING) - { - /* - * When the first Execute message is completed, following commands - * will be done in an implicit transaction block created via - * pipelining. The transaction state needs to be updated to an - * implicit block if we're not already in a transaction block (like - * one started by an explicit BEGIN). - */ - BeginImplicitTransactionBlock(); - } /* * Start statement timeout if necessary. Note that this'll intentionally @@ -4929,13 +4918,6 @@ PostgresMain(const char *dbname, const char *username) case 'S': /* sync */ pq_getmsgend(&input_message); - - /* - * If pipelining was used, we may be in an implicit - * transaction block. Close it before calling - * finish_xact_command. - */ - EndImplicitTransactionBlock(); finish_xact_command(); valgrind_report_error_query("SYNC message"); send_ready_for_query = true; diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index 44a98b4d5df..afc9ecfaf77 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -897,161 +897,6 @@ } }); -# Try SET LOCAL as first pipeline command. This succeeds and the first -# command is not executed inside an implicit transaction block, causing -# a WARNING. -$node->pgbench( - '-t 1 -n -M extended', - 0, - [], - [qr{WARNING: SET LOCAL can only be used in transaction blocks}], - 'SET LOCAL outside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_set_local_1' => q{ -\startpipeline -SET LOCAL statement_timeout='1h'; -\endpipeline -} - }); - -# Try SET LOCAL as second pipeline command. This succeeds and the second -# command does not cause a WARNING to be generated. -$node->pgbench( - '-t 1 -n -M extended', - 0, - [], - [qr{^$}], - 'SET LOCAL inside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_set_local_2' => q{ -\startpipeline -SELECT 1; -SET LOCAL statement_timeout='1h'; -\endpipeline -} - }); - -# Try REINDEX CONCURRENTLY as first pipeline command. This succeeds -# as the first command is outside the implicit transaction block of -# a pipeline. -$node->pgbench( - '-t 1 -n -M extended', - 0, - [], - [], - 'REINDEX CONCURRENTLY outside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_reindex_1' => q{ -\startpipeline -REINDEX TABLE CONCURRENTLY pgbench_accounts; -SELECT 1; -\endpipeline -} - }); - -# Try REINDEX CONCURRENTLY as second pipeline command. This fails -# as the second command is inside an implicit transaction block. -$node->pgbench( - '-t 1 -n -M extended', - 2, - [], - [], - 'error: REINDEX CONCURRENTLY inside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_reindex_2' => q{ -\startpipeline -SELECT 1; -REINDEX TABLE CONCURRENTLY pgbench_accounts; -\endpipeline -} - }); - -# Try VACUUM as first pipeline command. Like REINDEX CONCURRENTLY, this -# succeeds as this is outside the implicit transaction block of a pipeline. -$node->pgbench( - '-t 1 -n -M extended', - 0, - [], - [], - 'VACUUM outside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_vacuum_1' => q{ -\startpipeline -VACUUM pgbench_accounts; -\endpipeline -} - }); - -# Try VACUUM as second pipeline command. This fails, as the second command -# of a pipeline is inside an implicit transaction block. -$node->pgbench( - '-t 1 -n -M extended', - 2, - [], - [], - 'error: VACUUM inside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_vacuum_2' => q{ -\startpipeline -SELECT 1; -VACUUM pgbench_accounts; -\endpipeline -} - }); - -# Try subtransactions in a pipeline. These are forbidden in implicit -# transaction blocks. -$node->pgbench( - '-t 1 -n -M extended', - 2, - [], - [], - 'error: subtransactions not allowed in pipeline', - { - '001_pgbench_pipeline_subtrans' => q{ -\startpipeline -SAVEPOINT a; -SELECT 1; -ROLLBACK TO SAVEPOINT a; -SELECT 2; -\endpipeline -} - }); - -# Try LOCK TABLE as first pipeline command. This fails as LOCK is outside -# an implicit transaction block. -$node->pgbench( - '-t 1 -n -M extended', - 2, - [], - [], - 'error: LOCK TABLE outside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_lock_1' => q{ -\startpipeline -LOCK pgbench_accounts; -SELECT 1; -\endpipeline -} - }); - -# Try LOCK TABLE as second pipeline command. This succeeds as LOCK is inside -# an implicit transaction block. -$node->pgbench( - '-t 1 -n -M extended', - 0, - [], - [], - 'LOCK TABLE inside implicit transaction block of pipeline', - { - '001_pgbench_pipeline_lock_2' => q{ -\startpipeline -SELECT 1; -LOCK pgbench_accounts; -\endpipeline -} - }); - # Working \startpipeline in prepared query mode with serializable $node->pgbench( '-c4 -t 10 -n -M prepared', From 06d601edc7b82ecdc24e48305f9808a3b5425752 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 28 Nov 2024 15:32:57 +1300 Subject: [PATCH 026/119] Skip SectionMemoryManager.h in cpluspluscheck. Commit 9044fc1d45a0 skipped SectionMemoryManager.h in headerscheck, and by extension also cpluspluscheck, because it's C++ and would fail both tests. That worked in master and REL_17_STABLE due to 7b8e2ae2fd3b, but older branches have a separate cpluspluscheck script. We need to copy the filtering rule into there too. This problem was being reported by CI's CompilerWarnings task in the 15 and 16 branches, but was a victim of alert fatigue syndrome (unrelated problems in the back-branches). Fix 16, and back-patch to 13, as those are the live branches that have a separate cpluspluscheck script. --- src/tools/pginclude/cpluspluscheck | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck index 4e09c4686b3..b0ec08c034b 100755 --- a/src/tools/pginclude/cpluspluscheck +++ b/src/tools/pginclude/cpluspluscheck @@ -134,6 +134,9 @@ do test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue test "$f" = src/test/isolation/specparse.h && continue + # SectionMemoryManager.h is C++ + test "$f" = src/include/jit/SectionMemoryManager.h && continue + # ppport.h is not under our control, so we can't make it standalone. test "$f" = src/pl/plperl/ppport.h && continue From 85990e2fd5610576635c65db9292297b1730c947 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 28 Nov 2024 17:33:16 -0500 Subject: [PATCH 027/119] Avoid mislabeling of lateral references when pulling up a subquery. If we are pulling up a subquery that's under an outer join, and the subquery's target list contains a strict expression that uses both a subquery variable and a lateral-reference variable, it's okay to pull up the expression without wrapping it in a PlaceHolderVar. That's safe because if the subquery variable is forced to NULL by the outer join, the expression result will come out as NULL too, so we don't have to force that outcome by evaluating the expression below the outer join. It'd be correct to wrap in a PHV, but that can lead to very significantly worse plans, since we'd then have to use a nestloop plan to pass down the lateral reference to where the expression will be evaluated. However, when we do that, we should not mark the lateral reference variable as being nulled by the outer join, because it isn't after we pull up the expression in this way. So the marking logic added by cb8e50a4a was incorrect in this detail, leading to "wrong varnullingrels" errors from the consistency-checking logic in setrefs.c. It seems to be sufficient to just not mark lateral references at all in this case. (I have a nagging feeling that more complexity may be needed in cases where there are several levels of outer join, but some attempts to break it with that didn't succeed.) Per report from Bertrand Mamasam. Back-patch to v16, as the previous patch was. Discussion: https://postgr.es/m/CACZ67_UA_EVrqiFXJu9XK50baEpH=ofEPJswa2kFxg6xuSw-ww@mail.gmail.com --- src/backend/optimizer/prep/prepjointree.c | 19 ++++++++- src/test/regress/expected/subselect.out | 47 +++++++++++++++++++++++ src/test/regress/sql/subselect.sql | 16 ++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index f493525b4eb..397a047f682 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -2466,6 +2466,17 @@ pullup_replace_vars_callback(Var *var, * the plan in cases where the nullingrels get removed again * later by outer join reduction. * + * Note that we don't force wrapping of expressions containing + * lateral references, so long as they also contain Vars/PHVs + * of the subquery. This is okay because of the restriction + * to strict constructs: if the subquery's Vars/PHVs have been + * forced to NULL by an outer join then the end result of the + * expression will be NULL too, regardless of the lateral + * references. So it's not necessary to force the expression + * to be evaluated below the outer join. This can be a very + * valuable optimization, because it may allow us to avoid + * using a nested loop to pass the lateral reference down. + * * This analysis could be tighter: in particular, a non-strict * construct hidden within a lower-level PlaceHolderVar is not * reason to add another PHV. But for now it doesn't seem @@ -2530,9 +2541,13 @@ pullup_replace_vars_callback(Var *var, } else { - /* There should be lower-level Vars/PHVs we can modify */ + /* + * There should be Vars/PHVs within the expression that we can + * modify. Per above discussion, modify only Vars/PHVs of the + * subquery, not lateral references. + */ newnode = add_nulling_relids(newnode, - NULL, /* modify all Vars/PHVs */ + rcon->relids, var->varnullingrels); /* Assert we did put the varnullingrels into the expression */ Assert(bms_is_subset(var->varnullingrels, diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index 562cb71af7c..cb511707421 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -1699,6 +1699,53 @@ where tname = 'tenk1' and attnum = 1; tenk1 | unique1 (1 row) +-- Check behavior when there's a lateral reference in the output expression +explain (verbose, costs off) +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: t1.ten, (sum((t1.ten + t2.ten))) + Sort Key: t1.ten + -> HashAggregate + Output: t1.ten, sum((t1.ten + t2.ten)) + Group Key: t1.ten + -> Hash Right Join + Output: t1.ten, t2.ten + Hash Cond: (t2.fivethous = t1.unique1) + -> Seq Scan on public.tenk1 t2 + Output: t2.unique1, t2.unique2, t2.two, t2.four, t2.ten, t2.twenty, t2.hundred, t2.thousand, t2.twothousand, t2.fivethous, t2.tenthous, t2.odd, t2.even, t2.stringu1, t2.stringu2, t2.string4 + -> Hash + Output: t1.ten, t1.unique1 + -> Seq Scan on public.tenk1 t1 + Output: t1.ten, t1.unique1 +(15 rows) + +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + ten | sum +-----+------- + 0 | 0 + 1 | 2000 + 2 | 4000 + 3 | 6000 + 4 | 8000 + 5 | 10000 + 6 | 12000 + 7 | 14000 + 8 | 16000 + 9 | 18000 +(10 rows) + -- -- Tests for CTE inlining behavior -- diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index df3ba2be46c..75cc81c428f 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -894,6 +894,22 @@ select relname::information_schema.sql_identifier as tname, * from right join pg_attribute a on a.attrelid = ss2.oid where tname = 'tenk1' and attnum = 1; +-- Check behavior when there's a lateral reference in the output expression +explain (verbose, costs off) +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + -- -- Tests for CTE inlining behavior -- From 7b456f040fb6ca320c756cd822cfbd219b0c4078 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 30 Nov 2024 12:42:20 -0500 Subject: [PATCH 028/119] Avoid mislabeling of lateral references, redux. As I'd feared, commit 5c9d8636d was still a few bricks shy of a load. We can't just leave pulled-up lateral-reference Vars with no new nullingrels: we have to carefully compute what subset of the to-be-replaced Var's nullingrels apply to them, else we still get "wrong varnullingrels" errors. This is a bit tedious, but it looks like we can use the nullingrel data this patch computes for other purposes, enabling better optimization. We don't want to inject unnecessary plan changes into stable branches though, so leave that idea for a later HEAD-only patch. Patch by me, but thanks to Richard Guo for devising a test case that broke 5c9d8636d, and for preliminary investigation about how to fix it. As before, back-patch to v16. Discussion: https://postgr.es/m/E1tGn4j-0003zi-MP@gemulon.postgresql.org --- src/backend/optimizer/prep/prepjointree.c | 171 +++++++++++++++++++++- src/test/regress/expected/subselect.out | 51 +++++++ src/test/regress/sql/subselect.sql | 15 ++ src/tools/pgindent/typedefs.list | 1 + 4 files changed, 233 insertions(+), 5 deletions(-) diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 397a047f682..4e2a789b86f 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -42,6 +42,17 @@ #include "rewrite/rewriteManip.h" +typedef struct nullingrel_info +{ + /* + * For each leaf RTE, nullingrels[rti] is the set of relids of outer joins + * that potentially null that RTE. + */ + Relids *nullingrels; + /* Length of range table (maximum index in nullingrels[]) */ + int rtlength; /* used only for assertion checks */ +} nullingrel_info; + typedef struct pullup_replace_vars_context { PlannerInfo *root; @@ -49,6 +60,8 @@ typedef struct pullup_replace_vars_context RangeTblEntry *target_rte; /* RTE of subquery */ Relids relids; /* relids within subquery, as numbered after * pullup (set only if target_rte->lateral) */ + nullingrel_info *nullinfo; /* per-RTE nullingrel info (set only if + * target_rte->lateral) */ bool *outer_hasSubLinks; /* -> outer query's hasSubLinks */ int varno; /* varno of subquery */ bool wrap_non_vars; /* do we need all non-Var outputs to be PHVs? */ @@ -142,6 +155,9 @@ static void substitute_phv_relids(Node *node, static void fix_append_rel_relids(PlannerInfo *root, int varno, Relids subrelids); static Node *find_jointree_node_for_rel(Node *jtnode, int relid); +static nullingrel_info *get_nullingrels(Query *parse); +static void get_nullingrels_recurse(Node *jtnode, Relids upper_nullingrels, + nullingrel_info *info); /* @@ -1115,10 +1131,16 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, rvcontext.targetlist = subquery->targetList; rvcontext.target_rte = rte; if (rte->lateral) + { rvcontext.relids = get_relids_in_jointree((Node *) subquery->jointree, true, true); - else /* won't need relids */ + rvcontext.nullinfo = get_nullingrels(parse); + } + else /* won't need these values */ + { rvcontext.relids = NULL; + rvcontext.nullinfo = NULL; + } rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = varno; /* this flag will be set below, if needed */ @@ -1580,6 +1602,9 @@ is_simple_subquery(PlannerInfo *root, Query *subquery, RangeTblEntry *rte, * such refs to be wrapped in PlaceHolderVars, even when they're below * the nearest outer join? But it's a pretty hokey usage, so not * clear this is worth sweating over.) + * + * If you change this, see also the comments about lateral references + * in pullup_replace_vars_callback(). */ if (lowest_outer_join != NULL) { @@ -1664,7 +1689,8 @@ pull_up_simple_values(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte) rvcontext.root = root; rvcontext.targetlist = tlist; rvcontext.target_rte = rte; - rvcontext.relids = NULL; + rvcontext.relids = NULL; /* can't be any lateral references here */ + rvcontext.nullinfo = NULL; rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = varno; rvcontext.wrap_non_vars = false; @@ -1826,9 +1852,10 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode, /* * Since this function was reduced to a Const, it doesn't contain any * lateral references, even if it's marked as LATERAL. This means we - * don't need to fill relids. + * don't need to fill relids or nullinfo. */ rvcontext.relids = NULL; + rvcontext.nullinfo = NULL; rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = ((RangeTblRef *) jtnode)->rtindex; @@ -2543,9 +2570,52 @@ pullup_replace_vars_callback(Var *var, { /* * There should be Vars/PHVs within the expression that we can - * modify. Per above discussion, modify only Vars/PHVs of the - * subquery, not lateral references. + * modify. Vars/PHVs of the subquery should have the full + * var->varnullingrels added to them, but if there are lateral + * references within the expression, those must be marked with + * only the nullingrels that potentially apply to them. (This + * corresponds to the fact that the expression will now be + * evaluated at the join level of the Var that we are replacing: + * the lateral references may have bubbled up through fewer outer + * joins than the subquery's Vars have. Per the discussion above, + * we'll still get the right answers.) That relid set could be + * different for different lateral relations, so we have to do + * this work for each one. + * + * (Currently, the restrictions in is_simple_subquery() mean that + * at most we have to remove the lowest outer join's relid from + * the nullingrels of a lateral reference. However, we might + * relax those restrictions someday, so let's do this right.) */ + if (rcon->target_rte->lateral) + { + nullingrel_info *nullinfo = rcon->nullinfo; + Relids lvarnos; + int lvarno; + + /* + * Identify lateral varnos used within newnode. We must do + * this before injecting var->varnullingrels into the tree. + */ + lvarnos = pull_varnos(rcon->root, newnode); + lvarnos = bms_del_members(lvarnos, rcon->relids); + /* For each one, add relevant nullingrels if any */ + lvarno = -1; + while ((lvarno = bms_next_member(lvarnos, lvarno)) >= 0) + { + Relids lnullingrels; + + Assert(lvarno > 0 && lvarno <= nullinfo->rtlength); + lnullingrels = bms_intersect(var->varnullingrels, + nullinfo->nullingrels[lvarno]); + if (!bms_is_empty(lnullingrels)) + newnode = add_nulling_relids(newnode, + bms_make_singleton(lvarno), + lnullingrels); + } + } + + /* Finally, deal with Vars/PHVs of the subquery itself */ newnode = add_nulling_relids(newnode, rcon->relids, var->varnullingrels); @@ -3983,3 +4053,94 @@ find_jointree_node_for_rel(Node *jtnode, int relid) (int) nodeTag(jtnode)); return NULL; } + +/* + * get_nullingrels: collect info about which outer joins null which relations + * + * The result struct contains, for each leaf relation used in the query, + * the set of relids of outer joins that potentially null that rel. + */ +static nullingrel_info * +get_nullingrels(Query *parse) +{ + nullingrel_info *result = palloc_object(nullingrel_info); + + result->rtlength = list_length(parse->rtable); + result->nullingrels = palloc0_array(Relids, result->rtlength + 1); + get_nullingrels_recurse((Node *) parse->jointree, NULL, result); + return result; +} + +/* + * Recursive guts of get_nullingrels(). + * + * Note: at any recursion level, the passed-down upper_nullingrels must be + * treated as a constant, but it can be stored directly into *info + * if we're at leaf level. Upper recursion levels do not free their mutated + * copies of the nullingrels, because those are probably referenced by + * at least one leaf rel. + */ +static void +get_nullingrels_recurse(Node *jtnode, Relids upper_nullingrels, + nullingrel_info *info) +{ + if (jtnode == NULL) + return; + if (IsA(jtnode, RangeTblRef)) + { + int varno = ((RangeTblRef *) jtnode)->rtindex; + + Assert(varno > 0 && varno <= info->rtlength); + info->nullingrels[varno] = upper_nullingrels; + } + else if (IsA(jtnode, FromExpr)) + { + FromExpr *f = (FromExpr *) jtnode; + ListCell *l; + + foreach(l, f->fromlist) + { + get_nullingrels_recurse(lfirst(l), upper_nullingrels, info); + } + } + else if (IsA(jtnode, JoinExpr)) + { + JoinExpr *j = (JoinExpr *) jtnode; + Relids local_nullingrels; + + switch (j->jointype) + { + case JOIN_INNER: + get_nullingrels_recurse(j->larg, upper_nullingrels, info); + get_nullingrels_recurse(j->rarg, upper_nullingrels, info); + break; + case JOIN_LEFT: + case JOIN_SEMI: + case JOIN_ANTI: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, upper_nullingrels, info); + get_nullingrels_recurse(j->rarg, local_nullingrels, info); + break; + case JOIN_FULL: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, local_nullingrels, info); + get_nullingrels_recurse(j->rarg, local_nullingrels, info); + break; + case JOIN_RIGHT: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, local_nullingrels, info); + get_nullingrels_recurse(j->rarg, upper_nullingrels, info); + break; + default: + elog(ERROR, "unrecognized join type: %d", + (int) j->jointype); + break; + } + } + else + elog(ERROR, "unrecognized node type: %d", + (int) nodeTag(jtnode)); +} diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index cb511707421..e469cee2bab 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -1746,6 +1746,57 @@ order by t1.ten; 9 | 18000 (10 rows) +explain (verbose, costs off) +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + QUERY PLAN +-------------------------------------------------------- + Sort + Output: t1.q1, ((t2.q1 + t3.q1)) + Sort Key: t1.q1, ((t2.q1 + t3.q1)) + -> Hash Left Join + Output: t1.q1, (t2.q1 + t3.q1) + Hash Cond: (t2.q2 = t3.q2) + -> Hash Left Join + Output: t1.q1, t2.q1, t2.q2 + Hash Cond: (t1.q2 = t2.q2) + -> Seq Scan on public.int8_tbl t1 + Output: t1.q1, t1.q2 + -> Hash + Output: t2.q1, t2.q2 + -> Seq Scan on public.int8_tbl t2 + Output: t2.q1, t2.q2 + -> Hash + Output: t3.q1, t3.q2 + -> Seq Scan on public.int8_tbl t3 + Output: t3.q1, t3.q2 +(19 rows) + +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + q1 | x +------------------+------------------ + 123 | 246 + 123 | 246 + 123 | 4567890123456912 + 123 | 4567890123456912 + 123 | 9135780246913578 + 4567890123456789 | 246 + 4567890123456789 | 4567890123456912 + 4567890123456789 | 4567890123456912 + 4567890123456789 | 9135780246913578 + 4567890123456789 | 9135780246913578 + 4567890123456789 | 9135780246913578 +(11 rows) + -- -- Tests for CTE inlining behavior -- diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index 75cc81c428f..c7385aa0c0e 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -910,6 +910,21 @@ select t1.ten, sum(x) from group by t1.ten order by t1.ten; +explain (verbose, costs off) +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + -- -- Tests for CTE inlining behavior -- diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index a21c039c5b7..0b797462df2 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3492,6 +3492,7 @@ network_sortsupport_state nodeitem normal_rand_fctx ntile_context +nullingrel_info numeric object_access_hook_type object_access_hook_type_str From cca34f68c6fa827728f16e563b16d90aa1679ab2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 1 Dec 2024 14:15:37 -0500 Subject: [PATCH 029/119] Fix broken list-munging in ecpg's remove_variables(). The loops over cursor argument variables neglected to ever advance "prevvar". The code would accidentally do the right thing anyway when removing the first or second list entry, but if it had to remove the third or later entry then it would also remove all entries between there and the first entry. AFAICS this would only matter for cursors that reference out-of-scope variables, which is a weird Informix compatibility hack; between that and the lack of impact for short lists, it's not so surprising that nobody has complained. Nonetheless it's a pretty obvious bug. It would have been more obvious if these loops used a more standard coding style for chasing the linked lists --- this business with the "prev" pointer sometimes pointing at the current list entry is confusing and overcomplicated. So rather than just add a minimal band-aid, I chose to rewrite the loops in the same style we use elsewhere, where the "prev" pointer is NULL until we are dealing with a non-first entry and we save the "next" pointer at the top of the loop. (Two of the four loops touched here are not actually buggy, but it seems better to make them all look alike.) Coverity discovered this problem, but not until 2b41de4a5 added code to free no-longer-needed arguments structs. With that, the incorrect link updates are possibly touching freed memory, and it complained about that. Nonetheless the list corruption hazard is ancient, so back-patch to all supported branches. --- src/interfaces/ecpg/preproc/variable.c | 67 +++++++++++++------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index b23ed5edf46..5a63ecaab83 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -260,33 +260,28 @@ void remove_typedefs(int brace_level) { struct typedefs *p, - *prev; + *prev, + *next; - for (p = prev = types; p;) + for (p = types, prev = NULL; p; p = next) { + next = p->next; if (p->brace_level >= brace_level) { /* remove it */ - if (p == types) - prev = types = p->next; + if (prev) + prev->next = next; else - prev->next = p->next; + types = next; if (p->type->type_enum == ECPGt_struct || p->type->type_enum == ECPGt_union) free(p->struct_member_list); free(p->type); free(p->name); free(p); - if (prev == types) - p = types; - else - p = prev ? prev->next : NULL; } else - { prev = p; - p = prev->next; - } } } @@ -294,63 +289,67 @@ void remove_variables(int brace_level) { struct variable *p, - *prev; + *prev, + *next; - for (p = prev = allvariables; p;) + for (p = allvariables, prev = NULL; p; p = next) { + next = p->next; if (p->brace_level >= brace_level) { - /* is it still referenced by a cursor? */ + /* remove it, but first remove any references from cursors */ struct cursor *ptr; for (ptr = cur; ptr != NULL; ptr = ptr->next) { struct arguments *varptr, - *prevvar; + *prevvar, + *nextvar; - for (varptr = prevvar = ptr->argsinsert; varptr != NULL; varptr = varptr->next) + for (varptr = ptr->argsinsert, prevvar = NULL; + varptr != NULL; varptr = nextvar) { + nextvar = varptr->next; if (p == varptr->variable) { /* remove from list */ - if (varptr == ptr->argsinsert) - ptr->argsinsert = varptr->next; + if (prevvar) + prevvar->next = nextvar; else - prevvar->next = varptr->next; + ptr->argsinsert = nextvar; } + else + prevvar = varptr; } - for (varptr = prevvar = ptr->argsresult; varptr != NULL; varptr = varptr->next) + for (varptr = ptr->argsresult, prevvar = NULL; + varptr != NULL; varptr = nextvar) { + nextvar = varptr->next; if (p == varptr->variable) { /* remove from list */ - if (varptr == ptr->argsresult) - ptr->argsresult = varptr->next; + if (prevvar) + prevvar->next = nextvar; else - prevvar->next = varptr->next; + ptr->argsresult = nextvar; } + else + prevvar = varptr; } } /* remove it */ - if (p == allvariables) - prev = allvariables = p->next; + if (prev) + prev->next = next; else - prev->next = p->next; + allvariables = next; ECPGfree_type(p->type); free(p->name); free(p); - if (prev == allvariables) - p = allvariables; - else - p = prev ? prev->next : NULL; } else - { prev = p; - p = prev->next; - } } } From ad5aa7bfd042c9d0588f206f4c4ac65c3203bd48 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 3 Dec 2024 09:27:05 +1300 Subject: [PATCH 030/119] RelationTruncate() must set DELAY_CHKPT_START. Previously, it set only DELAY_CHKPT_COMPLETE. That was important, because it meant that if the XLOG_SMGR_TRUNCATE record preceded a XLOG_CHECKPOINT_ONLINE record in the WAL, then the truncation would also happen on disk before the XLOG_CHECKPOINT_ONLINE record was written. However, it didn't guarantee that the sync request for the truncation was processed before the XLOG_CHECKPOINT_ONLINE record was written. By setting DELAY_CHKPT_START, we guarantee that if an XLOG_SMGR_TRUNCATE record is written to WAL before the redo pointer of a concurrent checkpoint, the sync request queued by that operation must be processed by that checkpoint, rather than being left for the following one. This is a refinement of commit 412ad7a5563. Back-patch to all supported releases, like that commit. Author: Robert Haas Reported-by: Thomas Munro Discussion: https://postgr.es/m/CA%2BhUKG%2B-2rjGZC2kwqr2NMLBcEBp4uf59QT1advbWYF_uc%2B0Aw%40mail.gmail.com --- src/backend/catalog/storage.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 2add0534891..fc300f81199 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -336,20 +336,33 @@ RelationTruncate(Relation rel, BlockNumber nblocks) RelationPreTruncate(rel); /* - * Make sure that a concurrent checkpoint can't complete while truncation - * is in progress. + * The code which follows can interact with concurrent checkpoints in two + * separate ways. * - * The truncation operation might drop buffers that the checkpoint + * First, the truncation operation might drop buffers that the checkpoint * otherwise would have flushed. If it does, then it's essential that the * files actually get truncated on disk before the checkpoint record is * written. Otherwise, if reply begins from that checkpoint, the * to-be-truncated blocks might still exist on disk but have older * contents than expected, which can cause replay to fail. It's OK for the * blocks to not exist on disk at all, but not for them to have the wrong - * contents. + * contents. For this reason, we need to set DELAY_CHKPT_COMPLETE while + * this code executes. + * + * Second, the call to smgrtruncate() below will in turn call + * RegisterSyncRequest(). We need the sync request created by that call to + * be processed before the checkpoint completes. CheckPointGuts() will + * call ProcessSyncRequests(), but if we register our sync request after + * that happens, then the WAL record for the truncation could end up + * preceding the checkpoint record, while the actual sync doesn't happen + * until the next checkpoint. To prevent that, we need to set + * DELAY_CHKPT_START here. That way, if the XLOG_SMGR_TRUNCATE precedes + * the redo pointer of a concurrent checkpoint, we're guaranteed that the + * corresponding sync request will be processed before the checkpoint + * completes. */ - Assert((MyProc->delayChkptFlags & DELAY_CHKPT_COMPLETE) == 0); - MyProc->delayChkptFlags |= DELAY_CHKPT_COMPLETE; + Assert((MyProc->delayChkptFlags & (DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE)) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE; /* * We WAL-log the truncation before actually truncating, which means @@ -397,7 +410,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) smgrtruncate(RelationGetSmgr(rel), forks, nforks, blocks); /* We've done all the critical work, so checkpoints are OK now. */ - MyProc->delayChkptFlags &= ~DELAY_CHKPT_COMPLETE; + MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); /* * Update upper-level FSM pages to account for the truncation. This is From ad485171c703915b09a9f498fad69e89f75c9568 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 7 Dec 2024 12:55:55 +0100 Subject: [PATCH 031/119] doc: remove LC_COLLATE and LC_CTYPE from SHOW command The corresponding read-only server settings have been removed since in PG16. See commit b0f6c437160db6. Author: Pierre Giraud Discussion: https://www.postgresql.org/message-id/flat/a75a2fb0-f4b3-4c0c-be3d-7a62d266d760%40dalibo.com --- doc/src/sgml/ref/show.sgml | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/doc/src/sgml/ref/show.sgml b/doc/src/sgml/ref/show.sgml index b3747b119f9..5fbb5bbe013 100644 --- a/doc/src/sgml/ref/show.sgml +++ b/doc/src/sgml/ref/show.sgml @@ -77,30 +77,6 @@ SHOW ALL - - LC_COLLATE - - - Shows the database's locale setting for collation (text - ordering). At present, this parameter can be shown but not - set, because the setting is determined at database creation - time. - - - - - - LC_CTYPE - - - Shows the database's locale setting for character - classification. At present, this parameter can be shown but - not set, because the setting is determined at database creation - time. - - - - IS_SUPERUSER From 26c233b8b8f536f4ed252f9145c2ee365bb04b99 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 7 Dec 2024 13:12:32 -0500 Subject: [PATCH 032/119] Fix is_digit labeling of to_timestamp's FFn format codes. These format codes produce or consume strings of digits, so they should be labeled with is_digit = true, but they were not. This has effect in only one place, where is_next_separator() is checked to see if the preceding format code should slurp up all the available digits. Thus, with a format such as '...SSFF3' with remaining input '12345', the 'SS' code would consume all five digits (and then complain about seconds being out of range) when it should eat only two digits. Per report from Nick Davies. This bug goes back to d589f9446 where the FFn codes were introduced, so back-patch to v13. Discussion: https://postgr.es/m/AM8PR08MB6356AC979252CFEA78B56678B6312@AM8PR08MB6356.eurprd08.prod.outlook.com --- src/backend/utils/adt/formatting.c | 26 +++++++++++++------------- src/test/regress/expected/horology.out | 11 +++++++++++ src/test/regress/sql/horology.sql | 1 + 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index e6246dc44bd..f14a469bced 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -611,7 +611,7 @@ typedef enum DCH_Day, DCH_Dy, DCH_D, - DCH_FF1, + DCH_FF1, /* FFn codes must be consecutive */ DCH_FF2, DCH_FF3, DCH_FF4, @@ -777,12 +777,12 @@ static const KeyWord DCH_keywords[] = { {"Day", 3, DCH_Day, false, FROM_CHAR_DATE_NONE}, {"Dy", 2, DCH_Dy, false, FROM_CHAR_DATE_NONE}, {"D", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN}, - {"FF1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* F */ - {"FF2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE}, - {"FF3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE}, - {"FF4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE}, - {"FF5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE}, - {"FF6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE}, + {"FF1", 3, DCH_FF1, true, FROM_CHAR_DATE_NONE}, /* F */ + {"FF2", 3, DCH_FF2, true, FROM_CHAR_DATE_NONE}, + {"FF3", 3, DCH_FF3, true, FROM_CHAR_DATE_NONE}, + {"FF4", 3, DCH_FF4, true, FROM_CHAR_DATE_NONE}, + {"FF5", 3, DCH_FF5, true, FROM_CHAR_DATE_NONE}, + {"FF6", 3, DCH_FF6, true, FROM_CHAR_DATE_NONE}, {"FX", 2, DCH_FX, false, FROM_CHAR_DATE_NONE}, {"HH24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* H */ {"HH12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE}, @@ -833,12 +833,12 @@ static const KeyWord DCH_keywords[] = { {"dd", 2, DCH_DD, true, FROM_CHAR_DATE_GREGORIAN}, {"dy", 2, DCH_dy, false, FROM_CHAR_DATE_NONE}, {"d", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN}, - {"ff1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* f */ - {"ff2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE}, - {"ff3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE}, - {"ff4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE}, - {"ff5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE}, - {"ff6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE}, + {"ff1", 3, DCH_FF1, true, FROM_CHAR_DATE_NONE}, /* f */ + {"ff2", 3, DCH_FF2, true, FROM_CHAR_DATE_NONE}, + {"ff3", 3, DCH_FF3, true, FROM_CHAR_DATE_NONE}, + {"ff4", 3, DCH_FF4, true, FROM_CHAR_DATE_NONE}, + {"ff5", 3, DCH_FF5, true, FROM_CHAR_DATE_NONE}, + {"ff6", 3, DCH_FF6, true, FROM_CHAR_DATE_NONE}, {"fx", 2, DCH_FX, false, FROM_CHAR_DATE_NONE}, {"hh24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* h */ {"hh12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE}, diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index 0681f84d5ff..0b85bb2210a 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -3318,6 +3318,17 @@ SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; ERROR: date/time field value out of range: "2018-11-02 12:34:56.123456789" +SELECT i, to_timestamp('20181102123456123456', 'YYYYMMDDHH24MISSFF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+------------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.1235 2018 PDT + 5 | Fri Nov 02 12:34:56.12346 2018 PDT + 6 | Fri Nov 02 12:34:56.123456 2018 PDT +(6 rows) + SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored to_date ------------ diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index fdd70a07670..b4e23bb98e1 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -543,6 +543,7 @@ SELECT i, to_timestamp('2018-11-02 12:34:56.1234', 'YYYY-MM-DD HH24:MI:SS.FF' || SELECT i, to_timestamp('2018-11-02 12:34:56.12345', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('20181102123456123456', 'YYYYMMDDHH24MISSFF' || i) FROM generate_series(1, 6) i; SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored SELECT to_date('3 4 21 01', 'W MM CC YY'); From faad0183507b9185382b0ab6f7701144b8cc5687 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 7 Dec 2024 14:28:16 -0500 Subject: [PATCH 033/119] Make getObjectDescription robust against dangling amproc type links. Yoran Heling reported a case where a data type could be dropped while references to its OID remain behind in pg_amproc. This causes getObjectDescription to fail, which blocks dropping the operator family (since our DROP code likes to construct descriptions of everything it's dropping). The proper fix for this requires adding more pg_depend entries. But to allow DROP to go through with already-corrupt catalogs, tweak getObjectDescription to print "???" for the type instead of failing when it processes such an entry. I changed the logic for pg_amop similarly, for consistency, although it is not known that the problem can manifest in pg_amop. Per report from Yoran Heling. Back-patch to all supported branches (although the problem may be unreachable in v13). Discussion: https://postgr.es/m/Z1MVCOh1hprjK5Sf@gmai021 --- src/backend/catalog/objectaddress.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 95fefc7565b..46d7243d5dc 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -3268,6 +3268,12 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&opfam); getOpFamilyDescription(&opfam, amopForm->amopfamily, false); + /* + * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail + * completely if the type links are dangling, which is a form + * of catalog corruption that could occur due to old bugs. + */ + /*------ translator: %d is the operator strategy (a number), the first two %s's are data type names, the third %s is the @@ -3275,8 +3281,10 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) textual form of the operator with arguments. */ appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"), amopForm->amopstrategy, - format_type_be(amopForm->amoplefttype), - format_type_be(amopForm->amoprighttype), + format_type_extended(amopForm->amoplefttype, + -1, FORMAT_TYPE_ALLOW_INVALID), + format_type_extended(amopForm->amoprighttype, + -1, FORMAT_TYPE_ALLOW_INVALID), opfam.data, format_operator(amopForm->amopopr)); @@ -3325,6 +3333,12 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&opfam); getOpFamilyDescription(&opfam, amprocForm->amprocfamily, false); + /* + * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail + * completely if the type links are dangling, which is a form + * of catalog corruption that could occur due to old bugs. + */ + /*------ translator: %d is the function number, the first two %s's are data type names, the third %s is the description of the @@ -3332,8 +3346,10 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) function with arguments. */ appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"), amprocForm->amprocnum, - format_type_be(amprocForm->amproclefttype), - format_type_be(amprocForm->amprocrighttype), + format_type_extended(amprocForm->amproclefttype, + -1, FORMAT_TYPE_ALLOW_INVALID), + format_type_extended(amprocForm->amprocrighttype, + -1, FORMAT_TYPE_ALLOW_INVALID), opfam.data, format_procedure(amprocForm->amproc)); From be5db08ed341728bce63361f1cbeeaf2a8c23b29 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 7 Dec 2024 15:56:28 -0500 Subject: [PATCH 034/119] Ensure that pg_amop/amproc entries depend on their lefttype/righttype. Usually an entry in pg_amop or pg_amproc does not need a dependency on its amoplefttype/amoprighttype/amproclefttype/amprocrighttype types, because there is an indirect dependency via the argument types of its referenced operator or procedure, or via the opclass it belongs to. However, for some support procedures in some index AMs, the argument types of the support procedure might not mention the column data type at all. Also, the amop/amproc entry might be treated as "loose" in the opfamily, in which case it lacks a dependency on any particular opclass; or it might be a cross-type entry having a reference to a datatype that is not its opclass' opcintype. The upshot of all this is that there are cases where a datatype can be dropped while leaving behind amop/amproc entries that mention it, because there is no path in pg_depend showing that those entries depend on that type. Such entries are harmless in normal activity, because they won't get used, but they cause problems for maintenance actions such as dropping the operator family. They also cause pg_dump to produce bogus output. The previous commit put a band-aid on the DROP OPERATOR FAMILY failure, but a real fix is needed. To fix, add pg_depend entries showing that a pg_amop/pg_amproc entry depends on its lefttype/righttype. To avoid bloating pg_depend too much, skip this if the referenced operator or function has that type as an input type. (I did not bother with considering the possible indirect dependency via the opclass' opcintype; at least in the reported case, that wouldn't help anyway.) Probably, the reason this has escaped notice for so long is that add-on datatypes and relevant opclasses/opfamilies are usually packaged as extensions nowadays, so that there's no way to drop a type without dropping the referencing opclasses/opfamilies too. Still, in the absence of pg_depend entries there's nothing that constrains DROP EXTENSION to drop the opfamily entries before the datatype, so it seems possible for a DROP failure to occur anyway. The specific case that was reported doesn't fail in v13, because v13 prefers to attach the support procedure to the opclass not the opfamily. But it's surely possible to construct other edge cases that do fail in v13, so patch that too. Per report from Yoran Heling. Back-patch to all supported branches. Discussion: https://postgr.es/m/Z1MVCOh1hprjK5Sf@gmai021 --- src/backend/commands/opclasscmds.c | 98 ++++++++++++++++++++++++++++++ src/include/access/amapi.h | 4 ++ 2 files changed, 102 insertions(+) diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 5f7ee238863..3c0acfafbd2 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -66,6 +66,7 @@ static void storeOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *operators, bool isAdd); static void storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *procedures, bool isAdd); +static bool typeDepNeeded(Oid typid, OpFamilyMember *member); static void dropOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *operators); static void dropProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, @@ -1508,6 +1509,29 @@ storeOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, recordDependencyOn(&myself, &referenced, op->ref_is_hard ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); + if (typeDepNeeded(op->lefttype, op)) + { + referenced.classId = TypeRelationId; + referenced.objectId = op->lefttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + op->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + + if (op->lefttype != op->righttype && + typeDepNeeded(op->righttype, op)) + { + referenced.classId = TypeRelationId; + referenced.objectId = op->righttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + op->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + /* A search operator also needs a dep on the referenced opfamily */ if (OidIsValid(op->sortfamily)) { @@ -1609,6 +1633,29 @@ storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, recordDependencyOn(&myself, &referenced, proc->ref_is_hard ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); + if (typeDepNeeded(proc->lefttype, proc)) + { + referenced.classId = TypeRelationId; + referenced.objectId = proc->lefttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + proc->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + + if (proc->lefttype != proc->righttype && + typeDepNeeded(proc->righttype, proc)) + { + referenced.classId = TypeRelationId; + referenced.objectId = proc->righttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + proc->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + /* Post create hook of access method procedure */ InvokeObjectPostCreateHook(AccessMethodProcedureRelationId, entryoid, 0); @@ -1617,6 +1664,57 @@ storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, table_close(rel, RowExclusiveLock); } +/* + * Detect whether a pg_amop or pg_amproc entry needs an explicit dependency + * on its lefttype or righttype. + * + * We make such a dependency unless the entry has an indirect dependency + * via its referenced operator or function. That's nearly always true + * for operators, but might well not be true for support functions. + */ +static bool +typeDepNeeded(Oid typid, OpFamilyMember *member) +{ + bool result = true; + + /* + * If the type is pinned, we don't need a dependency. This is a bit of a + * layering violation perhaps (recordDependencyOn would ignore the request + * anyway), but it's a cheap test and will frequently save a syscache + * lookup here. + */ + if (IsPinnedObject(TypeRelationId, typid)) + return false; + + /* Nope, so check the input types of the function or operator. */ + if (member->is_func) + { + Oid *argtypes; + int nargs; + + (void) get_func_signature(member->object, &argtypes, &nargs); + for (int i = 0; i < nargs; i++) + { + if (typid == argtypes[i]) + { + result = false; /* match, no dependency needed */ + break; + } + } + pfree(argtypes); + } + else + { + Oid lefttype, + righttype; + + op_input_types(member->object, &lefttype, &righttype); + if (typid == lefttype || typid == righttype) + result = false; /* match, no dependency needed */ + } + return result; +} + /* * Remove operator entries from an opfamily. diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h index 4476ff7fba1..2d70c5678c3 100644 --- a/src/include/access/amapi.h +++ b/src/include/access/amapi.h @@ -76,6 +76,10 @@ typedef enum IndexAMProperty * opfamily. This allows ALTER OPERATOR FAMILY DROP, and causes that to * happen automatically if the operator or support func is dropped. This * is the right behavior for inessential ("loose") objects. + * + * We also make dependencies on lefttype/righttype, of the same strength as + * the dependency on the operator or support func, unless these dependencies + * are redundant with the dependency on the operator or support func. */ typedef struct OpFamilyMember { From c1d6506acc2b0b8c0aa1209ce5187b20caee205e Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 9 Dec 2024 14:24:34 +1300 Subject: [PATCH 035/119] Fix possible crash during WindowAgg evaluation When short-circuiting WindowAgg node evaluation on the top-level WindowAgg node using quals on monotonic window functions, because the WindowAgg run condition can mean there's no need to evaluate subsequent window function results in the same partition once the run condition becomes false, it was possible that the executor would use stale results from the previous invocation of the window function in some cases. A fix for this was partially done by a5832722, but that commit only fixed the issue for non-top-level WindowAgg nodes. I mistakenly thought that the top-level WindowAgg didn't have this issue, but Jayesh's example case clearly shows that's incorrect. At the time, I also thought that this only affected 32-bit systems as all window functions which then supported run conditions returned BIGINT, however, that's wrong as ExecProject is still called and that could cause evaluation of any other window function belonging to the same WindowAgg node, one of which may return a byref type. The only queries affected by this are WindowAggs with a "Run Condition" which contains at least one window function with a byref result type, such as lead() or lag() on a byref column. The window clause must also contain a PARTITION BY clause (without a PARTITION BY, execution of the WindowAgg stops immediately when the run condition becomes false and there's no risk of using the stale results). Reported-by: Jayesh Dehankar Discussion: https://postgr.es/m/193261e2c4d.3dd3cd7c1842.871636075166132237@zohocorp.com Backpatch-through: 15, where WindowAgg run conditions were added --- src/backend/executor/nodeWindowAgg.c | 35 ++++++++++++++-------------- src/test/regress/expected/window.out | 10 ++++++++ src/test/regress/sql/window.sql | 7 ++++++ 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 7b5707996c1..066a410cd31 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -2296,6 +2296,23 @@ ExecWindowAgg(PlanState *pstate) */ if (winstate->use_pass_through) { + /* + * When switching into a pass-through mode, we'd better + * NULLify the aggregate results as these are no longer + * updated and NULLifying them avoids the old stale + * results lingering. Some of these might be byref types + * so we can't have them pointing to free'd memory. The + * planner insisted that quals used in the runcondition + * are strict, so the top-level WindowAgg will always + * filter these NULLs out in the filter clause. + */ + numfuncs = winstate->numfuncs; + for (i = 0; i < numfuncs; i++) + { + econtext->ecxt_aggvalues[i] = (Datum) 0; + econtext->ecxt_aggnulls[i] = true; + } + /* * STRICT pass-through mode is required for the top window * when there is a PARTITION BY clause. Otherwise we must @@ -2310,24 +2327,6 @@ ExecWindowAgg(PlanState *pstate) else { winstate->status = WINDOWAGG_PASSTHROUGH; - - /* - * If we're not the top-window, we'd better NULLify - * the aggregate results. In pass-through mode we no - * longer update these and this avoids the old stale - * results lingering. Some of these might be byref - * types so we can't have them pointing to free'd - * memory. The planner insisted that quals used in - * the runcondition are strict, so the top-level - * WindowAgg will filter these NULLs out in the filter - * clause. - */ - numfuncs = winstate->numfuncs; - for (i = 0; i < numfuncs; i++) - { - econtext->ecxt_aggvalues[i] = (Datum) 0; - econtext->ecxt_aggnulls[i] = true; - } } } else diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 1a9cc66a6ba..0f474cbd58a 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -3759,6 +3759,16 @@ WHERE c = 1; -> Seq Scan on empsalary (3 rows) +-- Try another case with a WindowFunc with a byref return type +SELECT * FROM + (SELECT row_number() OVER (PARTITION BY salary) AS rn, + lead(depname) OVER (PARTITION BY salary) || ' Department' AS n_dep + FROM empsalary) emp +WHERE rn < 1; + rn | n_dep +----+------- +(0 rows) + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index e35c16a8276..3aeb6594ae3 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -1213,6 +1213,13 @@ SELECT * FROM FROM empsalary) emp WHERE c = 1; +-- Try another case with a WindowFunc with a byref return type +SELECT * FROM + (SELECT row_number() OVER (PARTITION BY salary) AS rn, + lead(depname) OVER (PARTITION BY salary) || ' Department' AS n_dep + FROM empsalary) emp +WHERE rn < 1; + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM From ae77bcc3aa1b869568c6b01726e4f1276f7381bb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 9 Dec 2024 10:46:09 +0900 Subject: [PATCH 036/119] Fix invalidation of local pgstats references for entry reinitialization 818119afccd3 has introduced the "generation" concept in pgstats entries, incremented a counter when a pgstats entry is reinitialized, but it did not count on the fact that backends still holding local references to such entries need to be refreshed if the cache age is outdated. The previous logic only updated local references when an entry was dropped, but it needs also to consider entries that are reinitialized. This matters for replication slot stats (as well as custom pgstats kinds in 18~), where concurrent drops and creates of a slot could cause incorrect stats to be locally referenced. This would lead to an assertion failure at shutdown when writing out the stats file, as the backend holding an outdated local reference would not be able to drop during its shutdown sequence the stats entry that should be dropped, as the last process holding a reference to the stats entry. The checkpointer was then complaining about such an entry late in the shutdown sequence, after the shutdown checkpoint is finished with the control file updated, causing the stats file to not be generated. In non-assert builds, the entry would just be skipped with the stats file written. Note that only logical replication slots use statistics. A test case based on TAP is added to test_decoding, where a persistent connection peeking at a slot's data is kept with concurrent drops and creates of the same slot. This is based on the isolation test case that Anton has sent. As it requires a node shutdown with a check to make sure that the stats file is written with this specific sequence of events, TAP is used instead. Reported-by: Anton A. Melnikov Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/56bf8ff9-dd8c-47b2-872a-748ede82af99@postgrespro.ru Backpatch-through: 15 --- contrib/test_decoding/t/001_repl_stats.pl | 60 +++++++++++++++++++++++ src/backend/utils/activity/pgstat_shmem.c | 11 ++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/contrib/test_decoding/t/001_repl_stats.pl b/contrib/test_decoding/t/001_repl_stats.pl index 7c2d87561ce..c335bc5890c 100644 --- a/contrib/test_decoding/t/001_repl_stats.pl +++ b/contrib/test_decoding/t/001_repl_stats.pl @@ -118,4 +118,64 @@ sub test_slot_stats # shutdown $node->stop; +# Test replication slot stats persistence in a single session. The slot +# is dropped and created concurrently of a session peeking at its data +# repeatedly, hence holding in its local cache a reference to the stats. +$node->start; + +my $slot_name_restart = 'regression_slot5'; +$node->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('$slot_name_restart', 'test_decoding');" +); + +# Look at slot data, with a persistent connection. +my $bpgsql = $node->background_psql('postgres', on_error_stop => 1); + +# Launch query and look at slot data, incrementing the refcount of the +# stats entry. +$bpgsql->query_safe( + "SELECT pg_logical_slot_peek_binary_changes('$slot_name_restart', NULL, NULL)" +); + +# Drop the slot entry. The stats entry is not dropped yet as the previous +# session still holds a reference to it. +$node->safe_psql('postgres', + "SELECT pg_drop_replication_slot('$slot_name_restart')"); + +# Create again the same slot. The stats entry is reinitialized, not marked +# as dropped anymore. +$node->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('$slot_name_restart', 'test_decoding');" +); + +# Look again at the slot data. The local stats reference should be refreshed +# to the reinitialized entry. +$bpgsql->query_safe( + "SELECT pg_logical_slot_peek_binary_changes('$slot_name_restart', NULL, NULL)" +); +# Drop again the slot, the entry is not dropped yet as the previous session +# still has a refcount on it. +$node->safe_psql('postgres', + "SELECT pg_drop_replication_slot('$slot_name_restart')"); + +# Shutdown the node, which should happen cleanly with the stats file written +# to disk. Note that the background session created previously needs to be +# hold *while* the node is shutting down to check that it drops the stats +# entry of the slot before writing the stats file. +$node->stop; + +# Make sure that the node is correctly shut down. Checking the control file +# is not enough, as the node may detect that something is incorrect after the +# control file has been updated and the shutdown checkpoint is finished, so +# also check that the stats file has been written out. +command_like( + [ 'pg_controldata', $node->data_dir ], + qr/Database cluster state:\s+shut down\n/, + 'node shut down ok'); + +my $stats_file = "$datadir/pg_stat/pgstat.stat"; +ok(-f "$stats_file", "stats file must exist after shutdown"); + +$bpgsql->quit; + done_testing(); diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 7e0147cd441..0225c794774 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -702,7 +702,8 @@ pgstat_gc_entry_refs(void) Assert(curage != 0); /* - * Some entries have been dropped. Invalidate cache pointer to them. + * Some entries have been dropped or reinitialized. Invalidate cache + * pointer to them. */ pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i); while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) != NULL) @@ -712,7 +713,13 @@ pgstat_gc_entry_refs(void) Assert(!entry_ref->shared_stats || entry_ref->shared_stats->magic == 0xdeadbeef); - if (!entry_ref->shared_entry->dropped) + /* + * "generation" checks for the case of entries being reinitialized, + * and "dropped" for the case where these are.. dropped. + */ + if (!entry_ref->shared_entry->dropped && + pg_atomic_read_u32(&entry_ref->shared_entry->generation) == + entry_ref->generation) continue; /* cannot gc shared ref that has pending data */ From ec194b448cbc7f9fe2204cdb7690eb4c21a46d8e Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 9 Dec 2024 14:35:46 +0900 Subject: [PATCH 037/119] Improve comment about dropped entries in pgstat.c pgstat_write_statsfile() discards any entries marked as dropped from being written to the stats file at shutdown, and also included an assertion based on the same condition. The intention of the assertion is to track that no pgstats entries should be left around as terminating backends should drop any entries they still hold references on before the stats file is written by the checkpointer, and it not worth taking down the server in this case if there is a bug making that possible. Let's improve the comment of this area to document clearly what's intended. Based on a discussion with Bertrand Drouvot and Anton A. Melnikov. Author: Bertrand Drouvot Discussion: https://postgr.es/m/a13e8cdf-b97a-4ecb-8f42-aaa367974e29@postgrespro.ru Backpatch-through: 15 --- src/backend/utils/activity/pgstat.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 1c0b1625e30..26da09d73ab 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -1399,7 +1399,15 @@ pgstat_write_statsfile(void) CHECK_FOR_INTERRUPTS(); - /* we may have some "dropped" entries not yet removed, skip them */ + /* + * We should not see any "dropped" entries when writing the stats + * file, as all backends and auxiliary processes should have cleaned + * up their references before they terminated. + * + * However, since we are already shutting down, it is not worth + * crashing the server over any potential cleanup issues, so we simply + * skip such entries if encountered. + */ Assert(!ps->dropped); if (ps->dropped) continue; From bb649b553c589a3fd1f36b2280e984622e6fdcdb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 9 Dec 2024 14:38:19 -0500 Subject: [PATCH 038/119] Simplify executor's determination of whether to use parallelism. Our parallel-mode code only works when we are executing a query in full, so ExecutePlan must disable parallel mode when it is asked to do partial execution. The previous logic for this involved passing down a flag (variously named execute_once or run_once) from callers of ExecutorRun or PortalRun. This is overcomplicated, and unsurprisingly some of the callers didn't get it right, since it requires keeping state that not all of them have handy; not to mention that the requirements for it were undocumented. That led to assertion failures in some corner cases. The only state we really need for this is the existing QueryDesc.already_executed flag, so let's just put all the responsibility in ExecutePlan. (It could have been done in ExecutorRun too, leading to a slightly shorter patch -- but if there's ever more than one caller of ExecutePlan, it seems better to have this logic in the subroutine than the callers.) This makes those ExecutorRun/PortalRun parameters unnecessary. In master it seems okay to just remove them, returning the API for those functions to what it was before parallelism. Such an API break is clearly not okay in stable branches, but for them we can just leave the parameters in place after documenting that they do nothing. Per report from Yugo Nagata, who also reviewed and tested this patch. Back-patch to all supported branches. Discussion: https://postgr.es/m/20241206062549.710dc01cf91224809dd6c0e1@sraoss.co.jp --- src/backend/executor/execMain.c | 47 +++++++++++++++------------------ src/backend/tcop/postgres.c | 4 +-- src/backend/tcop/pquery.c | 13 +++------ src/include/executor/execdesc.h | 2 +- src/include/utils/portal.h | 2 +- 5 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 73782a44b4f..06bf80d0afc 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -83,14 +83,12 @@ static void InitPlan(QueryDesc *queryDesc, int eflags); static void CheckValidRowMarkRel(Relation rel, RowMarkType markType); static void ExecPostprocessPlan(EState *estate); static void ExecEndPlan(PlanState *planstate, EState *estate); -static void ExecutePlan(EState *estate, PlanState *planstate, - bool use_parallel_mode, +static void ExecutePlan(QueryDesc *queryDesc, CmdType operation, bool sendTuples, uint64 numberTuples, ScanDirection direction, - DestReceiver *dest, - bool execute_once); + DestReceiver *dest); static bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); static bool ExecCheckPermissionsModified(Oid relOid, Oid userid, Bitmapset *modifiedCols, @@ -288,6 +286,9 @@ standard_ExecutorStart(QueryDesc *queryDesc, int eflags) * retrieved tuples, not for instance to those inserted/updated/deleted * by a ModifyTable plan node. * + * execute_once is ignored, and is present only to avoid an API break + * in stable branches. + * * There is no return value, but output tuples (if any) are sent to * the destination receiver specified in the QueryDesc; and the number * of tuples processed at the top level can be found in @@ -359,21 +360,12 @@ standard_ExecutorRun(QueryDesc *queryDesc, * run plan */ if (!ScanDirectionIsNoMovement(direction)) - { - if (execute_once && queryDesc->already_executed) - elog(ERROR, "can't re-execute query flagged for single execution"); - queryDesc->already_executed = true; - - ExecutePlan(estate, - queryDesc->planstate, - queryDesc->plannedstmt->parallelModeNeeded, + ExecutePlan(queryDesc, operation, sendTuples, count, direction, - dest, - execute_once); - } + dest); /* * Update es_total_processed to keep track of the number of tuples @@ -1624,22 +1616,19 @@ ExecCloseRangeTableRelations(EState *estate) * moving in the specified direction. * * Runs to completion if numberTuples is 0 - * - * Note: the ctid attribute is a 'junk' attribute that is removed before the - * user can see it * ---------------------------------------------------------------- */ static void -ExecutePlan(EState *estate, - PlanState *planstate, - bool use_parallel_mode, +ExecutePlan(QueryDesc *queryDesc, CmdType operation, bool sendTuples, uint64 numberTuples, ScanDirection direction, - DestReceiver *dest, - bool execute_once) + DestReceiver *dest) { + EState *estate = queryDesc->estate; + PlanState *planstate = queryDesc->planstate; + bool use_parallel_mode; TupleTableSlot *slot; uint64 current_tuple_count; @@ -1654,11 +1643,17 @@ ExecutePlan(EState *estate, estate->es_direction = direction; /* - * If the plan might potentially be executed multiple times, we must force - * it to run without parallelism, because we might exit early. + * Set up parallel mode if appropriate. + * + * Parallel mode only supports complete execution of a plan. If we've + * already partially executed it, or if the caller asks us to exit early, + * we must force the plan to run without parallelism. */ - if (!execute_once) + if (queryDesc->already_executed || numberTuples != 0) use_parallel_mode = false; + else + use_parallel_mode = queryDesc->plannedstmt->parallelModeNeeded; + queryDesc->already_executed = true; estate->es_use_parallel_mode = use_parallel_mode; if (use_parallel_mode) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 3f427f1b47f..73d6a6194f1 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -1278,7 +1278,7 @@ exec_simple_query(const char *query_string) (void) PortalRun(portal, FETCH_ALL, true, /* always top level */ - true, + true, /* ignored */ receiver, receiver, &qc); @@ -2259,7 +2259,7 @@ exec_execute_message(const char *portal_name, long max_rows) completed = PortalRun(portal, max_rows, true, /* always top level */ - !execute_is_fetch && max_rows == FETCH_ALL, + true, /* ignored */ receiver, receiver, &qc); diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 5565f200c3d..3a20feb867f 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -670,6 +670,8 @@ PortalSetResultFormat(Portal portal, int nFormats, int16 *formats) * isTopLevel: true if query is being executed at backend "top level" * (that is, directly from a client command message) * + * run_once: ignored, present only to avoid an API break in stable branches. + * * dest: where to send output of primary (canSetTag) query * * altdest: where to send output of non-primary queries @@ -714,10 +716,6 @@ PortalRun(Portal portal, long count, bool isTopLevel, bool run_once, */ MarkPortalActive(portal); - /* Set run_once flag. Shouldn't be clear if previously set. */ - Assert(!portal->run_once || run_once); - portal->run_once = run_once; - /* * Set up global portal context pointers. * @@ -922,7 +920,7 @@ PortalRunSelect(Portal portal, { PushActiveSnapshot(queryDesc->snapshot); ExecutorRun(queryDesc, direction, (uint64) count, - portal->run_once); + false); nprocessed = queryDesc->estate->es_processed; PopActiveSnapshot(); } @@ -962,7 +960,7 @@ PortalRunSelect(Portal portal, { PushActiveSnapshot(queryDesc->snapshot); ExecutorRun(queryDesc, direction, (uint64) count, - portal->run_once); + false); nprocessed = queryDesc->estate->es_processed; PopActiveSnapshot(); } @@ -1406,9 +1404,6 @@ PortalRunFetch(Portal portal, */ MarkPortalActive(portal); - /* If supporting FETCH, portal can't be run-once. */ - Assert(!portal->run_once); - /* * Set up global portal context pointers. */ diff --git a/src/include/executor/execdesc.h b/src/include/executor/execdesc.h index af2bf36dfb8..10320c66b0c 100644 --- a/src/include/executor/execdesc.h +++ b/src/include/executor/execdesc.h @@ -48,7 +48,7 @@ typedef struct QueryDesc EState *estate; /* executor's query-wide state */ PlanState *planstate; /* tree of per-plan-node state */ - /* This field is set by ExecutorRun */ + /* This field is set by ExecutePlan */ bool already_executed; /* true if previously executed */ /* This is always set NULL by the core system, but plugins can change it */ diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h index 8b69c59356f..c0a1f562030 100644 --- a/src/include/utils/portal.h +++ b/src/include/utils/portal.h @@ -145,7 +145,7 @@ typedef struct PortalData /* Features/options */ PortalStrategy strategy; /* see above */ int cursorOptions; /* DECLARE CURSOR option bits */ - bool run_once; /* portal will only be run once */ + bool run_once; /* unused */ /* Status data */ PortalStatus status; /* see above */ From be9dac9afc25a1edaf4ad708b4efb909029b4198 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Mon, 9 Dec 2024 20:58:23 +0100 Subject: [PATCH 039/119] Fix small memory leaks in GUC checks Follow-up commit to a9d58bfe8a3a. Backpatch down to v16 where this was added in order to keep the code consistent for future backpatches. Author: Tofig Aliev Reviewed-by: Daniel Gustafsson Reviewed-by: Masahiko Sawada Discussion: https://postgr.es/m/bba4313fdde9db46db279f96f3b748b1@postgrespro.ru Backpatch-through: 16 --- src/backend/commands/variable.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index a81d236c6a9..8ea1fd9a63d 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -1082,6 +1082,8 @@ check_application_name(char **newval, void **extra, GucSource source) return false; } + guc_free(*newval); + pfree(clean); *newval = ret; return true; @@ -1118,6 +1120,8 @@ check_cluster_name(char **newval, void **extra, GucSource source) return false; } + guc_free(*newval); + pfree(clean); *newval = ret; return true; From b0a04ce0916b370e70ccf0a2e6a5d4d7607efe25 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Tue, 10 Dec 2024 09:25:50 +1300 Subject: [PATCH 040/119] Doc: fix incorrect EXPLAIN ANALYZE output for bloom indexes It looks like the example case was once modified to increase the number of rows but the EXPLAIN ANALYZE output wasn't updated to reflect that. Also adjust the text which discusses the index sizes. With the example table size, the bloom index isn't quite 8 times more space efficient than the btree indexes. Discussion: https://postgr.es/m/CAApHDvovx8kQ0=HTt85gFDAwmTJHpCgiSvRmQZ_6u_g-vQYM_w@mail.gmail.com Backpatch-through: 13, all supported versions --- doc/src/sgml/bloom.sgml | 42 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/doc/src/sgml/bloom.sgml b/doc/src/sgml/bloom.sgml index 19f2b172cc4..0e734f3d6e6 100644 --- a/doc/src/sgml/bloom.sgml +++ b/doc/src/sgml/bloom.sgml @@ -118,11 +118,11 @@ SELECT 10000000 =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- - Seq Scan on tbloom (cost=0.00..2137.14 rows=3 width=24) (actual time=16.971..16.971 rows=0 loops=1) + Seq Scan on tbloom (cost=0.00..213744.00 rows=250 width=24) (actual time=357.059..357.059 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Filter: 100000 + Rows Removed by Filter: 10000000 Planning Time: 0.346 ms - Execution Time: 16.988 ms + Execution Time: 357.076 ms (5 rows) @@ -136,16 +136,16 @@ CREATE INDEX =# SELECT pg_size_pretty(pg_relation_size('btreeidx')); pg_size_pretty ---------------- - 3976 kB + 386 MB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- - Seq Scan on tbloom (cost=0.00..2137.00 rows=2 width=24) (actual time=12.805..12.805 rows=0 loops=1) + Seq Scan on tbloom (cost=0.00..213744.00 rows=2 width=24) (actual time=351.016..351.017 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Filter: 100000 + Rows Removed by Filter: 10000000 Planning Time: 0.138 ms - Execution Time: 12.817 ms + Execution Time: 351.035 ms (5 rows) @@ -159,19 +159,19 @@ CREATE INDEX =# SELECT pg_size_pretty(pg_relation_size('bloomidx')); pg_size_pretty ---------------- - 1584 kB + 153 MB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------- - Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=0.388..0.388 rows=0 loops=1) + Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=22.605..22.606 rows=0 loops=1) Recheck Cond: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Index Recheck: 29 - Heap Blocks: exact=28 - -> Bitmap Index Scan on bloomidx (cost=0.00..1792.00 rows=2 width=0) (actual time=0.356..0.356 rows=29 loops=1) + Rows Removed by Index Recheck: 2300 + Heap Blocks: exact=2256 + -> Bitmap Index Scan on bloomidx (cost=0.00..178436.00 rows=1 width=0) (actual time=20.005..20.005 rows=2300 loops=1) Index Cond: ((i2 = 898732) AND (i5 = 123451)) Planning Time: 0.099 ms - Execution Time: 0.408 ms + Execution Time: 22.632 ms (8 rows) @@ -197,21 +197,21 @@ CREATE INDEX =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------- - Bitmap Heap Scan on tbloom (cost=24.34..32.03 rows=2 width=24) (actual time=0.028..0.029 rows=0 loops=1) + Bitmap Heap Scan on tbloom (cost=9.29..13.30 rows=1 width=24) (actual time=0.032..0.033 rows=0 loops=1) Recheck Cond: ((i5 = 123451) AND (i2 = 898732)) - -> BitmapAnd (cost=24.34..24.34 rows=2 width=0) (actual time=0.027..0.027 rows=0 loops=1) - -> Bitmap Index Scan on btreeidx5 (cost=0.00..12.04 rows=500 width=0) (actual time=0.026..0.026 rows=0 loops=1) + -> BitmapAnd (cost=9.29..9.29 rows=1 width=0) (actual time=0.047..0.047 rows=0 loops=1) + -> Bitmap Index Scan on btreeidx5 (cost=0.00..4.52 rows=11 width=0) (actual time=0.026..0.026 rows=7 loops=1) Index Cond: (i5 = 123451) - -> Bitmap Index Scan on btreeidx2 (cost=0.00..12.04 rows=500 width=0) (never executed) + -> Bitmap Index Scan on btreeidx2 (cost=0.00..4.52 rows=11 width=0) (actual time=0.007..0.007 rows=8 loops=1) Index Cond: (i2 = 898732) - Planning Time: 0.491 ms - Execution Time: 0.055 ms + Planning Time: 0.264 ms + Execution Time: 0.047 ms (9 rows) Although this query runs much faster than with either of the single indexes, we pay a penalty in index size. Each of the single-column - btree indexes occupies 2 MB, so the total space needed is 12 MB, - eight times the space used by the bloom index. + btree indexes occupies 88.5 MB, so the total space needed is 531 MB, + over three times the space used by the bloom index. From 8ac97ce42c8c0180328c80a06bf9c0bcae500477 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 10 Dec 2024 12:54:16 +0900 Subject: [PATCH 041/119] Fix outdated comment of scram_build_secret() This routine documented that "iterations" would use a default value if set to 0 by the caller. However, the iteration should always be set by the caller to a value strictly more than 0, as documented by an assertion. Oversight in b577743000cd, that has made the iteration count of SCRAM configurable. Author: Matheus Alcantara Discussion: https://postgr.es/m/ac858943-4743-44cd-b4ad-08a0c10cbbc8@gmail.com Backpatch-through: 16 --- src/common/scram-common.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/scram-common.c b/src/common/scram-common.c index 6448564a08c..389453187c2 100644 --- a/src/common/scram-common.c +++ b/src/common/scram-common.c @@ -200,8 +200,7 @@ scram_ServerKey(const uint8 *salted_password, * * The password should already have been processed with SASLprep, if necessary! * - * If iterations is 0, default number of iterations is used. The result is - * palloc'd or malloc'd, so caller is responsible for freeing it. + * The result is palloc'd or malloc'd, so caller is responsible for freeing it. * * On error, returns NULL and sets *errstr to point to a message about the * error details. From f0672b6787ab48204dc8aebbcd1bae0a5775ff8b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 10 Dec 2024 13:02:27 +0900 Subject: [PATCH 042/119] Fix comments of GUC hooks for timezone_abbreviations The GUC assign and check hooks used "assign_timezone_abbreviations", which was incorrect. Issue noticed while browsing this area of the code, introduced in 0a20ff54f5e6. Reviewed-by: Tom Lane Discussion: https://postgr.es/m/Z1eV6Y8yk77GZhZI@paquier.xyz Backpatch-through: 16 --- src/backend/commands/variable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 8ea1fd9a63d..6c37f5d57bb 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -479,7 +479,7 @@ show_log_timezone(void) */ /* - * GUC check_hook for assign_timezone_abbreviations + * GUC check_hook for timezone_abbreviations */ bool check_timezone_abbreviations(char **newval, void **extra, GucSource source) @@ -511,7 +511,7 @@ check_timezone_abbreviations(char **newval, void **extra, GucSource source) } /* - * GUC assign_hook for assign_timezone_abbreviations + * GUC assign_hook for timezone_abbreviations */ void assign_timezone_abbreviations(const char *newval, void *extra) From ac4a2b40392bd5ca9e9e02bad50d437411a8adfb Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Tue, 10 Dec 2024 13:51:59 -0800 Subject: [PATCH 043/119] Fix elog(FATAL) before PostmasterMain() or just after fork(). Since commit 97550c0711972a9856b5db751539bbaf2f88884c, these failed with "PANIC: proc_exit() called in child process" due to uninitialized or stale MyProcPid. That was reachable if close() failed in ClosePostmasterPorts() or setlocale(category, "C") failed, both unlikely. Back-patch to v13 (all supported versions). Discussion: https://postgr.es/m/20241208034614.45.nmisch@google.com --- src/backend/main/main.c | 2 ++ src/backend/postmaster/fork_process.c | 2 ++ src/backend/postmaster/postmaster.c | 3 +-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ed11e8be7fa..84d65aa4fbd 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -32,6 +32,7 @@ #include "bootstrap/bootstrap.h" #include "common/username.h" +#include "miscadmin.h" #include "port/atomics.h" #include "postmaster/postmaster.h" #include "storage/spin.h" @@ -97,6 +98,7 @@ main(int argc, char *argv[]) * localization of messages may not work right away, and messages won't go * anywhere but stderr until GUC settings get loaded. */ + MyProcPid = getpid(); MemoryContextInit(); /* diff --git a/src/backend/postmaster/fork_process.c b/src/backend/postmaster/fork_process.c index 6f9c2765d68..36e463aa15c 100644 --- a/src/backend/postmaster/fork_process.c +++ b/src/backend/postmaster/fork_process.c @@ -19,6 +19,7 @@ #include #include "libpq/pqsignal.h" +#include "miscadmin.h" #include "postmaster/fork_process.h" #ifndef WIN32 @@ -66,6 +67,7 @@ fork_process(void) if (result == 0) { /* fork succeeded, in child */ + MyProcPid = getpid(); #ifdef LINUX_PROFILE setitimer(ITIMER_PROF, &prof_itimer, NULL); #endif diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index b42aae41fce..110d05d13e2 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2640,14 +2640,13 @@ ClosePostmasterPorts(bool am_syslogger) /* - * InitProcessGlobals -- set MyProcPid, MyStartTime[stamp], random seeds + * InitProcessGlobals -- set MyStartTime[stamp], random seeds * * Called early in the postmaster and every backend. */ void InitProcessGlobals(void) { - MyProcPid = getpid(); MyStartTimestamp = GetCurrentTimestamp(); MyStartTime = timestamptz_to_time_t(MyStartTimestamp); From 058b208a5d129dbc1d857338ad68b1fd6613d0e2 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 11 Dec 2024 08:48:53 +0900 Subject: [PATCH 044/119] Improve reporting of pg_upgrade log files on test failure On failure, the pg_upgrade log files are automatically appended to the test log file, but the information reported was inconsistent. A header, with the log file name, was reported with note(), while the log contents and a footer used print(), making it harder to diagnose failures when these are split into console output and test log file because the pg_upgrade log file path in the header may not be included in the test log file. The output is now consolidated so as the header uses print() rather than note(). An extra note() is added to inform that the contents of a pg_upgrade log file are appended to the test log file. The diffs from the regression test suite and dump files all use print() to show their contents on failure. Author: Joel Jacobson Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/49f7e64a-b9be-4a90-a9fe-210a7740405e@app.fastmail.com Backpatch-through: 15 --- src/bin/pg_upgrade/t/002_pg_upgrade.pl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index d1b44adb8a2..3bf4e87b178 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -424,9 +424,14 @@ sub filter_dump if $File::Find::name =~ m/.*\.log/; }, $newnode->data_dir . "/pg_upgrade_output.d"); + + my $test_logfile = $PostgreSQL::Test::Utils::test_logfile; + + note "=== pg_upgrade logs found - appending to $test_logfile ===\n"; foreach my $log (@log_files) { - note "=== contents of $log ===\n"; + note "=== appending $log ===\n"; + print "=== contents of $log ===\n"; print slurp_file($log); print "=== EOF ===\n"; } From 782cc1aa3d158906cdfb9ca809c9ca4241a33041 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 13 Dec 2024 14:21:36 -0500 Subject: [PATCH 045/119] Fix possible crash in pg_dump with identity sequences. If an owned sequence is considered interesting, force its owning table to be marked interesting too. This ensures, in particular, that we'll fetch the owning table's column names so we have the data needed for ALTER TABLE ... ADD GENERATED. Previously there were edge cases where pg_dump could get SIGSEGV due to not having filled in the column names. (The known case is where the owning table has been made part of an extension while its identity sequence is not a member; but there may be others.) Also, if it's an identity sequence, force its dumped-components mask to exactly match the owning table: dump definition only if we're dumping the table's definition, dump data only if we're dumping the table's data, etc. This generalizes the code introduced in commit b965f2617 that set the sequence's dump mask to NONE if the owning table's mask is NONE. That's insufficient to prevent failures, because for example the table's mask might only request dumping ACLs, which would lead us to still emit ALTER TABLE ADD GENERATED even though we didn't create the table. It seems better to treat an identity sequence as though it were an inseparable aspect of the table, matching the treatment used in the backend's dependency logic. Perhaps this policy needs additional refinement, but let's wait to see some field use-cases before changing it further. While here, add a comment in pg_dump.h warning against writing tests like "if (dobj->dump == DUMP_COMPONENT_NONE)", which was a bug in this case. There is one other example in getPublicationNamespaces, which if it's not a bug is at least remarkably unclear and under-documented. Changing that requires a separate discussion, however. Per report from Artur Zakirov. Back-patch to all supported branches. Discussion: https://postgr.es/m/CAKNkYnwXFBf136=u9UqUxFUVagevLQJ=zGd5BsLhCsatDvQsKQ@mail.gmail.com --- src/bin/pg_dump/pg_dump.c | 32 +++++++++++++++++--------------- src/bin/pg_dump/pg_dump.h | 12 ++++++++++-- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 31bbcb9fdca..c0d22b87af4 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -6858,20 +6858,15 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) seqinfo->owning_tab, seqinfo->dobj.catId.oid); /* - * Only dump identity sequences if we're going to dump the table that - * it belongs to. - */ - if (owning_tab->dobj.dump == DUMP_COMPONENT_NONE && - seqinfo->is_identity_sequence) - { - seqinfo->dobj.dump = DUMP_COMPONENT_NONE; - continue; - } - - /* - * Otherwise we need to dump the components that are being dumped for - * the table and any components which the sequence is explicitly - * marked with. + * For an identity sequence, dump exactly the same components for the + * sequence as for the owning table. This is important because we + * treat the identity sequence as an integral part of the table. For + * example, there is not any DDL command that allows creation of such + * a sequence independently of the table. + * + * For other owned sequences such as serial sequences, we need to dump + * the components that are being dumped for the table and any + * components that the sequence is explicitly marked with. * * We can't simply use the set of components which are being dumped * for the table as the table might be in an extension (and only the @@ -6884,10 +6879,17 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) * marked by checkExtensionMembership() and this will be a no-op as * the table will be equivalently marked. */ - seqinfo->dobj.dump = seqinfo->dobj.dump | owning_tab->dobj.dump; + if (seqinfo->is_identity_sequence) + seqinfo->dobj.dump = owning_tab->dobj.dump; + else + seqinfo->dobj.dump |= owning_tab->dobj.dump; + /* Make sure that necessary data is available if we're dumping it */ if (seqinfo->dobj.dump != DUMP_COMPONENT_NONE) + { seqinfo->interesting = true; + owning_tab->interesting = true; + } } } diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index f9878ebd163..6eab9b93001 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -88,8 +88,16 @@ typedef enum /* * DumpComponents is a bitmask of the potentially dumpable components of * a database object: its core definition, plus optional attributes such - * as ACL, comments, etc. The NONE and ALL symbols are convenient - * shorthands. + * as ACL, comments, etc. + * + * The NONE and ALL symbols are convenient shorthands for assigning values, + * but be careful about using them in tests. For example, a test like + * "if (dobj->dump == DUMP_COMPONENT_NONE)" is probably wrong; you likely want + * "if (!(dobj->dump & DUMP_COMPONENT_DEFINITION))" instead. This is because + * we aren't too careful about the values of irrelevant bits, as indeed can be + * seen in the definition of DUMP_COMPONENT_ALL. It's also possible that an + * object has only subsidiary bits such as DUMP_COMPONENT_ACL set, leading to + * unexpected behavior of a test against NONE. */ typedef uint32 DumpComponents; #define DUMP_COMPONENT_NONE (0) From 31daa10facec70f62ac66f0187fa203c3fa77074 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 14 Dec 2024 16:07:18 -0500 Subject: [PATCH 046/119] contrib/earthdistance: Use SQL-standard function bodies. The @extschema:name@ feature added by 72a5b1fc8 allows us to make earthdistance's references to the cube extension fully search-path-secure, so long as all those references are resolved at extension installation time not runtime. To do that, we must convert earthdistance's SQL functions to the new SQL-standard style; but we wanted to do that anyway. The functions can be updated in our customary style by running CREATE OR REPLACE FUNCTION in an extension update script. However, there's still problems in the "CREATE DOMAIN earth" command: its references to cube functions could be captured by hostile objects in earthdistance's installation schema, if that's not where the cube extension is. Worse, the reference to the cube type itself as the domain's base could be captured, and that's not something we could fix after-the-fact in the update script. What I've done about that is to change the "CREATE DOMAIN earth" command in the base script earthdistance--1.1.sql. Ordinarily, changing a released extension script is forbidden; but I think it's okay here since the results of successful (non-trojaned) script execution will be identical to before. A good deal of care is still needed to make the extension's scripts proof against search-path-based attacks. We have to make sure that all the function and operator invocations have exact argument-type matches, to forestall attacks based on supplying a better match. Fortunately earthdistance isn't very big, so I've just gone through it and inspected each call to be sure of that. The only actual code changes needed were to spell all floating-point constants in the style '-1'::float8, rather than depending on runtime type conversions and/or negations. (I'm not sure that the shortcuts previously used were attackable, but removing run-time effort is a good thing anyway.) I believe that this fixes earthdistance enough that we could mark it trusted and remove the warnings about it that were added by 7eeb1d986; but I've not done that here. The primary reason for dealing with this now is that we've received reports of pg_upgrade failing for databases that use earthdistance functions in contexts like generated columns. That's a consequence of 2af07e2f7 having restricted the search_path used while evaluating such expressions. The only way to fix that is to make the earthdistance functions independent of run-time search_path. This patch is very much nicer than the alternative of attaching "SET search_path" clauses to earthdistance's functions: it is more secure and doesn't create a run-time penalty. Therefore, I've chosen to back-patch this to v16 where @extschema:name@ was added. It won't help unless users update to 16.7 and issue "ALTER EXTENSION earthdistance UPDATE" before upgrading to 17, but at least there's now a way to deal with the problem without manual intervention in the dump/restore process. Tom Lane and Ronan Dunklau Discussion: https://postgr.es/m/3316564.aeNJFYEL58@aivenlaptop Discussion: https://postgr.es/m/6a6439f1-8039-44e2-8fb9-59028f7f2014@mailbox.org --- contrib/earthdistance/Makefile | 3 +- .../earthdistance/earthdistance--1.1--1.2.sql | 73 +++++++++++++++++++ contrib/earthdistance/earthdistance--1.1.sql | 8 +- contrib/earthdistance/earthdistance.control | 2 +- contrib/earthdistance/meson.build | 1 + 5 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 contrib/earthdistance/earthdistance--1.1--1.2.sql diff --git a/contrib/earthdistance/Makefile b/contrib/earthdistance/Makefile index f93b7a925a2..0cf3fa379a2 100644 --- a/contrib/earthdistance/Makefile +++ b/contrib/earthdistance/Makefile @@ -3,7 +3,8 @@ MODULES = earthdistance EXTENSION = earthdistance -DATA = earthdistance--1.1.sql earthdistance--1.0--1.1.sql +DATA = earthdistance--1.1.sql earthdistance--1.0--1.1.sql \ + earthdistance--1.1--1.2.sql PGFILEDESC = "earthdistance - calculate distances on the surface of the Earth" REGRESS = earthdistance diff --git a/contrib/earthdistance/earthdistance--1.1--1.2.sql b/contrib/earthdistance/earthdistance--1.1--1.2.sql new file mode 100644 index 00000000000..40a0ce233d1 --- /dev/null +++ b/contrib/earthdistance/earthdistance--1.1--1.2.sql @@ -0,0 +1,73 @@ +/* contrib/earthdistance/earthdistance--1.1--1.2.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION earthdistance UPDATE TO '1.2'" to load this file. \quit + +CREATE OR REPLACE FUNCTION earth() RETURNS float8 +LANGUAGE SQL IMMUTABLE PARALLEL SAFE +RETURN '6378168'::float8; + +CREATE OR REPLACE FUNCTION sec_to_gc(float8) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN $1 < '0'::float8 THEN '0'::float8 + WHEN $1 / ('2'::float8 * earth()) > '1'::float8 THEN pi() * earth() + ELSE '2'::float8 * earth() * asin($1 / ('2'::float8 * earth())) +END; + +CREATE OR REPLACE FUNCTION gc_to_sec(float8) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN $1 < '0'::float8 THEN '0'::float8 + WHEN $1 / earth() > pi() THEN '2'::float8 * earth() + ELSE '2'::float8 * earth() * sin($1 / ('2'::float8 * earth())) +END; + +CREATE OR REPLACE FUNCTION ll_to_earth(float8, float8) +RETURNS earth +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN @extschema:cube@.cube(@extschema:cube@.cube(@extschema:cube@.cube( + earth() * cos(radians($1)) * cos(radians($2))), + earth() * cos(radians($1)) * sin(radians($2))), + earth() * sin(radians($1)))::earth; + +CREATE OR REPLACE FUNCTION latitude(earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN @extschema:cube@.cube_ll_coord($1, 3) / earth() < '-1'::float8 THEN '-90'::float8 + WHEN @extschema:cube@.cube_ll_coord($1, 3) / earth() > '1'::float8 THEN '90'::float8 + ELSE degrees(asin(@extschema:cube@.cube_ll_coord($1, 3) / earth())) +END; + +CREATE OR REPLACE FUNCTION longitude(earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN degrees(atan2(@extschema:cube@.cube_ll_coord($1, 2), + @extschema:cube@.cube_ll_coord($1, 1))); + +CREATE OR REPLACE FUNCTION earth_distance(earth, earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN sec_to_gc(@extschema:cube@.cube_distance($1, $2)); + +CREATE OR REPLACE FUNCTION earth_box(earth, float8) +RETURNS @extschema:cube@.cube +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN @extschema:cube@.cube_enlarge($1, gc_to_sec($2), 3); diff --git a/contrib/earthdistance/earthdistance--1.1.sql b/contrib/earthdistance/earthdistance--1.1.sql index 9ef20ab848c..4799f03e3ea 100644 --- a/contrib/earthdistance/earthdistance--1.1.sql +++ b/contrib/earthdistance/earthdistance--1.1.sql @@ -27,10 +27,10 @@ AS 'SELECT ''6378168''::float8'; -- and that the point must be very near the surface of the sphere -- centered about the origin with the radius of the earth. -CREATE DOMAIN earth AS cube - CONSTRAINT not_point check(cube_is_point(value)) - CONSTRAINT not_3d check(cube_dim(value) <= 3) - CONSTRAINT on_surface check(abs(cube_distance(value, '(0)'::cube) / +CREATE DOMAIN earth AS @extschema:cube@.cube + CONSTRAINT not_point CHECK(@extschema:cube@.cube_is_point(VALUE)) + CONSTRAINT not_3d CHECK(@extschema:cube@.cube_dim(VALUE) <= 3) + CONSTRAINT on_surface CHECK(abs(@extschema:cube@.cube_distance(VALUE, '(0)'::@extschema:cube@.cube) / earth() - '1'::float8) < '10e-7'::float8); CREATE FUNCTION sec_to_gc(float8) diff --git a/contrib/earthdistance/earthdistance.control b/contrib/earthdistance/earthdistance.control index 5816d22cdd9..de2465d487e 100644 --- a/contrib/earthdistance/earthdistance.control +++ b/contrib/earthdistance/earthdistance.control @@ -1,6 +1,6 @@ # earthdistance extension comment = 'calculate great-circle distances on the surface of the Earth' -default_version = '1.1' +default_version = '1.2' module_pathname = '$libdir/earthdistance' relocatable = true requires = 'cube' diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build index 05794b3fe5c..220e45d60f7 100644 --- a/contrib/earthdistance/meson.build +++ b/contrib/earthdistance/meson.build @@ -20,6 +20,7 @@ install_data( 'earthdistance.control', 'earthdistance--1.0--1.1.sql', 'earthdistance--1.1.sql', + 'earthdistance--1.1--1.2.sql', kwargs: contrib_data_args, ) From 076b09123078033ebef609c91a9a276ee6e1bcb3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 15 Dec 2024 14:14:15 -0500 Subject: [PATCH 047/119] pgbench: fix misprocessing of some nested \if constructs. An \if command appearing within a false (not-to-be-executed) \if branch was incorrectly treated the same as \elif. This could allow statements within the inner \if to be executed when they should not be. Also the missing inner \if stack entry would result in an assertion failure (in assert-enabled builds) when the final \endif is reached. Report and patch by Michail Nikolaev. Back-patch to all supported branches. Discussion: https://postgr.es/m/CANtu0oiA1ke=SP6tauhNqkUdv5QFsJtS1p=aOOf_iU+EhyKkjQ@mail.gmail.com --- src/bin/pgbench/pgbench.c | 16 ++++--- src/bin/pgbench/t/001_pgbench_with_server.pl | 50 ++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index fd2c8f42c50..1aa6661f142 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3865,8 +3865,14 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) switch (conditional_stack_peek(st->cstack)) { case IFSTATE_FALSE: - if (command->meta == META_IF || - command->meta == META_ELIF) + if (command->meta == META_IF) + { + /* nested if in skipped branch - ignore */ + conditional_stack_push(st->cstack, + IFSTATE_IGNORED); + st->command++; + } + else if (command->meta == META_ELIF) { /* we must evaluate the condition */ st->state = CSTATE_START_COMMAND; @@ -3885,11 +3891,7 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) conditional_stack_pop(st->cstack); if (conditional_active(st->cstack)) st->state = CSTATE_START_COMMAND; - - /* - * else state remains in - * CSTATE_SKIP_COMMAND - */ + /* else state remains CSTATE_SKIP_COMMAND */ st->command++; } break; diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index afc9ecfaf77..d746987b530 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -633,6 +633,56 @@ } }); +# test nested \if constructs +$node->pgbench( + '--no-vacuum --client=1 --transactions=1', + 0, + [qr{actually processed}], + [qr{^$}], + 'nested ifs', + { + 'pgbench_nested_if' => q( + \if false + SELECT 1 / 0; + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + SELECT 1 / 0; + \elif false + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + \else + \if false + SELECT 1 / 0; + \elif false + SELECT 1 / 0; + \else + SELECT 'correct'; + \endif + \endif + \if true + SELECT 'correct'; + \else + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + \endif + ) + }); + # random determinism when seeded $node->safe_psql('postgres', 'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);' From 3231cb57d886450f0251f64e440ac51d4675bef2 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 16 Dec 2024 15:56:38 +0200 Subject: [PATCH 048/119] Make 009_twophase.pl test pass with recovery_min_apply_delay set The test failed if you ran the regression tests with TEMP_CONFIG with recovery_min_apply_delay = '500ms'. Fix the race condition by waiting for transaction to be applied in the replica, like in a few other tests. The failing test was introduced in commit cbfbda7841. Backpatch to all supported versions like that commit (except v12, which is no longer supported). Reported-by: Alexander Lakhin Discussion: https://www.postgresql.org/message-id/09e2a70a-a6c2-4b5c-aeae-040a7449c9f2@gmail.com --- src/test/recovery/t/009_twophase.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/recovery/t/009_twophase.pl b/src/test/recovery/t/009_twophase.pl index b790b66b38b..fe7e8e79802 100644 --- a/src/test/recovery/t/009_twophase.pl +++ b/src/test/recovery/t/009_twophase.pl @@ -315,6 +315,7 @@ sub configure_and_reload $cur_primary->psql( 'postgres', " + SET synchronous_commit='remote_apply'; -- To ensure the standby is caught up CREATE TABLE t_009_tbl_standby_mvcc (id int, msg text); BEGIN; INSERT INTO t_009_tbl_standby_mvcc VALUES (1, 'issued to ${cur_primary_name}'); From 2a74023221f9b9e484611581542c14fc6ef6d239 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 17 Dec 2024 15:24:45 -0600 Subject: [PATCH 049/119] Accommodate very large dshash tables. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a dshash table grows very large (e.g., the dshash table for cumulative statistics when there are millions of tables), resizing it may fail with an error like: ERROR: invalid DSA memory alloc request size 1073741824 To fix, permit dshash resizing to allocate more than 1 GB by providing the DSA_ALLOC_HUGE flag. Reported-by: Andreas Scherbaum Author: Matthias van de Meent Reviewed-by: Cédric Villemain, Michael Paquier, Andres Freund Discussion: https://postgr.es/m/80a12d59-0d5e-4c54-866c-e69cd6536471%40pgug.de Backpatch-through: 13 --- src/backend/lib/dshash.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backend/lib/dshash.c b/src/backend/lib/dshash.c index 14ed2d87bba..9d551f00d97 100644 --- a/src/backend/lib/dshash.c +++ b/src/backend/lib/dshash.c @@ -844,8 +844,10 @@ resize(dshash_table *hash_table, size_t new_size_log2) Assert(new_size_log2 == hash_table->control->size_log2 + 1); /* Allocate the space for the new table. */ - new_buckets_shared = dsa_allocate0(hash_table->area, - sizeof(dsa_pointer) * new_size); + new_buckets_shared = + dsa_allocate_extended(hash_table->area, + sizeof(dsa_pointer) * new_size, + DSA_ALLOC_HUGE | DSA_ALLOC_ZERO); new_buckets = dsa_get_address(hash_table->area, new_buckets_shared); /* From 8cfff087b55f6688e2f3b5f1ba303dc5fb8222c6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 17 Dec 2024 22:31:26 -0500 Subject: [PATCH 050/119] Fix memory leak in pg_restore with zstd-compressed data. EndCompressorZstd() neglected to free everything. This was most visible with a lot of large objects in the dump. Per report from Tomasz Szypowski. Back-patch to v16 where this code came in. Discussion: https://postgr.es/m/DU0PR04MB94193D038A128EF989F922D199042@DU0PR04MB9419.eurprd04.prod.outlook.com --- src/bin/pg_dump/compress_zstd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_dump/compress_zstd.c b/src/bin/pg_dump/compress_zstd.c index 82e3310100f..078be03387e 100644 --- a/src/bin/pg_dump/compress_zstd.c +++ b/src/bin/pg_dump/compress_zstd.c @@ -137,9 +137,10 @@ EndCompressorZstd(ArchiveHandle *AH, CompressorState *cs) Assert(zstdcs->dstream == NULL); _ZstdWriteCommon(AH, cs, true); ZSTD_freeCStream(zstdcs->cstream); - pg_free(zstdcs->output.dst); } + /* output buffer may be allocated in either mode */ + pg_free(zstdcs->output.dst); pg_free(zstdcs); } From 093fc156b0ef69fdbe2a345c4ba6bca461c62631 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 19 Dec 2024 13:12:41 +1300 Subject: [PATCH 051/119] Fix Assert failure in WITH RECURSIVE UNION queries If the non-recursive part of a recursive CTE ended up using TTSOpsBufferHeapTuple as the table slot type, then a duplicate value could cause an Assert failure in CheckOpSlotCompatibility() when checking the hash table for the duplicate value. The expected slot type for the deform step was TTSOpsMinimalTuple so the Assert failed when the TTSOpsBufferHeapTuple slot was used. This is a long-standing bug which we likely didn't notice because it seems much more likely that the non-recursive term would have required projection and used a TTSOpsVirtual slot, which CheckOpSlotCompatibility is ok with. There doesn't seem to be any harm done here other than the Assert failure. Both TTSOpsMinimalTuple and TTSOpsBufferHeapTuple slot types require tuple deformation, so the EEOP_*_FETCHSOME ExprState step would have properly existed in the ExprState. The solution is to pass NULL for the ExecBuildGroupingEqual's 'lops' parameter. This means the ExprState's EEOP_*_FETCHSOME step won't expect a fixed slot type. This makes CheckOpSlotCompatibility() happy as no checking is performed when the ExprEvalStep is not expecting a fixed slot type. Reported-by: Richard Guo Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAMbWs4-8U9q2LAtf8+ghV11zeUReA3AmrYkxzBEv0vKnDxwkKA@mail.gmail.com Backpatch-through: 13, all supported versions --- src/backend/executor/execGrouping.c | 3 +-- src/test/regress/expected/with.out | 15 +++++++++++++++ src/test/regress/sql/with.sql | 12 ++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c index bc9f9b142ae..ba4f238ed9f 100644 --- a/src/backend/executor/execGrouping.c +++ b/src/backend/executor/execGrouping.c @@ -225,9 +225,8 @@ BuildTupleHashTableExt(PlanState *parent, allow_jit = metacxt != tablecxt; /* build comparator for all columns */ - /* XXX: should we support non-minimal tuples for the inputslot? */ hashtable->tab_eq_func = ExecBuildGroupingEqual(inputDesc, inputDesc, - &TTSOpsMinimalTuple, &TTSOpsMinimalTuple, + NULL, &TTSOpsMinimalTuple, numCols, keyColIdx, eqfuncoids, collations, allow_jit ? parent : NULL); diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index 86e64602262..204d5d7d7ca 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -636,6 +636,21 @@ SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON 16 | {3,7,11,16} | (16,"{3,7,11,16}") (16 rows) +CREATE TEMP TABLE duplicates (a INT NOT NULL); +INSERT INTO duplicates VALUES(1), (1); +-- Try out a recursive UNION case where the non-recursive part's table slot +-- uses TTSOpsBufferHeapTuple and contains duplicate rows. +WITH RECURSIVE cte (a) as ( + SELECT a FROM duplicates + UNION + SELECT a FROM cte +) +SELECT a FROM cte; + a +--- + 1 +(1 row) + -- SEARCH clause create temp table graph0( f int, t int, label text ); insert into graph0 values diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index b2817a5c633..86f507efb27 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -347,6 +347,18 @@ UNION ALL SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON (t1.id=t2.id); +CREATE TEMP TABLE duplicates (a INT NOT NULL); +INSERT INTO duplicates VALUES(1), (1); + +-- Try out a recursive UNION case where the non-recursive part's table slot +-- uses TTSOpsBufferHeapTuple and contains duplicate rows. +WITH RECURSIVE cte (a) as ( + SELECT a FROM duplicates + UNION + SELECT a FROM cte +) +SELECT a FROM cte; + -- SEARCH clause create temp table graph0( f int, t int, label text ); From ba02d24bacbb221891370a6b2c2655f24f128305 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Fri, 20 Dec 2024 21:53:25 +1300 Subject: [PATCH 052/119] Fix corruption when relation truncation fails. RelationTruncate() does three things, while holding an AccessExclusiveLock and preventing checkpoints: 1. Logs the truncation. 2. Drops buffers, even if they're dirty. 3. Truncates some number of files. Step 2 could previously be canceled if it had to wait for I/O, and step 3 could and still can fail in file APIs. All orderings of these operations have data corruption hazards if interrupted, so we can't give up until the whole operation is done. When dirty pages were discarded but the corresponding blocks were left on disk due to ERROR, old page versions could come back from disk, reviving deleted data (see pgsql-bugs #18146 and several like it). When primary and standby were allowed to disagree on relation size, standbys could panic (see pgsql-bugs #18426) or revive data unknown to visibility management on the primary (theorized). Changes: * WAL is now unconditionally flushed first * smgrtruncate() is now called in a critical section, preventing interrupts and causing PANIC on file API failure * smgrtruncate() has a new parameter for existing fork sizes, because it can't call smgrnblocks() itself inside a critical section The changes apply to RelationTruncate(), smgr_redo() and pg_truncate_visibility_map(). That last is also brought up to date with other evolutions of the truncation protocol. The VACUUM FileTruncate() failure mode had been discussed in older reports than the ones referenced below, with independent analysis from many people, but earlier theories on how to fix it were too complicated to back-patch. The more recently invented cancellation bug was diagnosed by Alexander Lakhin. Other corruption scenarios were spotted by me while iterating on this patch and earlier commit 75818b3a. Back-patch to all supported releases. Reviewed-by: Michael Paquier Reviewed-by: Robert Haas Reported-by: rootcause000@gmail.com Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/18146-04e908c662113ad5%40postgresql.org Discussion: https://postgr.es/m/18426-2d18da6586f152d6%40postgresql.org --- contrib/pg_visibility/pg_visibility.c | 29 ++++++++++++++---- src/backend/catalog/storage.c | 44 +++++++++++++++++++-------- src/backend/storage/smgr/md.c | 28 ++++++++++++----- src/backend/storage/smgr/smgr.c | 14 ++++++--- src/include/storage/md.h | 2 +- src/include/storage/smgr.h | 5 +-- 6 files changed, 89 insertions(+), 33 deletions(-) diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c index 2a4acfd1eee..8c2a493ad2e 100644 --- a/contrib/pg_visibility/pg_visibility.c +++ b/contrib/pg_visibility/pg_visibility.c @@ -19,6 +19,7 @@ #include "funcapi.h" #include "miscadmin.h" #include "storage/bufmgr.h" +#include "storage/proc.h" #include "storage/procarray.h" #include "storage/smgr.h" #include "utils/rel.h" @@ -379,6 +380,7 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) Relation rel; ForkNumber fork; BlockNumber block; + BlockNumber old_block; rel = relation_open(relid, AccessExclusiveLock); @@ -388,15 +390,22 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) /* Forcibly reset cached file size */ RelationGetSmgr(rel)->smgr_cached_nblocks[VISIBILITYMAP_FORKNUM] = InvalidBlockNumber; + /* Compute new and old size before entering critical section. */ + fork = VISIBILITYMAP_FORKNUM; block = visibilitymap_prepare_truncate(rel, 0); - if (BlockNumberIsValid(block)) - { - fork = VISIBILITYMAP_FORKNUM; - smgrtruncate(RelationGetSmgr(rel), &fork, 1, &block); - } + old_block = BlockNumberIsValid(block) ? smgrnblocks(RelationGetSmgr(rel), fork) : 0; + + /* + * WAL-logging, buffer dropping, file truncation must be atomic and all on + * one side of a checkpoint. See RelationTruncate() for discussion. + */ + Assert((MyProc->delayChkptFlags & (DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE)) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE; + START_CRIT_SECTION(); if (RelationNeedsWAL(rel)) { + XLogRecPtr lsn; xl_smgr_truncate xlrec; xlrec.blkno = 0; @@ -406,9 +415,17 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE); + lsn = XLogInsert(RM_SMGR_ID, + XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE); + XLogFlush(lsn); } + if (BlockNumberIsValid(block)) + smgrtruncate(RelationGetSmgr(rel), &fork, 1, &old_block, &block); + + END_CRIT_SECTION(); + MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); + /* * Release the lock right away, not at commit time. * diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index fc300f81199..740c6f4d921 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -290,6 +290,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) bool vm; bool need_fsm_vacuum = false; ForkNumber forks[MAX_FORKNUM]; + BlockNumber old_blocks[MAX_FORKNUM]; BlockNumber blocks[MAX_FORKNUM]; int nforks = 0; SMgrRelation reln; @@ -305,6 +306,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) /* Prepare for truncation of MAIN fork of the relation */ forks[nforks] = MAIN_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, MAIN_FORKNUM); blocks[nforks] = nblocks; nforks++; @@ -316,6 +318,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = FSM_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, FSM_FORKNUM); nforks++; need_fsm_vacuum = true; } @@ -329,6 +332,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = VISIBILITYMAP_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, VISIBILITYMAP_FORKNUM); nforks++; } } @@ -365,14 +369,20 @@ RelationTruncate(Relation rel, BlockNumber nblocks) MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE; /* - * We WAL-log the truncation before actually truncating, which means - * trouble if the truncation fails. If we then crash, the WAL replay - * likely isn't going to succeed in the truncation either, and cause a - * PANIC. It's tempting to put a critical section here, but that cure - * would be worse than the disease. It would turn a usually harmless - * failure to truncate, that might spell trouble at WAL replay, into a - * certain PANIC. + * We WAL-log the truncation first and then truncate in a critical + * section. Truncation drops buffers, even if dirty, and then truncates + * disk files. All of that work needs to complete before the lock is + * released, or else old versions of pages on disk that are missing recent + * changes would become accessible again. We'll try the whole operation + * again in crash recovery if we panic, but even then we can't give up + * because we don't want standbys' relation sizes to diverge and break + * replay or visibility invariants downstream. The critical section also + * suppresses interrupts. + * + * (See also pg_visibilitymap.c if changing this code.) */ + START_CRIT_SECTION(); + if (RelationNeedsWAL(rel)) { /* @@ -396,10 +406,10 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * hit the disk before the WAL record, and the truncation of the FSM * or visibility map. If we crashed during that window, we'd be left * with a truncated heap, but the FSM or visibility map would still - * contain entries for the non-existent heap pages. + * contain entries for the non-existent heap pages, and standbys would + * also never replay the truncation. */ - if (fsm || vm) - XLogFlush(lsn); + XLogFlush(lsn); } /* @@ -407,7 +417,9 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * longer exist after truncation is complete, and then truncate the * corresponding files on disk. */ - smgrtruncate(RelationGetSmgr(rel), forks, nforks, blocks); + smgrtruncate(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks); + + END_CRIT_SECTION(); /* We've done all the critical work, so checkpoints are OK now. */ MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); @@ -991,6 +1003,7 @@ smgr_redo(XLogReaderState *record) Relation rel; ForkNumber forks[MAX_FORKNUM]; BlockNumber blocks[MAX_FORKNUM]; + BlockNumber old_blocks[MAX_FORKNUM]; int nforks = 0; bool need_fsm_vacuum = false; @@ -1025,6 +1038,7 @@ smgr_redo(XLogReaderState *record) if ((xlrec->flags & SMGR_TRUNCATE_HEAP) != 0) { forks[nforks] = MAIN_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, MAIN_FORKNUM); blocks[nforks] = xlrec->blkno; nforks++; @@ -1042,6 +1056,7 @@ smgr_redo(XLogReaderState *record) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = FSM_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, FSM_FORKNUM); nforks++; need_fsm_vacuum = true; } @@ -1053,13 +1068,18 @@ smgr_redo(XLogReaderState *record) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = VISIBILITYMAP_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, VISIBILITYMAP_FORKNUM); nforks++; } } /* Do the real work to truncate relation forks */ if (nforks > 0) - smgrtruncate(reln, forks, nforks, blocks); + { + START_CRIT_SECTION(); + smgrtruncate(reln, forks, nforks, old_blocks, blocks); + END_CRIT_SECTION(); + } /* * Update upper-level FSM pages to account for the truncation. This is diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index fdecbad1709..2a0dcc31945 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -990,19 +990,21 @@ mdnblocks(SMgrRelation reln, ForkNumber forknum) /* * mdtruncate() -- Truncate relation to specified number of blocks. + * + * Guaranteed not to allocate memory, so it can be used in a critical section. + * Caller must have called smgrnblocks() to obtain curnblk while holding a + * sufficient lock to prevent a change in relation size, and not used any smgr + * functions for this relation or handled interrupts in between. This makes + * sure we have opened all active segments, so that truncate loop will get + * them all! */ void -mdtruncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks) +mdtruncate(SMgrRelation reln, ForkNumber forknum, + BlockNumber curnblk, BlockNumber nblocks) { - BlockNumber curnblk; BlockNumber priorblocks; int curopensegs; - /* - * NOTE: mdnblocks makes sure we have opened all active segments, so that - * truncation loop will get them all! - */ - curnblk = mdnblocks(reln, forknum); if (nblocks > curnblk) { /* Bogus request ... but no complaint if InRecovery */ @@ -1298,7 +1300,7 @@ _fdvec_resize(SMgrRelation reln, reln->md_seg_fds[forknum] = MemoryContextAlloc(MdCxt, sizeof(MdfdVec) * nseg); } - else + else if (nseg > reln->md_num_open_segs[forknum]) { /* * It doesn't seem worthwhile complicating the code to amortize @@ -1310,6 +1312,16 @@ _fdvec_resize(SMgrRelation reln, repalloc(reln->md_seg_fds[forknum], sizeof(MdfdVec) * nseg); } + else + { + /* + * We don't reallocate a smaller array, because we want mdtruncate() + * to be able to promise that it won't allocate memory, so that it is + * allowed in a critical section. This means that a bit of space in + * the array is now wasted, until the next time we add a segment and + * reallocate. + */ + } reln->md_num_open_segs[forknum] = nseg; } diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index e4a4f66b7ee..7b5d6754bb9 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -63,7 +63,7 @@ typedef struct f_smgr BlockNumber blocknum, BlockNumber nblocks); BlockNumber (*smgr_nblocks) (SMgrRelation reln, ForkNumber forknum); void (*smgr_truncate) (SMgrRelation reln, ForkNumber forknum, - BlockNumber nblocks); + BlockNumber old_blocks, BlockNumber nblocks); void (*smgr_immedsync) (SMgrRelation reln, ForkNumber forknum); } f_smgr; @@ -651,10 +651,15 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum) * * The caller must hold AccessExclusiveLock on the relation, to ensure that * other backends receive the smgr invalidation event that this function sends - * before they access any forks of the relation again. + * before they access any forks of the relation again. The current size of + * the forks should be provided in old_nblocks. This function should normally + * be called in a critical section, but the current size must be checked + * outside the critical section, and no interrupts or smgr functions relating + * to this relation should be called in between. */ void -smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks) +smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, BlockNumber *nblocks) { int i; @@ -682,7 +687,8 @@ smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nb /* Make the cached size is invalid if we encounter an error. */ reln->smgr_cached_nblocks[forknum[i]] = InvalidBlockNumber; - smgrsw[reln->smgr_which].smgr_truncate(reln, forknum[i], nblocks[i]); + smgrsw[reln->smgr_which].smgr_truncate(reln, forknum[i], + old_nblocks[i], nblocks[i]); /* * We might as well update the local smgr_cached_nblocks values. The diff --git a/src/include/storage/md.h b/src/include/storage/md.h index 941879ee6a8..a16235d51fe 100644 --- a/src/include/storage/md.h +++ b/src/include/storage/md.h @@ -40,7 +40,7 @@ extern void mdwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); extern BlockNumber mdnblocks(SMgrRelation reln, ForkNumber forknum); extern void mdtruncate(SMgrRelation reln, ForkNumber forknum, - BlockNumber nblocks); + BlockNumber old_blocks, BlockNumber nblocks); extern void mdimmedsync(SMgrRelation reln, ForkNumber forknum); extern void ForgetDatabaseSyncRequests(Oid dbid); diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index a9a179aabac..8b1157541af 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -104,8 +104,9 @@ extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum); extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum); -extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, - int nforks, BlockNumber *nblocks); +extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, + BlockNumber *nblocks); extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); extern void AtEOXact_SMgr(void); extern bool ProcessBarrierSmgrRelease(void); From 9d8ab2c461d706ca22adf86c057d4f76ca7f6da6 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sat, 21 Dec 2024 23:42:39 +0200 Subject: [PATCH 053/119] Update TransactionXmin when MyProc->xmin is updated GetSnapshotData() set TransactionXmin = MyProc->xmin, but when SnapshotResetXmin() advanced MyProc->xmin, it did not advance TransactionXmin correspondingly. That meant that TransactionXmin could be older than MyProc->xmin, and XIDs between than TransactionXmin and the real MyProc->xmin could be vacuumed away. One known consequence is in pg_subtrans lookups: we might try to look up the status of an XID that was already truncated away. Back-patch to all supported versions. Reviewed-by: Andres Freund Discussion: https://www.postgresql.org/message-id/d27a046d-a1e4-47d1-a95c-fbabe41debb4@iki.fi --- src/backend/utils/time/snapmgr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index 3a419e348fa..681ca822558 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -950,7 +950,7 @@ SnapshotResetXmin(void) if (pairingheap_is_empty(&RegisteredSnapshots)) { - MyProc->xmin = InvalidTransactionId; + MyProc->xmin = TransactionXmin = InvalidTransactionId; return; } @@ -958,7 +958,7 @@ SnapshotResetXmin(void) pairingheap_first(&RegisteredSnapshots)); if (TransactionIdPrecedes(MyProc->xmin, minSnapshot->xmin)) - MyProc->xmin = minSnapshot->xmin; + MyProc->xmin = TransactionXmin = minSnapshot->xmin; } /* From 4d45e7490c417d477458865926555895db125910 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 23 Dec 2024 12:48:08 +0900 Subject: [PATCH 054/119] Fix memory leak in pgoutput with publication list cache The pgoutput module caches publication names in a list and frees it upon invalidation. However, the code forgot to free the actual publication names within the list elements, as publication names are pstrdup()'d in GetPublication(). This would cause memory to leak in CacheMemoryContext, bloating it over time as this context is not cleaned. This is a problem for WAL senders running for a long time, as an accumulation of invalidation requests would bloat its cache memory usage. A second case, where this leak is easier to see, involves a backend calling SQL functions like pg_logical_slot_{get,peek}_changes() which create a new decoding context with each execution. More publications create more bloat. To address this, this commit adds a new memory context within the logical decoding context and resets it each time the publication names cache is invalidated, based on a suggestion from Amit Kapila. This ensures that the lifespan of the publication names aligns with that of the logical decoding context. Contrary to the HEAD-only commit f0c569d71515 that has changed PGOutputData to track this new child memory context, the context is tracked with a static variable whose state is reset with a MemoryContext reset callback attached to PGOutputData->context, so as ABI compatibility is preserved in stable branches. This approach is based on an suggestion from Amit Kapila. Analyzed-by: Michael Paquier, Jeff Davis Author: Masahiko Sawada Reviewed-by: Amit Kapila, Michael Paquier, Euler Taveira, Hou Zhijie Discussion: https://postgr.es/m/Z0khf9EVMVLOc_YY@paquier.xyz Backpatch-through: 13 --- src/backend/replication/pgoutput/pgoutput.c | 46 +++++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index bb8f3ea702f..c9ae239aa4e 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -83,6 +83,13 @@ static void pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx, static bool publications_valid; static bool in_streaming; +/* + * Private memory context for publication data, created in + * PGOutputData->context when starting pgoutput, and set to NULL when its + * parent context is reset via a dedicated MemoryContextCallback. + */ +static MemoryContext pubctx = NULL; + static List *LoadPublications(List *pubnames); static void publication_invalidation_cb(Datum arg, int cacheid, uint32 hashvalue); @@ -399,6 +406,15 @@ parse_output_parameters(List *options, PGOutputData *data) } } +/* + * Callback of PGOutputData->context in charge of cleaning pubctx. + */ +static void +pgoutput_pubctx_reset_callback(void *arg) +{ + pubctx = NULL; +} + /* * Initialize this plugin */ @@ -408,6 +424,7 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, { PGOutputData *data = palloc0(sizeof(PGOutputData)); static bool publication_callback_registered = false; + MemoryContextCallback *mcallback; /* Create our memory context for private allocations. */ data->context = AllocSetContextCreate(ctx->context, @@ -418,6 +435,15 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, "logical replication cache context", ALLOCSET_DEFAULT_SIZES); + Assert(pubctx == NULL); + pubctx = AllocSetContextCreate(ctx->context, + "logical replication publication list context", + ALLOCSET_SMALL_SIZES); + + mcallback = palloc0(sizeof(MemoryContextCallback)); + mcallback->func = pgoutput_pubctx_reset_callback; + MemoryContextRegisterResetCallback(ctx->context, mcallback); + ctx->output_plugin_private = data; /* This plugin uses binary protocol. */ @@ -1692,9 +1718,9 @@ pgoutput_origin_filter(LogicalDecodingContext *ctx, /* * Shutdown the output plugin. * - * Note, we don't need to clean the data->context and data->cachectx as - * they are child contexts of the ctx->context so they will be cleaned up by - * logical decoding machinery. + * Note, we don't need to clean the data->context, data->cachectx and pubctx + * as they are child contexts of the ctx->context so they will be cleaned up + * by logical decoding machinery. */ static void pgoutput_shutdown(LogicalDecodingContext *ctx) @@ -1704,6 +1730,9 @@ pgoutput_shutdown(LogicalDecodingContext *ctx) hash_destroy(RelationSyncCache); RelationSyncCache = NULL; } + + /* Better safe than sorry */ + pubctx = NULL; } /* @@ -2015,12 +2044,11 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* Reload publications if needed before use. */ if (!publications_valid) { - oldctx = MemoryContextSwitchTo(CacheMemoryContext); - if (data->publications) - { - list_free_deep(data->publications); - data->publications = NIL; - } + Assert(pubctx); + + MemoryContextReset(pubctx); + oldctx = MemoryContextSwitchTo(pubctx); + data->publications = LoadPublications(data->publication_names); MemoryContextSwitchTo(oldctx); publications_valid = true; From 4e0d71ff22594b50d6ee545a12072306589cc462 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 25 Dec 2024 18:14:18 +0200 Subject: [PATCH 055/119] meson: Export all libcommon functions in Windows builds This fixes "unresolved external symbol" errors with extensions that use functions from libcommon. This was reported with pgvector. Reported-by: Andrew Kane Author: Vladlen Popolitov Backpatch-through: 16, where Meson was introduced Discussion: https://www.postgresql.org/message-id/CAOdR5yF0krWrxycA04rgUKCgKugRvGWzzGLAhDZ9bzNv8g0Lag@mail.gmail.com --- src/common/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/meson.build b/src/common/meson.build index 9efc80ac024..3e06ca11117 100644 --- a/src/common/meson.build +++ b/src/common/meson.build @@ -161,6 +161,7 @@ foreach name, opts : pgcommon_variants lib = static_library('libpgcommon@0@'.format(name), link_with: cflag_libs, + link_whole: cflag_libs, c_pch: pch_c_h, include_directories: include_directories('.'), kwargs: opts + { From 643efb18bf80ff179981cbd91c843cc6ae97a713 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 25 Dec 2024 19:22:25 +0200 Subject: [PATCH 056/119] meson: Export all libcommon functions in Windows builds This fixes "unresolved external symbol" errors with extensions that use functions from libpgport that need special CFLAGS to compile. Currently, that includes the CRC-32 functions. Commit 2571c1d5cc did this for libcommon, but I missed that libpqport has the same issue. Reported-by: Tom Lane Backpatch-through: 16, where Meson was introduced Discussion: https://www.postgresql.org/message-id/CAOdR5yF0krWrxycA04rgUKCgKugRvGWzzGLAhDZ9bzNv8g0Lag@mail.gmail.com --- src/port/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/src/port/meson.build b/src/port/meson.build index 900076df571..825bd4d1cb2 100644 --- a/src/port/meson.build +++ b/src/port/meson.build @@ -182,6 +182,7 @@ foreach name, opts : pgport_variants lib = static_library('libpgport@0@'.format(name), pgport_sources, link_with: cflag_libs, + link_whole: cflag_libs, c_pch: pch_c_h, kwargs: opts + { 'dependencies': opts['dependencies'] + [ssl], From 5d94aa4dc3a492830e0ac8f0292e26f5c6bd2b5b Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 28 Dec 2024 07:16:22 -0800 Subject: [PATCH 057/119] In REASSIGN OWNED of a database, lock the tuple as mandated. Commit aac2c9b4fde889d13f859c233c2523345e72d32b mandated such locking and attempted to fulfill that mandate, but it missed REASSIGN OWNED. Hence, it remained possible to lose VACUUM's inplace update of datfrozenxid if a REASSIGN OWNED processed that database at the same time. This didn't affect the other inplace-updated catalog, pg_class. For pg_class, REASSIGN OWNED calls ATExecChangeOwner() instead of the generic AlterObjectOwner_internal(), and ATExecChangeOwner() fulfills the locking mandate. Like in GRANT, implement this by following the locking protocol for any catalog subject to the generic AlterObjectOwner_internal(). It would suffice to do this for IsInplaceUpdateOid() catalogs only. Back-patch to v13 (all supported versions). Kirill Reshke. Reported by Alexander Kukushkin. Discussion: https://postgr.es/m/CAFh8B=mpKjAy4Cuun-HP-f_vRzh2HSvYFG3rhVfYbfEBUhBAGg@mail.gmail.com --- src/backend/catalog/objectaddress.c | 27 +++++++++++++++++++++++++- src/backend/commands/alter.c | 9 ++++++++- src/include/catalog/objectaddress.h | 4 ++++ src/test/regress/expected/database.out | 6 ++++++ src/test/regress/sql/database.sql | 7 +++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 46d7243d5dc..4d510916934 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -2817,6 +2817,22 @@ get_object_property_data(Oid class_id) */ HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) +{ + return + get_catalog_object_by_oid_extended(catalog, oidcol, objectId, false); +} + +/* + * Same as get_catalog_object_by_oid(), but with an additional "locktup" + * argument controlling whether to acquire a LOCKTAG_TUPLE at mode + * InplaceUpdateTupleLock. See README.tuplock section "Locking to write + * inplace-updated tables". + */ +HeapTuple +get_catalog_object_by_oid_extended(Relation catalog, + AttrNumber oidcol, + Oid objectId, + bool locktup) { HeapTuple tuple; Oid classId = RelationGetRelid(catalog); @@ -2824,7 +2840,12 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) if (oidCacheId > 0) { - tuple = SearchSysCacheCopy1(oidCacheId, ObjectIdGetDatum(objectId)); + if (locktup) + tuple = SearchSysCacheLockedCopy1(oidCacheId, + ObjectIdGetDatum(objectId)); + else + tuple = SearchSysCacheCopy1(oidCacheId, + ObjectIdGetDatum(objectId)); if (!HeapTupleIsValid(tuple)) /* should not happen */ return NULL; } @@ -2849,6 +2870,10 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) systable_endscan(scan); return NULL; } + + if (locktup) + LockTuple(catalog, &tuple->t_self, InplaceUpdateTupleLock); + tuple = heap_copytuple(tuple); systable_endscan(scan); diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index cbe02853b04..85f11a1ec61 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -62,6 +62,7 @@ #include "parser/parse_func.h" #include "replication/logicalworker.h" #include "rewrite/rewriteDefine.h" +#include "storage/lmgr.h" #include "tcop/utility.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -975,7 +976,9 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) Oid old_ownerId; Oid namespaceId = InvalidOid; - oldtup = get_catalog_object_by_oid(rel, Anum_oid, objectId); + /* Search tuple and lock it. */ + oldtup = + get_catalog_object_by_oid_extended(rel, Anum_oid, objectId, true); if (oldtup == NULL) elog(ERROR, "cache lookup failed for object %u of catalog \"%s\"", objectId, RelationGetRelationName(rel)); @@ -1074,6 +1077,8 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) /* Perform actual update */ CatalogTupleUpdate(rel, &newtup->t_self, newtup); + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* * Update owner dependency reference. When working on a large object, * we have to translate back to the OID conventionally used for LOs' @@ -1091,6 +1096,8 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) } else { + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* * No need to change anything. But when working on a large object, we * have to translate back to the OID conventionally used for LOs' diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h index 9caa3109a2e..c387860813d 100644 --- a/src/include/catalog/objectaddress.h +++ b/src/include/catalog/objectaddress.h @@ -69,6 +69,10 @@ extern bool get_object_namensp_unique(Oid class_id); extern HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId); +extern HeapTuple get_catalog_object_by_oid_extended(Relation catalog, + AttrNumber oidcol, + Oid objectId, + bool locktup); extern char *getObjectDescription(const ObjectAddress *object, bool missing_ok); diff --git a/src/test/regress/expected/database.out b/src/test/regress/expected/database.out index 454db91ec09..4cbdbdf84d0 100644 --- a/src/test/regress/expected/database.out +++ b/src/test/regress/expected/database.out @@ -12,4 +12,10 @@ WHERE datname = 'regression_utf8'; -- load catcache entry, if nothing else does ALTER DATABASE regression_utf8 RESET TABLESPACE; ROLLBACK; +CREATE ROLE regress_datdba_before; +CREATE ROLE regress_datdba_after; +ALTER DATABASE regression_utf8 OWNER TO regress_datdba_before; +REASSIGN OWNED BY regress_datdba_before TO regress_datdba_after; DROP DATABASE regression_utf8; +DROP ROLE regress_datdba_before; +DROP ROLE regress_datdba_after; diff --git a/src/test/regress/sql/database.sql b/src/test/regress/sql/database.sql index 0367c0e37ab..46ad2634781 100644 --- a/src/test/regress/sql/database.sql +++ b/src/test/regress/sql/database.sql @@ -14,4 +14,11 @@ WHERE datname = 'regression_utf8'; ALTER DATABASE regression_utf8 RESET TABLESPACE; ROLLBACK; +CREATE ROLE regress_datdba_before; +CREATE ROLE regress_datdba_after; +ALTER DATABASE regression_utf8 OWNER TO regress_datdba_before; +REASSIGN OWNED BY regress_datdba_before TO regress_datdba_after; + DROP DATABASE regression_utf8; +DROP ROLE regress_datdba_before; +DROP ROLE regress_datdba_after; From 41a252c2ca68ba7239e73abd99fdbf28871f5f07 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 28 Dec 2024 16:08:50 -0500 Subject: [PATCH 058/119] Exclude parallel workers from connection privilege/limit checks. Cause parallel workers to not check datallowconn, rolcanlogin, and ACL_CONNECT privileges. The leader already checked these things (except for rolcanlogin which might have been checked for a different role). Re-checking can accomplish little except to induce unexpected failures in applications that might not even be aware that their query has been parallelized. We already had the principle that parallel workers rely on their leader to pass a valid set of authorization information, so this change just extends that a bit further. Also, modify the ReservedConnections, datconnlimit and rolconnlimit logic so that these limits are only enforced against regular backends, and only regular backends are counted while checking if the limits were already reached. Previously, background processes that had an assigned database or role were subject to these limits (with rather random exclusions for autovac workers and walsenders), and the set of existing processes that counted against each limit was quite haphazard as well. The point of these limits, AFAICS, is to ensure the availability of PGPROC slots for regular backends. Since all other types of processes have their own separate pools of PGPROC slots, it makes no sense either to enforce these limits against them or to count them while enforcing the limit. While edge-case failures of these sorts have been possible for a long time, the problem got a good deal worse with commit 5a2fed911 (CVE-2024-10978), which caused parallel workers to make some of these checks using the leader's current role where before we had used its AuthenticatedUserId, thus allowing parallel queries to fail after SET ROLE. The previous behavior was fairly accidental and I have no desire to return to it. This patch includes reverting 73c9f91a1, which was an emergency hack to suppress these same checks in some cases. It wasn't complete, as shown by a recent bug report from Laurenz Albe. We can also revert fd4d93d26 and 492217301, which hacked around the same problems in one regression test. In passing, remove the special case for autovac workers in CheckMyDatabase; it seems cleaner to have AutoVacWorkerMain pass the INIT_PG_OVERRIDE_ALLOW_CONNS flag, now that that does what's needed. Like 5a2fed911, back-patch to supported branches (which sadly no longer includes v12). Discussion: https://postgr.es/m/1808397.1735156190@sss.pgh.pa.us --- src/backend/access/transam/parallel.c | 9 +++- src/backend/access/transam/twophase.c | 2 +- src/backend/postmaster/autovacuum.c | 6 ++- src/backend/storage/ipc/procarray.c | 4 +- src/backend/storage/lmgr/proc.c | 4 +- src/backend/utils/init/miscinit.c | 75 +++++++++++++-------------- src/backend/utils/init/postinit.c | 43 +++++---------- src/include/miscadmin.h | 2 + src/include/storage/proc.h | 2 +- 9 files changed, 69 insertions(+), 78 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index e8b047e64f6..e775ac7deb8 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -1426,10 +1426,15 @@ ParallelWorkerMain(Datum main_arg) fps->session_user_is_superuser); SetCurrentRoleId(fps->outer_user_id, fps->role_is_superuser); - /* Restore database connection. */ + /* + * Restore database connection. We skip connection authorization checks, + * reasoning that (a) the leader checked these things when it started, and + * (b) we do not want parallel mode to cause these failures, because that + * would make use of parallel query plans not transparent to applications. + */ BackgroundWorkerInitializeConnectionByOid(fps->database_id, fps->authenticated_user_id, - 0); + BGWORKER_BYPASS_ALLOWCONN); /* * Set the client encoding to the database encoding, since that is what diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index bca653e4856..95aa8be9c53 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -485,7 +485,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, proc->databaseId = databaseid; proc->roleId = owner; proc->tempNamespaceId = InvalidOid; - proc->isBackgroundWorker = false; + proc->isBackgroundWorker = true; proc->lwWaiting = LW_WS_NOT_WAITING; proc->lwWaitMode = 0; proc->waitLock = NULL; diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 7dd9345c617..7b1de98d404 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1702,12 +1702,14 @@ AutoVacWorkerMain(int argc, char *argv[]) pgstat_report_autovac(dbid); /* - * Connect to the selected database, specifying no particular user + * Connect to the selected database, specifying no particular user, + * and ignoring datallowconn. Collect the database's name for + * display. * * Note: if we have selected a just-deleted database (due to using * stale stats info), we'll fail and exit here. */ - InitPostgres(NULL, dbid, NULL, InvalidOid, false, false, + InitPostgres(NULL, dbid, NULL, InvalidOid, false, true, dbname); SetProcessingMode(NormalProcessing); set_ps_display(dbname); diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 316b4fa7197..e60c6750b8d 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -3571,8 +3571,7 @@ CountDBBackends(Oid databaseid) } /* - * CountDBConnections --- counts database backends ignoring any background - * worker processes + * CountDBConnections --- counts database backends (only regular backends) */ int CountDBConnections(Oid databaseid) @@ -3644,6 +3643,7 @@ CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending) /* * CountUserBackends --- count backends that are used by specified user + * (only regular backends, not any type of background worker) */ int CountUserBackends(Oid roleid) diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index e9e445bb216..2c990e50e74 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -385,7 +385,7 @@ InitProcess(void) MyProc->databaseId = InvalidOid; MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; - MyProc->isBackgroundWorker = IsBackgroundWorker; + MyProc->isBackgroundWorker = !AmRegularBackendProcess(); MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; /* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */ @@ -570,7 +570,7 @@ InitAuxiliaryProcess(void) MyProc->databaseId = InvalidOid; MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; - MyProc->isBackgroundWorker = IsBackgroundWorker; + MyProc->isBackgroundWorker = true; MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; MyProc->lwWaiting = LW_WS_NOT_WAITING; diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index fac79f7871a..af50892824f 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -766,6 +766,16 @@ InitializeSessionUserId(const char *rolename, Oid roleid) char *rname; bool is_superuser; + /* + * In a parallel worker, we don't have to do anything here. + * ParallelWorkerMain already set our output variables, and we aren't + * going to enforce either rolcanlogin or rolconnlimit. Furthermore, we + * don't really want to perform a catalog lookup for the role: we don't + * want to fail if it's been dropped. + */ + if (InitializingParallelWorker) + return; + /* * Don't do scans if we're bootstrapping, none of the system catalogs * exist yet, and they should be owned by postgres anyway. @@ -781,34 +791,22 @@ InitializeSessionUserId(const char *rolename, Oid roleid) /* * Look up the role, either by name if that's given or by OID if not. - * Normally we have to fail if we don't find it, but in parallel workers - * just return without doing anything: all the critical work has been done - * already. The upshot of that is that if the role has been deleted, we - * will not enforce its rolconnlimit against parallel workers anymore. */ if (rolename != NULL) { roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename)); if (!HeapTupleIsValid(roleTup)) - { - if (InitializingParallelWorker) - return; ereport(FATAL, (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), errmsg("role \"%s\" does not exist", rolename))); - } } else { roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid)); if (!HeapTupleIsValid(roleTup)) - { - if (InitializingParallelWorker) - return; ereport(FATAL, (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), errmsg("role with OID %u does not exist", roleid))); - } } rform = (Form_pg_authid) GETSTRUCT(roleTup); @@ -816,33 +814,29 @@ InitializeSessionUserId(const char *rolename, Oid roleid) rname = NameStr(rform->rolname); is_superuser = rform->rolsuper; - /* In a parallel worker, ParallelWorkerMain already set these variables */ - if (!InitializingParallelWorker) - { - SetAuthenticatedUserId(roleid, is_superuser); + SetAuthenticatedUserId(roleid, is_superuser); - /* - * Set SessionUserId and related variables, including "role", via the - * GUC mechanisms. - * - * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that - * session_authorization could subsequently be changed from - * pg_db_role_setting entries. Instead, session_authorization in - * pg_db_role_setting has no effect. Changing that would require - * solving two problems: - * - * 1. If pg_db_role_setting has values for both session_authorization - * and role, we could not be sure which order those would be applied - * in, and it would matter. - * - * 2. Sites may have years-old session_authorization entries. There's - * not been any particular reason to remove them. Ending the dormancy - * of those entries could seriously change application behavior, so - * only a major release should do that. - */ - SetConfigOption("session_authorization", rname, - PGC_BACKEND, PGC_S_OVERRIDE); - } + /* + * Set SessionUserId and related variables, including "role", via the GUC + * mechanisms. + * + * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that + * session_authorization could subsequently be changed from + * pg_db_role_setting entries. Instead, session_authorization in + * pg_db_role_setting has no effect. Changing that would require solving + * two problems: + * + * 1. If pg_db_role_setting has values for both session_authorization and + * role, we could not be sure which order those would be applied in, and + * it would matter. + * + * 2. Sites may have years-old session_authorization entries. There's not + * been any particular reason to remove them. Ending the dormancy of + * those entries could seriously change application behavior, so only a + * major release should do that. + */ + SetConfigOption("session_authorization", rname, + PGC_BACKEND, PGC_S_OVERRIDE); /* * These next checks are not enforced when in standalone mode, so that @@ -861,7 +855,9 @@ InitializeSessionUserId(const char *rolename, Oid roleid) rname))); /* - * Check connection limit for this role. + * Check connection limit for this role. We enforce the limit only + * for regular backends, since other process types have their own + * PGPROC pools. * * There is a race condition here --- we create our PGPROC before * checking for other PGPROCs. If two backends did this at about the @@ -871,6 +867,7 @@ InitializeSessionUserId(const char *rolename, Oid roleid) * just document that the connection limit is approximate. */ if (rform->rolconnlimit >= 0 && + AmRegularBackendProcess() && !is_superuser && CountUserBackends(roleid) > rform->rolconnlimit) ereport(FATAL, diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index b59838bfa35..35aa077a850 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -22,7 +22,6 @@ #include "access/genam.h" #include "access/heapam.h" #include "access/htup_details.h" -#include "access/parallel.h" #include "access/session.h" #include "access/sysattr.h" #include "access/tableam.h" @@ -342,13 +341,13 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * These checks are not enforced when in standalone mode, so that there is * a way to recover from disabling all access to all databases, for * example "UPDATE pg_database SET datallowconn = false;". - * - * We do not enforce them for autovacuum worker processes either. */ - if (IsUnderPostmaster && !IsAutoVacuumWorkerProcess()) + if (IsUnderPostmaster) { /* * Check that the database is currently allowing connections. + * (Background processes can override this test and the next one by + * setting override_allow_connections.) */ if (!dbform->datallowconn && !override_allow_connections) ereport(FATAL, @@ -361,7 +360,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * is redundant, but since we have the flag, might as well check it * and save a few cycles.) */ - if (!am_superuser && + if (!am_superuser && !override_allow_connections && object_aclcheck(DatabaseRelationId, MyDatabaseId, GetUserId(), ACL_CONNECT) != ACLCHECK_OK) ereport(FATAL, @@ -370,7 +369,9 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect errdetail("User does not have CONNECT privilege."))); /* - * Check connection limit for this database. + * Check connection limit for this database. We enforce the limit + * only for regular backends, since other process types have their own + * PGPROC pools. * * There is a race condition here --- we create our PGPROC before * checking for other PGPROCs. If two backends did this at about the @@ -380,6 +381,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * just document that the connection limit is approximate. */ if (dbform->datconnlimit >= 0 && + AmRegularBackendProcess() && !am_superuser && CountDBConnections(MyDatabaseId) > dbform->datconnlimit) ereport(FATAL, @@ -903,23 +905,7 @@ InitPostgres(const char *in_dbname, Oid dboid, else { InitializeSessionUserId(username, useroid); - - /* - * In a parallel worker, set am_superuser based on the - * authenticated user ID, not the current role. This is pretty - * dubious but it matches our historical behavior. Note that this - * value of am_superuser is used only for connection-privilege - * checks here and in CheckMyDatabase (we won't reach - * process_startup_options in a background worker). - * - * In other cases, there's been no opportunity for the current - * role to diverge from the authenticated user ID yet, so we can - * just rely on superuser() and avoid an extra catalog lookup. - */ - if (InitializingParallelWorker) - am_superuser = superuser_arg(GetAuthenticatedUserId()); - else - am_superuser = superuser(); + am_superuser = superuser(); } } else @@ -946,17 +932,16 @@ InitPostgres(const char *in_dbname, Oid dboid, } /* - * The last few connection slots are reserved for superusers and roles - * with privileges of pg_use_reserved_connections. Replication - * connections are drawn from slots reserved with max_wal_senders and are - * not limited by max_connections, superuser_reserved_connections, or - * reserved_connections. + * The last few regular connection slots are reserved for superusers and + * roles with privileges of pg_use_reserved_connections. We do not apply + * these limits to background processes, since they all have their own + * pools of PGPROC slots. * * Note: At this point, the new backend has already claimed a proc struct, * so we must check whether the number of free slots is strictly less than * the reserved connection limits. */ - if (!am_superuser && !am_walsender && + if (AmRegularBackendProcess() && !am_superuser && (SuperuserReservedConnections + ReservedConnections) > 0 && !HaveNFreeProcs(SuperuserReservedConnections + ReservedConnections, &nfree)) { diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 14b26f8f03c..2702731e062 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -345,6 +345,8 @@ typedef enum BackendType extern PGDLLIMPORT BackendType MyBackendType; +#define AmRegularBackendProcess() (MyBackendType == B_BACKEND) + extern const char *GetBackendTypeDesc(BackendType backendType); extern void SetDatabasePath(const char *path); diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index ef74f326932..ea3ca9c48a6 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -207,7 +207,7 @@ struct PGPROC Oid tempNamespaceId; /* OID of temp schema this backend is * using */ - bool isBackgroundWorker; /* true if background worker. */ + bool isBackgroundWorker; /* true if not a regular backend. */ /* * While in hot standby mode, shows that a conflict signal has been sent From 359f31c638eb7ccf0c049c9cd0f717a88b82681a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 30 Dec 2024 08:06:42 +0900 Subject: [PATCH 059/119] Fix handling of orphaned 2PC files in the future at recovery Before 728bd991c3c4, that has improved the support for 2PC files during recovery, the initial logic scanning files in pg_twophase was done so as files in the future of the transaction ID horizon were checked first, followed by a check if a transaction ID is aborted or committed which could involve a pg_xact lookup. After this commit, these checks have been done in reverse order. Files detected as in the future do not have a state that can be checked in pg_xact, hence this caused recovery to fail abruptly should an orphaned 2PC file in the future of the transaction ID horizon exist in pg_twophase at the beginning of recovery. A test is added to check for this scenario, using an empty 2PC with a transaction ID large enough to be in the future when running the test. This test is added in 16 and older versions for now. 17 and newer versions are impacted by a second bug caused by the addition of the epoch in the 2PC file names. An equivalent test will be added in these branches in a follow-up commit, once the second set of issues reported are fixed. Author: Vitaly Davydov, Michael Paquier Discussion: https://postgr.es/m/11e597-676ab680-8d-374f23c0@145466129 Backpatch-through: 13 --- src/backend/access/transam/twophase.c | 16 ++++++++-------- src/test/recovery/t/009_twophase.pl | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 95aa8be9c53..330d2a5c9ec 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -2183,40 +2183,40 @@ ProcessTwoPhaseBuffer(TransactionId xid, if (!fromdisk) Assert(prepare_start_lsn != InvalidXLogRecPtr); - /* Already processed? */ - if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid)) + /* Reject XID if too new */ + if (TransactionIdFollowsOrEquals(xid, origNextXid)) { if (fromdisk) { ereport(WARNING, - (errmsg("removing stale two-phase state file for transaction %u", + (errmsg("removing future two-phase state file for transaction %u", xid))); RemoveTwoPhaseFile(xid, true); } else { ereport(WARNING, - (errmsg("removing stale two-phase state from memory for transaction %u", + (errmsg("removing future two-phase state from memory for transaction %u", xid))); PrepareRedoRemove(xid, true); } return NULL; } - /* Reject XID if too new */ - if (TransactionIdFollowsOrEquals(xid, origNextXid)) + /* Already processed? */ + if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid)) { if (fromdisk) { ereport(WARNING, - (errmsg("removing future two-phase state file for transaction %u", + (errmsg("removing stale two-phase state file for transaction %u", xid))); RemoveTwoPhaseFile(xid, true); } else { ereport(WARNING, - (errmsg("removing future two-phase state from memory for transaction %u", + (errmsg("removing stale two-phase state from memory for transaction %u", xid))); PrepareRedoRemove(xid, true); } diff --git a/src/test/recovery/t/009_twophase.pl b/src/test/recovery/t/009_twophase.pl index fe7e8e79802..7642e4f0b3c 100644 --- a/src/test/recovery/t/009_twophase.pl +++ b/src/test/recovery/t/009_twophase.pl @@ -528,4 +528,27 @@ sub configure_and_reload qq{27|issued to paris}, "Check expected t_009_tbl2 data on standby"); +############################################################################### +# Check handling of orphaned 2PC files at recovery. +############################################################################### + +$cur_primary->teardown_node; + +# Grab location in logs of primary +my $log_offset = -s $cur_primary->logfile; + +# Create a fake file with a transaction ID large enough to be in the future, +# then check that the primary is able to start and remove this file at +# recovery. + +my $future_2pc_file = $cur_primary->data_dir . '/pg_twophase/00FFFFFF'; +append_to_file $future_2pc_file, ""; + +$cur_primary->start; +$cur_primary->log_check( + "future two-phase file removed at recovery", + $log_offset, + log_like => + [qr/removing future two-phase state file for transaction 16777215/]); + done_testing(); From e3a27fd06d06726546bccf22ac986c67f0e84dd5 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 30 Dec 2024 13:33:59 +0900 Subject: [PATCH 060/119] Fix memory leak in pgoutput with relation attribute map pgoutput caches the attribute map of a relation, that is free()'d only when validating a RelationSyncEntry. However, this code path is not taken when calling any of the SQL functions able to do some logical decoding, like pg_logical_slot_{get,peek}_changes(), leaking some memory into CacheMemoryContext on repeated calls. To address this, a relation's attribute map is allocated in PGOutputData's cachectx, free()'d at the end of the execution of these SQL functions when logical decoding ends. This is available down to 15. v13 and v14 have a similar leak, which will be dealt with later. Reported-by: Masahiko Sawada Author: Vignesh C Reviewed-by: Hou Zhijie Discussion: https://postgr.es/m/CAD21AoDkAhQVSukOfH3_reuF-j4EU0-HxMqU3dU+bSTxsqT14Q@mail.gmail.com Discussion: https://postgr.es/m/CALDaNm1hewNAsZ_e6FF52a=9drmkRJxtEPrzCB6-9mkJyeBBqA@mail.gmail.com Backpatch-through: 15 --- src/backend/replication/pgoutput/pgoutput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index c9ae239aa4e..32b74bb4752 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1179,8 +1179,8 @@ init_tuple_slot(PGOutputData *data, Relation relation, TupleDesc indesc = RelationGetDescr(relation); TupleDesc outdesc = RelationGetDescr(ancestor); - /* Map must live as long as the session does. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); + /* Map must live as long as the logical decoding context. */ + oldctx = MemoryContextSwitchTo(data->cachectx); entry->attrmap = build_attrmap_by_name_if_req(indesc, outdesc, false); From c4f8291cf00a9101a80e77f0efd70b4836a4ebae Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 1 Jan 2025 11:21:54 -0500 Subject: [PATCH 061/119] Update copyright for 2025 Backpatch-through: 13 --- COPYRIGHT | 2 +- doc/src/sgml/legal.sgml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index 16f9b46a3fe..be2d694b038 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,7 +1,7 @@ PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95) -Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group +Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group Portions Copyright (c) 1994, The Regents of the University of California diff --git a/doc/src/sgml/legal.sgml b/doc/src/sgml/legal.sgml index d6c77f3516b..af13bf2e055 100644 --- a/doc/src/sgml/legal.sgml +++ b/doc/src/sgml/legal.sgml @@ -1,9 +1,9 @@ -2024 +2025 - 1996–2024 + 1996–2025 The PostgreSQL Global Development Group @@ -11,7 +11,7 @@ Legal Notice - PostgreSQL is Copyright © 1996–2024 + PostgreSQL is Copyright © 1996–2025 by the PostgreSQL Global Development Group. From a1a9120c797d689be1dafd6fac8d956e3f667ba6 Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Thu, 2 Jan 2025 18:02:02 +0900 Subject: [PATCH 062/119] Ignore nullingrels when looking up statistics When looking up statistical data about an expression, we do not need to concern ourselves with the outer joins that could null the Vars/PHVs contained in the expression. Accounting for nullingrels in the expression could cause estimate_num_groups to count the same Var multiple times if it's marked with different nullingrels. This is incorrect, and could lead to "ERROR: corrupt MVNDistinct entry" when searching for multivariate n-distinct. Furthermore, the nullingrels could prevent us from matching an expression to expressional index columns or to the expressions in extended statistics, leading to inaccurate estimates. To fix, strip out all the nullingrels from the expression before we look up statistical data about it. There is one ensuing plan change in the regression tests, but it looks reasonable and does not compromise its original purpose. This patch could result in plan changes, but it fixes an actual bug, so back-patch to v16 where the outer-join-aware-Var infrastructure was introduced. Author: Richard Guo Discussion: https://postgr.es/m/CAMbWs4-2Z4k+nFTiZe0Qbu5n8juUWenDAtMzi98bAZQtwHx0-w@mail.gmail.com --- src/backend/utils/adt/selfuncs.c | 28 +++++++++++++++++++++++++--- src/test/regress/expected/join.out | 26 ++++++++++++++++++++++++-- src/test/regress/sql/join.sql | 13 +++++++++++++ 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index c4fcd0076ea..771781e28ca 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -120,6 +120,7 @@ #include "optimizer/plancat.h" #include "parser/parse_clause.h" #include "parser/parsetree.h" +#include "rewrite/rewriteManip.h" #include "statistics/statistics.h" #include "storage/bufmgr.h" #include "utils/acl.h" @@ -3273,6 +3274,15 @@ add_unique_group_var(PlannerInfo *root, List *varinfos, ndistinct = get_variable_numdistinct(vardata, &isdefault); + /* + * The nullingrels bits within the var could cause the same var to be + * counted multiple times if it's marked with different nullingrels. They + * could also prevent us from matching the var to the expressions in + * extended statistics (see estimate_multivariate_ndistinct). So strip + * them out first. + */ + var = remove_nulling_relids(var, root->outer_join_rels, NULL); + foreach(lc, varinfos) { varinfo = (GroupVarInfo *) lfirst(lc); @@ -4980,6 +4990,7 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, { Node *basenode; Relids varnos; + Relids basevarnos; RelOptInfo *onerel; /* Make sure we don't return dangling pointers in vardata */ @@ -5021,10 +5032,11 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, * relation are considered "real" vars. */ varnos = pull_varnos(root, basenode); + basevarnos = bms_difference(varnos, root->outer_join_rels); onerel = NULL; - switch (bms_membership(varnos)) + switch (bms_membership(basevarnos)) { case BMS_EMPTY_SET: /* No Vars at all ... must be pseudo-constant clause */ @@ -5033,7 +5045,7 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, if (varRelid == 0 || bms_is_member(varRelid, varnos)) { onerel = find_base_rel(root, - (varRelid ? varRelid : bms_singleton_member(varnos))); + (varRelid ? varRelid : bms_singleton_member(basevarnos))); vardata->rel = onerel; node = basenode; /* strip any relabeling */ } @@ -5057,7 +5069,7 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, break; } - bms_free(varnos); + bms_free(basevarnos); vardata->var = node; vardata->atttype = exprType(node); @@ -5082,6 +5094,14 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, ListCell *slist; Oid userid; + /* + * The nullingrels bits within the expression could prevent us from + * matching it to expressional index columns or to the expressions in + * extended statistics. So strip them out first. + */ + 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 @@ -5352,6 +5372,8 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, } } } + + bms_free(varnos); } /* diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 9af8d61a732..84e35981ed8 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -2517,10 +2517,11 @@ where t1.f1 = coalesce(t2.f1, 1); -> Materialize -> Seq Scan on int4_tbl t2 Filter: (f1 > 1) - -> Seq Scan on int4_tbl t3 + -> Materialize + -> Seq Scan on int4_tbl t3 -> Materialize -> Seq Scan on int4_tbl t4 -(13 rows) +(14 rows) explain (costs off) select * from int4_tbl t1 @@ -7981,3 +7982,24 @@ where exists (select 1 from j3 (13 rows) drop table j3; +-- Test that we do not account for nullingrels when looking up statistics +CREATE TABLE group_tbl (a INT, b INT); +INSERT INTO group_tbl SELECT 1, 1; +CREATE STATISTICS group_tbl_stat (ndistinct) ON a, b FROM group_tbl; +ANALYZE group_tbl; +EXPLAIN (COSTS OFF) +SELECT 1 FROM group_tbl t1 + LEFT JOIN (SELECT a c1, COALESCE(a) c2 FROM group_tbl t2) s ON TRUE +GROUP BY s.c1, s.c2; + QUERY PLAN +-------------------------------------------- + Group + Group Key: t2.a, (COALESCE(t2.a)) + -> Sort + Sort Key: t2.a, (COALESCE(t2.a)) + -> Nested Loop Left Join + -> Seq Scan on group_tbl t1 + -> Seq Scan on group_tbl t2 +(7 rows) + +DROP TABLE group_tbl; diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 41949d41dd6..d6f646a1d50 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -2928,3 +2928,16 @@ where exists (select 1 from j3 and t1.unique1 < 1; drop table j3; + +-- Test that we do not account for nullingrels when looking up statistics +CREATE TABLE group_tbl (a INT, b INT); +INSERT INTO group_tbl SELECT 1, 1; +CREATE STATISTICS group_tbl_stat (ndistinct) ON a, b FROM group_tbl; +ANALYZE group_tbl; + +EXPLAIN (COSTS OFF) +SELECT 1 FROM group_tbl t1 + LEFT JOIN (SELECT a c1, COALESCE(a) c2 FROM group_tbl t2) s ON TRUE +GROUP BY s.c1, s.c2; + +DROP TABLE group_tbl; From 653729ce0ec1c38b444740637896d6ec706ef13a Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Fri, 3 Jan 2025 09:23:46 -0500 Subject: [PATCH 063/119] Document strange jsonb sort order for empty top level arrays Slightly faulty logic in the original jsonb code (commit d9134d0a355) results in an empty top level array sorting less than a json null. We can't change the sort order now since it would affect btree indexes over jsonb, so document the anomaly. Backpatch to all live branches (13 .. 17) In master, also add a code comment noting the anomaly. Reported-by: Yan Chengpen Reviewed-by: Jian He Discussion: https://postgr.es/m/OSBPR01MB45199DD8DA2D1CECD50518188E272@OSBPR01MB4519.jpnprd01.prod.outlook.com --- doc/src/sgml/json.sgml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml index 3836bf5acf3..78b56f86907 100644 --- a/doc/src/sgml/json.sgml +++ b/doc/src/sgml/json.sgml @@ -584,12 +584,13 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"'; The btree ordering for jsonb datums is seldom of great interest, but for completeness it is: -Object > Array > Boolean > Number > String > Null +Object > Array > Boolean > Number > String > null Object with n pairs > object with n - 1 pairs Array with n elements > array with n - 1 elements + with the exception that (for historical reasons) an empty top level array sorts less than null. Objects with equal numbers of pairs are compared in the order: key-1, value-1, key-2 ... From c957d7444fccb3c61b5f00908ef91aba012c683b Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 8 Jan 2025 07:50:30 +1300 Subject: [PATCH 064/119] Restore smgrtruncate() prototype in back-branches. It's possible that external code is calling smgrtruncate(). Any external callers might like to consider the recent changes to RelationTruncate(), but commit 38c579b0 should not have changed the function prototype in the back-branches, per ABI stability policy. Restore smgrtruncate()'s traditional argument list in the back-branches, but make it a wrapper for a new function smgrtruncate2(). The three callers in core can use smgrtruncate2() directly. In master (18-to-be), smgrtruncate2() is effectively renamed to smgrtruncate(), so this wart is cleaned up. Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/CA%2BhUKG%2BThae6x6%2BjmQiuALQBT2Ae1ChjMh1%3DkMvJ8y_SBJZrvA%40mail.gmail.com --- contrib/pg_visibility/pg_visibility.c | 2 +- src/backend/catalog/storage.c | 4 ++-- src/backend/storage/smgr/smgr.c | 24 ++++++++++++++++++++++-- src/include/storage/smgr.h | 4 +++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c index 8c2a493ad2e..e6ae90c1cac 100644 --- a/contrib/pg_visibility/pg_visibility.c +++ b/contrib/pg_visibility/pg_visibility.c @@ -421,7 +421,7 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) } if (BlockNumberIsValid(block)) - smgrtruncate(RelationGetSmgr(rel), &fork, 1, &old_block, &block); + smgrtruncate2(RelationGetSmgr(rel), &fork, 1, &old_block, &block); END_CRIT_SECTION(); MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 740c6f4d921..56dc9469843 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -417,7 +417,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * longer exist after truncation is complete, and then truncate the * corresponding files on disk. */ - smgrtruncate(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks); + smgrtruncate2(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks); END_CRIT_SECTION(); @@ -1077,7 +1077,7 @@ smgr_redo(XLogReaderState *record) if (nforks > 0) { START_CRIT_SECTION(); - smgrtruncate(reln, forks, nforks, old_blocks, blocks); + smgrtruncate2(reln, forks, nforks, old_blocks, blocks); END_CRIT_SECTION(); } diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 7b5d6754bb9..152545c3020 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -647,6 +647,26 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum) * smgrtruncate() -- Truncate the given forks of supplied relation to * each specified numbers of blocks * + * Backward-compatible version of smgrtruncate2() for the benefit of external + * callers. This version isn't used in PostgreSQL core code, and can't be + * used in a critical section. + */ +void +smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *nblocks) +{ + BlockNumber old_nblocks[MAX_FORKNUM + 1]; + + for (int i = 0; i < nforks; ++i) + old_nblocks[i] = smgrnblocks(reln, forknum[i]); + + return smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks); +} + +/* + * smgrtruncate2() -- Truncate the given forks of supplied relation to + * each specified numbers of blocks + * * The truncation is done immediately, so this can't be rolled back. * * The caller must hold AccessExclusiveLock on the relation, to ensure that @@ -658,8 +678,8 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum) * to this relation should be called in between. */ void -smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, - BlockNumber *old_nblocks, BlockNumber *nblocks) +smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, BlockNumber *nblocks) { int i; diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 8b1157541af..b9a5b992f35 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -105,8 +105,10 @@ extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum, extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum); extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum); extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, - BlockNumber *old_nblocks, BlockNumber *nblocks); +extern void smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, + BlockNumber *nblocks); extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); extern void AtEOXact_SMgr(void); extern bool ProcessBarrierSmgrRelease(void); From 9defaaa1da60372f687e707c20c12aea713e1741 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 8 Jan 2025 16:54:45 +1300 Subject: [PATCH 065/119] Fix C error reported by Oracle compiler. Commit 66aaabe7 (branches 13 - 17 only) was not acceptable to the Oracle Developer Studio compiler on build farm animal wrasse. It accidentally used a C++ style return statement to wrap a void function. None of the usual compilers complained, but it is right, that is not allowed in C. Fix. Reported-by: Michael Paquier Discussion: https://postgr.es/m/Z33vgfVgvOnbFLN9%40paquier.xyz --- src/backend/storage/smgr/smgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 152545c3020..f203c2e9efb 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -660,7 +660,7 @@ smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, for (int i = 0; i < nforks; ++i) old_nblocks[i] = smgrnblocks(reln, forknum[i]); - return smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks); + smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks); } /* From 0bff6f1da8424efe1ce9a78d9bb2fdd91fdba651 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 9 Jan 2025 12:10:26 +1300 Subject: [PATCH 066/119] Provide 64-bit ftruncate() and lseek() on Windows. Change our ftruncate() macro to use the 64-bit variant of chsize(), and add a new macro to redirect lseek() to _lseeki64(). Back-patch to all supported releases, in preparation for a bug fix. Tested-by: Davinder Singh Discussion: https://postgr.es/m/CAKZiRmyM4YnokK6Oenw5JKwAQ3rhP0YTz2T-tiw5dAQjGRXE3Q%40mail.gmail.com --- src/include/port.h | 27 +++++++++++++++++++++++++++ src/include/port/win32_port.h | 2 -- src/pl/plperl/plperl_system.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/include/port.h b/src/include/port.h index a88d403483e..d03596a53f1 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -306,6 +306,33 @@ extern bool rmtree(const char *path, bool rmtopdir); #if defined(WIN32) && !defined(__CYGWIN__) +/* + * We want the 64-bit variant of lseek(). + * + * For Visual Studio, this must be after to avoid messing up its + * lseek() and _lseeki64() function declarations. + * + * For MinGW there is already a macro, so we have to undefine it (depending on + * _FILE_OFFSET_BITS, it may point at its own lseek64, but we don't want to + * count on that being set). + */ +#undef lseek +#define lseek(a,b,c) _lseeki64((a),(b),(c)) + +/* + * We want the 64-bit variant of chsize(). It sets errno and also returns it, + * so convert non-zero result to -1 to match POSIX. + * + * Prevent MinGW from declaring functions, and undefine its macro before we + * define our own. + */ +#ifndef _MSC_VER +#define FTRUNCATE_DEFINED +#include +#undef ftruncate +#endif +#define ftruncate(a,b) (_chsize_s((a),(b)) == 0 ? 0 : -1) + /* * open() and fopen() replacements to allow deletion of open files and * passing of other special options. diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h index b957d5c5981..fe9253d9b1f 100644 --- a/src/include/port/win32_port.h +++ b/src/include/port/win32_port.h @@ -79,8 +79,6 @@ /* Must be here to avoid conflicting with prototype in windows.h */ #define mkdir(a,b) mkdir(a) -#define ftruncate(a,b) chsize(a,b) - /* Windows doesn't have fsync() as such, use _commit() */ #define fsync(fd) _commit(fd) diff --git a/src/pl/plperl/plperl_system.h b/src/pl/plperl/plperl_system.h index 61550db2a5d..96cb217d104 100644 --- a/src/pl/plperl/plperl_system.h +++ b/src/pl/plperl/plperl_system.h @@ -109,6 +109,7 @@ #undef fstat #undef kill #undef listen +#undef lseek #undef lstat #undef mkdir #undef open From be7489662e7759de7a8338d3e65cd6a22dfa4976 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 9 Jan 2025 13:17:36 +1300 Subject: [PATCH 067/119] Fix off_t overflow in pg_basebackup on Windows. walmethods.c used off_t to navigate around a pg_wal.tar file that could exceed 2GB, which doesn't work on Windows and would fail with misleading errors. Use pgoff_t instead. Back-patch to all supported branches. Author: Davinder Singh Reported-by: Jakub Wartak Discussion: https://postgr.es/m/CAKZiRmyM4YnokK6Oenw5JKwAQ3rhP0YTz2T-tiw5dAQjGRXE3Q%40mail.gmail.com --- src/bin/pg_basebackup/receivelog.c | 2 +- src/bin/pg_basebackup/walmethods.c | 2 +- src/bin/pg_basebackup/walmethods.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index 504d82bef67..e69ad912a25 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -192,7 +192,7 @@ static bool close_walfile(StreamCtl *stream, XLogRecPtr pos) { char *fn; - off_t currpos; + pgoff_t currpos; int r; char walfile_name[MAXPGPATH]; diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 376ddf72b71..f21883d30d6 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -686,7 +686,7 @@ const WalWriteMethodOps WalTarMethodOps = { typedef struct TarMethodFile { Walfile base; - off_t ofs_start; /* Where does the *header* for this file start */ + pgoff_t ofs_start; /* Where does the *header* for this file start */ char header[TAR_BLOCK_SIZE]; size_t pad_to_size; } TarMethodFile; diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h index 54a22fe6070..1ebdd360e64 100644 --- a/src/bin/pg_basebackup/walmethods.h +++ b/src/bin/pg_basebackup/walmethods.h @@ -17,7 +17,7 @@ typedef struct WalWriteMethod WalWriteMethod; typedef struct { WalWriteMethod *wwmethod; - off_t currpos; + pgoff_t currpos; char *pathname; /* From 0b5927dfac26a620b0bed53d8955e68a134db452 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Thu, 9 Jan 2025 17:10:13 -0600 Subject: [PATCH 068/119] Fix an ALTER GROUP ... DROP USER error message. This error message stated the privileges required to add a member to a group even if the user was trying to drop a member: postgres=> alter group a drop user b; ERROR: permission denied to alter role DETAIL: Only roles with the ADMIN option on role "a" may add members. Since the required privileges for both operations are the same, we can fix this by modifying the message to mention both adding and dropping members: postgres=> alter group a drop user b; ERROR: permission denied to alter role DETAIL: Only roles with the ADMIN option on role "a" may add or drop members. Author: ChangAo Chen Reviewed-by: Tom Lane Discussion: https://postgr.es/m/tencent_FAA0D00E3514AAF0BBB6322542A6094FEF05%40qq.com Backpatch-through: 16 --- src/backend/commands/user.c | 4 ++-- src/test/regress/expected/privileges.out | 7 +++++++ src/test/regress/sql/privileges.sql | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 02824c32a49..1da3719af30 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -818,12 +818,12 @@ AlterRole(ParseState *pstate, AlterRoleStmt *stmt) "BYPASSRLS", "BYPASSRLS"))); } - /* To add members to a role, you need ADMIN OPTION. */ + /* To add or drop members, you need ADMIN OPTION. */ if (drolemembers && !is_admin_of_role(currentUserId, roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied to alter role"), - errdetail("Only roles with the %s option on role \"%s\" may add members.", + errdetail("Only roles with the %s option on role \"%s\" may add or drop members.", "ADMIN", rolename))); /* Convert validuntil to internal form */ diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 5b9dba7b321..620fbe8c522 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -216,6 +216,13 @@ CREATE GROUP regress_priv_group1; CREATE GROUP regress_priv_group2 WITH ADMIN regress_priv_user1 USER regress_priv_user2; ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; GRANT regress_priv_group2 TO regress_priv_user2 GRANTED BY regress_priv_user1; +SET SESSION AUTHORIZATION regress_priv_user3; +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- fail +ERROR: permission denied to alter role +DETAIL: Only roles with the ADMIN option on role "regress_priv_group2" may add or drop members. +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; -- fail +ERROR: permission denied to alter role +DETAIL: Only roles with the ADMIN option on role "regress_priv_group2" may add or drop members. SET SESSION AUTHORIZATION regress_priv_user1; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; NOTICE: role "regress_priv_user2" has already been granted membership in role "regress_priv_group2" by role "regress_priv_user1" diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 249df17a589..259f1aedd1b 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -169,6 +169,9 @@ CREATE GROUP regress_priv_group2 WITH ADMIN regress_priv_user1 USER regress_priv ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; GRANT regress_priv_group2 TO regress_priv_user2 GRANTED BY regress_priv_user1; +SET SESSION AUTHORIZATION regress_priv_user3; +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- fail +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; -- fail SET SESSION AUTHORIZATION regress_priv_user1; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- duplicate From c35bbdfbc0d30fee6037b7859501b68b28d68c34 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 10 Jan 2025 22:02:58 +0100 Subject: [PATCH 069/119] Fix missing ldapscheme option in pg_hba_file_rules() The ldapscheme option was missed when inspecing the HbaLine for assembling rows for the pg_hba_file_rules function. Backpatch to all supported versions. Author: Laurenz Albe Reported-by: Laurenz Albe Reviewed-by: Daniel Gustafsson Bug: 18769 Discussion: https://postgr.es/m/18769-dd8610cbc0405172@postgresql.org Backpatch-through: v13 --- src/backend/utils/adt/hbafuncs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c index 73d3ad1dadc..053221814e0 100644 --- a/src/backend/utils/adt/hbafuncs.c +++ b/src/backend/utils/adt/hbafuncs.c @@ -90,6 +90,10 @@ get_hba_options(HbaLine *hba) options[noptions++] = CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport)); + if (hba->ldapscheme) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapscheme=%s", hba->ldapscheme)); + if (hba->ldaptls) options[noptions++] = CStringGetTextDatum("ldaptls=true"); From 33a4e656dc10b3cb9023bccdc0a12dc604613195 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 11 Jan 2025 11:45:56 -0500 Subject: [PATCH 070/119] Repair memory leaks in plpython. PLy_spi_execute_plan (PLyPlan.execute) and PLy_cursor_plan (plpy.cursor) use PLy_output_convert to convert Python values into Datums that can be passed to the query-to-execute. But they failed to pay much attention to its warning that it can leave "cruft generated along the way" behind. Repeated use of these methods can result in a substantial memory leak for the duration of the calling plpython function. To fix, make a temporary memory context to invoke PLy_output_convert in. This also lets us get rid of the rather fragile code that was here for retail pfree's of the converted Datums. Indeed, we don't need the PLyPlanObject.values field anymore at all, though I left it in place in the back branches in the name of ABI stability. Mat Arye and Tom Lane, per report from Mat Arye. Back-patch to all supported branches. Discussion: https://postgr.es/m/CADsUR0DvVgnZYWwnmKRK65MZg7YLUSTDLV61qdnrwtrAJgU6xw@mail.gmail.com --- src/pl/plpython/plpy_cursorobject.c | 52 ++++++++++++-------------- src/pl/plpython/plpy_spi.c | 58 +++++++++++++---------------- 2 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c index 57e8f8ec217..551dea75b5e 100644 --- a/src/pl/plpython/plpy_cursorobject.c +++ b/src/pl/plpython/plpy_cursorobject.c @@ -142,7 +142,6 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) { PLyCursorObject *cursor; volatile int nargs; - int i; PLyPlanObject *plan; PLyExecutionContext *exec_ctx = PLy_current_execution_context(); volatile MemoryContext oldcontext; @@ -201,13 +200,30 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PG_TRY(); { Portal portal; + MemoryContext tmpcontext; + Datum *volatile values; char *volatile nulls; volatile int j; + /* + * Converted arguments and associated cruft will be in this context, + * which is local to our subtransaction. + */ + tmpcontext = AllocSetContextCreate(CurTransactionContext, + "PL/Python temporary context", + ALLOCSET_SMALL_SIZES); + MemoryContextSwitchTo(tmpcontext); + if (nargs > 0) - nulls = palloc(nargs * sizeof(char)); + { + values = (Datum *) palloc(nargs * sizeof(Datum)); + nulls = (char *) palloc(nargs * sizeof(char)); + } else + { + values = NULL; nulls = NULL; + } for (j = 0; j < nargs; j++) { @@ -219,7 +235,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) { bool isnull; - plan->values[j] = PLy_output_convert(arg, elem, &isnull); + values[j] = PLy_output_convert(arg, elem, &isnull); nulls[j] = isnull ? 'n' : ' '; } PG_FINALLY(2); @@ -229,7 +245,9 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PG_END_TRY(2); } - portal = SPI_cursor_open(NULL, plan->plan, plan->values, nulls, + MemoryContextSwitchTo(oldcontext); + + portal = SPI_cursor_open(NULL, plan->plan, values, nulls, exec_ctx->curr_proc->fn_readonly); if (portal == NULL) elog(ERROR, "SPI_cursor_open() failed: %s", @@ -239,40 +257,18 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PinPortal(portal); + MemoryContextDelete(tmpcontext); PLy_spi_subtransaction_commit(oldcontext, oldowner); } PG_CATCH(); { - int k; - - /* cleanup plan->values array */ - for (k = 0; k < nargs; k++) - { - if (!plan->args[k].typbyval && - (plan->values[k] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[k])); - plan->values[k] = PointerGetDatum(NULL); - } - } - Py_DECREF(cursor); - + /* Subtransaction abort will remove the tmpcontext */ PLy_spi_subtransaction_abort(oldcontext, oldowner); return NULL; } PG_END_TRY(); - for (i = 0; i < nargs; i++) - { - if (!plan->args[i].typbyval && - (plan->values[i] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[i])); - plan->values[i] = PointerGetDatum(NULL); - } - } - Assert(cursor->portalname != NULL); return (PyObject *) cursor; } diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index ff87b27de09..d3ac35d66ae 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -175,8 +175,7 @@ PyObject * PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) { volatile int nargs; - int i, - rv; + int rv; PLyPlanObject *plan; volatile MemoryContext oldcontext; volatile ResourceOwner oldowner; @@ -222,13 +221,30 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) PG_TRY(); { PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + MemoryContext tmpcontext; + Datum *volatile values; char *volatile nulls; volatile int j; + /* + * Converted arguments and associated cruft will be in this context, + * which is local to our subtransaction. + */ + tmpcontext = AllocSetContextCreate(CurTransactionContext, + "PL/Python temporary context", + ALLOCSET_SMALL_SIZES); + MemoryContextSwitchTo(tmpcontext); + if (nargs > 0) - nulls = palloc(nargs * sizeof(char)); + { + values = (Datum *) palloc(nargs * sizeof(Datum)); + nulls = (char *) palloc(nargs * sizeof(char)); + } else + { + values = NULL; nulls = NULL; + } for (j = 0; j < nargs; j++) { @@ -240,7 +256,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) { bool isnull; - plan->values[j] = PLy_output_convert(arg, elem, &isnull); + values[j] = PLy_output_convert(arg, elem, &isnull); nulls[j] = isnull ? 'n' : ' '; } PG_FINALLY(2); @@ -250,47 +266,23 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) PG_END_TRY(2); } - rv = SPI_execute_plan(plan->plan, plan->values, nulls, + MemoryContextSwitchTo(oldcontext); + + rv = SPI_execute_plan(plan->plan, values, nulls, exec_ctx->curr_proc->fn_readonly, limit); ret = PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv); - if (nargs > 0) - pfree(nulls); - + MemoryContextDelete(tmpcontext); PLy_spi_subtransaction_commit(oldcontext, oldowner); } PG_CATCH(); { - int k; - - /* - * cleanup plan->values array - */ - for (k = 0; k < nargs; k++) - { - if (!plan->args[k].typbyval && - (plan->values[k] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[k])); - plan->values[k] = PointerGetDatum(NULL); - } - } - + /* Subtransaction abort will remove the tmpcontext */ PLy_spi_subtransaction_abort(oldcontext, oldowner); return NULL; } PG_END_TRY(); - for (i = 0; i < nargs; i++) - { - if (!plan->args[i].typbyval && - (plan->values[i] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[i])); - plan->values[i] = PointerGetDatum(NULL); - } - } - if (rv < 0) { PLy_exception_set(PLy_exc_spi_error, From 77763f3bef482f575fd51190f27f38d3bc5ba42a Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Sun, 12 Jan 2025 12:58:14 +0000 Subject: [PATCH 071/119] Fix XMLTABLE() deparsing to quote namespace names if necessary. When deparsing an XMLTABLE() expression, XML namespace names were not quoted. However, since they are parsed as ColLabel tokens, some names require double quotes to ensure that they are properly interpreted. Fix by using quote_identifier() in the deparsing code. Back-patch to all supported versions. Dean Rasheed, reviewed by Tom Lane. Discussion: https://postgr.es/m/CAEZATCXTpAS%3DncfLNTZ7YS6O5puHeLg_SUYAit%2Bcs7wsrd9Msg%40mail.gmail.com --- src/backend/utils/adt/ruleutils.c | 3 ++- src/test/regress/expected/xml.out | 10 +++++++--- src/test/regress/expected/xml_1.out | 8 +++++--- src/test/regress/expected/xml_2.out | 10 +++++++--- src/test/regress/sql/xml.sql | 8 +++++--- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 615ed1f410e..d9a61be8109 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -11181,7 +11181,8 @@ get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) if (ns_node != NULL) { get_rule_expr(expr, context, showimplicit); - appendStringInfo(buf, " AS %s", strVal(ns_node)); + appendStringInfo(buf, " AS %s", + quote_identifier(strVal(ns_node))); } else { diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 894ee6bd2b7..fba881f10be 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -1379,16 +1379,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), 10 (1 row) -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; a ---- 10 (1 row) +\sv xmltableview2 +CREATE OR REPLACE VIEW public.xmltableview2 AS + SELECT a + FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('10'::xml) COLUMNS a integer PATH ('Zz:a'::text)) SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 7e9611f1d38..2aa7ed73c23 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -1046,10 +1046,10 @@ ERROR: unsupported XML feature LINE 3: PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); ERROR: unsupported XML feature LINE 3: PASSING '10' diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out index 7d5c961e240..25ac0c1b909 100644 --- a/src/test/regress/expected/xml_2.out +++ b/src/test/regress/expected/xml_2.out @@ -1365,16 +1365,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), 10 (1 row) -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; a ---- 10 (1 row) +\sv xmltableview2 +CREATE OR REPLACE VIEW public.xmltableview2 AS + SELECT a + FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('10'::xml) COLUMNS a integer PATH ('Zz:a'::text)) SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index 0b07075414e..7f891ac982a 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -439,13 +439,15 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), PASSING '10' COLUMNS a int PATH 'zz:a'); -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; +\sv xmltableview2 + SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' From 116036d811cccacfb9eedb4f6261c9ecddcebcf3 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Sun, 12 Jan 2025 23:44:39 +0100 Subject: [PATCH 072/119] Fix HBA option count Commit 27a1f8d108 missed updating the max HBA option count to account for the new option added. Fix by bumping the counter and adjust the relevant comment to match. Backpatch down to all supported branches like the erroneous commit. Reported-by: Tom Lane Discussion: https://postgr.es/m/286764.1736697356@sss.pgh.pa.us Backpatch-through: v13 --- src/backend/utils/adt/hbafuncs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c index 053221814e0..ce1e2921ab3 100644 --- a/src/backend/utils/adt/hbafuncs.c +++ b/src/backend/utils/adt/hbafuncs.c @@ -38,12 +38,12 @@ static void fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); /* * This macro specifies the maximum number of authentication options * that are possible with any given authentication method that is supported. - * Currently LDAP supports 11, and there are 3 that are not dependent on + * Currently LDAP supports 12, and there are 3 that are not dependent on * the auth method here. It may not actually be possible to set all of them * at the same time, but we'll set the macro value high enough to be * conservative and avoid warnings from static analysis tools. */ -#define MAX_HBA_OPTIONS 14 +#define MAX_HBA_OPTIONS 15 /* * Create a text array listing the options specified in the HBA line. From bfda7d8dd6b392c5d55bfb032aa7848b20227e12 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 14 Jan 2025 15:13:15 +0900 Subject: [PATCH 073/119] Fix potential integer overflow in bringetbitmap() This function expects an "int64" as result and stores the number of pages to add to the index scan bitmap as an "int", multiplying its final result by 10. For a relation large enough, this can theoretically overflow if counting more than (INT32_MAX / 10) pages, knowing that the number of pages is upper-bounded by MaxBlockNumber. To avoid the overflow, this commit redefines "totalpages", used to calculate the result, to be an "int64" rather than an "int". Reported-by: Evgeniy Gorbanyov Author: James Hunter Discussion: https://www.postgresql.org/message-id/07704817-6fa0-460c-b1cf-cd18f7647041@basealt.ru Backpatch-through: 13 --- src/backend/access/brin/brin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index a257903991d..d69d0fdf09a 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -363,7 +363,7 @@ bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm) BrinOpaque *opaque; BlockNumber nblocks; BlockNumber heapBlk; - int totalpages = 0; + int64 totalpages = 0; FmgrInfo *consistentFn; MemoryContext oldcxt; MemoryContext perRangeCxt; From 91fc447c21d38f6631480ae6f252dbf4211b10b2 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 14 Jan 2025 14:28:49 +0200 Subject: [PATCH 074/119] Fix catcache invalidation of a list entry that's being built If a new catalog tuple is inserted that belongs to a catcache list entry, and cache invalidation happens while the list entry is being built, the list entry might miss the newly inserted tuple. To fix, change the way we detect concurrent invalidations while a catcache entry is being built. Keep a stack of entries that are being built, and apply cache invalidation to those entries in addition to the real catcache entries. This is similar to the in-progress list in relcache.c. Back-patch to all supported versions. Reviewed-by: Noah Misch Discussion: https://www.postgresql.org/message-id/2234dc98-06fe-42ed-b5db-ac17384dc880@iki.fi --- src/backend/utils/cache/catcache.c | 231 ++++++++++++++++++----------- src/backend/utils/cache/inval.c | 2 +- src/include/utils/catcache.h | 1 + src/tools/pgindent/typedefs.list | 1 + 4 files changed, 148 insertions(+), 87 deletions(-) diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 000e81a2d96..d3527cbe3f3 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -41,6 +41,24 @@ #include "utils/resowner_private.h" #include "utils/syscache.h" +/* + * If a catcache invalidation is processed while we are in the middle of + * creating a catcache entry (or list), it might apply to the entry we're + * creating, making it invalid before it's been inserted to the catcache. To + * catch such cases, we have a stack of "create-in-progress" entries. Cache + * invalidation marks any matching entries in the stack as dead, in addition + * to the actual CatCTup and CatCList entries. + */ +typedef struct CatCInProgress +{ + CatCache *cache; /* cache that the entry belongs to */ + uint32 hash_value; /* hash of the entry; ignored for lists */ + bool list; /* is it a list entry? */ + bool dead; /* set when the entry is invalidated */ + struct CatCInProgress *next; +} CatCInProgress; + +static CatCInProgress *catcache_in_progress_stack = NULL; /* #define CACHEDEBUG */ /* turns DEBUG elogs on */ @@ -93,8 +111,7 @@ static void CatCacheRemoveCList(CatCache *cache, CatCList *cl); static void RehashCatCache(CatCache *cp); static void RehashCatCacheLists(CatCache *cp); static void CatalogCacheInitializeCache(CatCache *cache); -static CatCTup *CatalogCacheCreateEntry(CatCache *cache, - HeapTuple ntp, SysScanDesc scandesc, +static CatCTup *CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, uint32 hashValue, Index hashIndex); @@ -610,6 +627,16 @@ CatCacheInvalidate(CatCache *cache, uint32 hashValue) /* could be multiple matches, so keep looking! */ } } + + /* Also invalidate any entries that are being built */ + for (CatCInProgress *e = catcache_in_progress_stack; e != NULL; e = e->next) + { + if (e->cache == cache) + { + if (e->list || e->hash_value == hashValue) + e->dead = true; + } + } } /* ---------------------------------------------------------------- @@ -646,9 +673,15 @@ CreateCacheMemoryContext(void) * * This is not very efficient if the target cache is nearly empty. * However, it shouldn't need to be efficient; we don't invoke it often. + * + * If 'debug_discard' is true, we are being called as part of + * debug_discard_caches. In that case, the cache is not reset for + * correctness, but just to get more testing of cache invalidation. We skip + * resetting in-progress build entries in that case, or we'd never make any + * progress. */ static void -ResetCatalogCache(CatCache *cache) +ResetCatalogCache(CatCache *cache, bool debug_discard) { dlist_mutable_iter iter; int i; @@ -692,6 +725,16 @@ ResetCatalogCache(CatCache *cache) #endif } } + + /* Also invalidate any entries that are being built */ + if (!debug_discard) + { + for (CatCInProgress *e = catcache_in_progress_stack; e != NULL; e = e->next) + { + if (e->cache == cache) + e->dead = true; + } + } } /* @@ -701,6 +744,12 @@ ResetCatalogCache(CatCache *cache) */ void ResetCatalogCaches(void) +{ + ResetCatalogCachesExt(false); +} + +void +ResetCatalogCachesExt(bool debug_discard) { slist_iter iter; @@ -710,7 +759,7 @@ ResetCatalogCaches(void) { CatCache *cache = slist_container(CatCache, cc_next, iter.cur); - ResetCatalogCache(cache); + ResetCatalogCache(cache, debug_discard); } CACHE_elog(DEBUG2, "end of ResetCatalogCaches call"); @@ -744,7 +793,7 @@ CatalogCacheFlushCatalog(Oid catId) if (cache->cc_reloid == catId) { /* Yes, so flush all its contents */ - ResetCatalogCache(cache); + ResetCatalogCache(cache, false); /* Tell inval.c to call syscache callbacks for this cache */ CallSyscacheCallbacks(cache->id, 0); @@ -1439,7 +1488,7 @@ SearchCatCacheMiss(CatCache *cache, while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) { - ct = CatalogCacheCreateEntry(cache, ntp, scandesc, NULL, + ct = CatalogCacheCreateEntry(cache, ntp, NULL, hashValue, hashIndex); /* upon failure, we must start the scan over */ if (ct == NULL) @@ -1474,7 +1523,7 @@ SearchCatCacheMiss(CatCache *cache, if (IsBootstrapProcessingMode()) return NULL; - ct = CatalogCacheCreateEntry(cache, NULL, NULL, arguments, + ct = CatalogCacheCreateEntry(cache, NULL, arguments, hashValue, hashIndex); /* Creating a negative cache entry shouldn't fail */ @@ -1604,6 +1653,8 @@ SearchCatCacheList(CatCache *cache, HeapTuple ntp; MemoryContext oldcxt; int i; + CatCInProgress *save_in_progress; + CatCInProgress in_progress_ent; /* * one-time startup overhead for each cache @@ -1720,21 +1771,60 @@ SearchCatCacheList(CatCache *cache, ctlist = NIL; + /* + * Cache invalidation can happen while we're building the list. + * CatalogCacheCreateEntry() handles concurrent invalidation of individual + * tuples, but it's also possible that a new entry is concurrently added + * that should be part of the list we're building. Register an + * "in-progress" entry that will receive the invalidation, until we have + * built the final list entry. + */ + save_in_progress = catcache_in_progress_stack; + in_progress_ent.next = catcache_in_progress_stack; + in_progress_ent.cache = cache; + in_progress_ent.hash_value = lHashValue; + in_progress_ent.list = true; + in_progress_ent.dead = false; + catcache_in_progress_stack = &in_progress_ent; + PG_TRY(); { ScanKeyData cur_skey[CATCACHE_MAXKEYS]; Relation relation; SysScanDesc scandesc; - bool stale; relation = table_open(cache->cc_reloid, AccessShareLock); + /* + * Scan the table for matching entries. If an invalidation arrives + * mid-build, we will loop back here to retry. + */ do { /* - * Ok, need to make a lookup in the relation, copy the scankey and - * fill out any per-call fields. (We must re-do this when - * retrying, because systable_beginscan scribbles on the scankey.) + * If we are retrying, release refcounts on any items created on + * the previous iteration. We dare not try to free them if + * they're now unreferenced, since an error while doing that would + * result in the PG_CATCH below doing extra refcount decrements. + * Besides, we'll likely re-adopt those items in the next + * iteration, so it's not worth complicating matters to try to get + * rid of them. + */ + foreach(ctlist_item, ctlist) + { + ct = (CatCTup *) lfirst(ctlist_item); + Assert(ct->c_list == NULL); + Assert(ct->refcount > 0); + ct->refcount--; + } + /* Reset ctlist in preparation for new try */ + ctlist = NIL; + in_progress_ent.dead = false; + + /* + * Copy the scankey and fill out any per-call fields. (We must + * re-do this when retrying, because systable_beginscan scribbles + * on the scankey.) */ memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * cache->cc_nkeys); cur_skey[0].sk_argument = v1; @@ -1752,9 +1842,8 @@ SearchCatCacheList(CatCache *cache, /* The list will be ordered iff we are doing an index scan */ ordered = (scandesc->irel != NULL); - stale = false; - - while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) + while (HeapTupleIsValid(ntp = systable_getnext(scandesc)) && + !in_progress_ent.dead) { uint32 hashValue; Index hashIndex; @@ -1796,30 +1885,13 @@ SearchCatCacheList(CatCache *cache, if (!found) { /* We didn't find a usable entry, so make a new one */ - ct = CatalogCacheCreateEntry(cache, ntp, scandesc, NULL, + ct = CatalogCacheCreateEntry(cache, ntp, NULL, hashValue, hashIndex); + /* upon failure, we must start the scan over */ if (ct == NULL) { - /* - * Release refcounts on any items we already had. We - * dare not try to free them if they're now - * unreferenced, since an error while doing that would - * result in the PG_CATCH below doing extra refcount - * decrements. Besides, we'll likely re-adopt those - * items in the next iteration, so it's not worth - * complicating matters to try to get rid of them. - */ - foreach(ctlist_item, ctlist) - { - ct = (CatCTup *) lfirst(ctlist_item); - Assert(ct->c_list == NULL); - Assert(ct->refcount > 0); - ct->refcount--; - } - /* Reset ctlist in preparation for new try */ - ctlist = NIL; - stale = true; + in_progress_ent.dead = true; break; } } @@ -1831,7 +1903,7 @@ SearchCatCacheList(CatCache *cache, } systable_endscan(scandesc); - } while (stale); + } while (in_progress_ent.dead); table_close(relation, AccessShareLock); @@ -1856,6 +1928,9 @@ SearchCatCacheList(CatCache *cache, } PG_CATCH(); { + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; + foreach(ctlist_item, ctlist) { ct = (CatCTup *) lfirst(ctlist_item); @@ -1874,6 +1949,8 @@ SearchCatCacheList(CatCache *cache, PG_RE_THROW(); } PG_END_TRY(); + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; cl->cl_magic = CL_MAGIC; cl->my_cache = cache; @@ -1939,23 +2016,6 @@ ReleaseCatCacheList(CatCList *list) } -/* - * equalTuple - * Are these tuples memcmp()-equal? - */ -static bool -equalTuple(HeapTuple a, HeapTuple b) -{ - uint32 alen; - uint32 blen; - - alen = a->t_len; - blen = b->t_len; - return (alen == blen && - memcmp((char *) a->t_data, - (char *) b->t_data, blen) == 0); -} - /* * CatalogCacheCreateEntry * Create a new CatCTup entry, copying the given HeapTuple and other @@ -1963,34 +2023,33 @@ equalTuple(HeapTuple a, HeapTuple b) * * To create a normal cache entry, ntp must be the HeapTuple just fetched * from scandesc, and "arguments" is not used. To create a negative cache - * entry, pass NULL for ntp and scandesc; then "arguments" is the cache - * keys to use. In either case, hashValue/hashIndex are the hash values - * computed from the cache keys. + * entry, pass NULL for ntp; then "arguments" is the cache keys to use. + * In either case, hashValue/hashIndex are the hash values computed from + * the cache keys. * * Returns NULL if we attempt to detoast the tuple and observe that it * became stale. (This cannot happen for a negative entry.) Caller must * retry the tuple lookup in that case. */ static CatCTup * -CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, SysScanDesc scandesc, - Datum *arguments, +CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, uint32 hashValue, Index hashIndex) { CatCTup *ct; - HeapTuple dtp; MemoryContext oldcxt; if (ntp) { int i; + HeapTuple dtp = NULL; /* - * The visibility recheck below essentially never fails during our - * regression tests, and there's no easy way to force it to fail for - * testing purposes. To ensure we have test coverage for the retry - * paths in our callers, make debug builds randomly fail about 0.1% of - * the times through this code path, even when there's no toasted - * fields. + * The invalidation of the in-progress entry essentially never happens + * during our regression tests, and there's no easy way to force it to + * fail for testing purposes. To ensure we have test coverage for the + * retry paths in our callers, make debug builds randomly fail about + * 0.1% of the times through this code path, even when there's no + * toasted fields. */ #ifdef USE_ASSERT_CHECKING if (pg_prng_uint32(&pg_global_prng_state) <= (PG_UINT32_MAX / 1000)) @@ -2006,34 +2065,34 @@ CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, SysScanDesc scandesc, */ if (HeapTupleHasExternal(ntp)) { - bool need_cmp = IsInplaceUpdateOid(cache->cc_reloid); - HeapTuple before = NULL; - bool matches = true; - - if (need_cmp) - before = heap_copytuple(ntp); - dtp = toast_flatten_tuple(ntp, cache->cc_tupdesc); + CatCInProgress *save_in_progress; + CatCInProgress in_progress_ent; /* * The tuple could become stale while we are doing toast table - * access (since AcceptInvalidationMessages can run then). - * equalTuple() detects staleness from inplace updates, while - * systable_recheck_tuple() detects staleness from normal updates. - * - * While this equalTuple() follows the usual rule of reading with - * a pin and no buffer lock, it warrants suspicion since an - * inplace update could appear at any moment. It's safe because - * the inplace update sends an invalidation that can't reorder - * before the inplace heap change. If the heap change reaches - * this process just after equalTuple() looks, we've not missed - * its inval. + * access (since AcceptInvalidationMessages can run then). The + * invalidation will mark our in-progress entry as dead. */ - if (need_cmp) + save_in_progress = catcache_in_progress_stack; + in_progress_ent.next = catcache_in_progress_stack; + in_progress_ent.cache = cache; + in_progress_ent.hash_value = hashValue; + in_progress_ent.list = false; + in_progress_ent.dead = false; + catcache_in_progress_stack = &in_progress_ent; + + PG_TRY(); { - matches = equalTuple(before, ntp); - heap_freetuple(before); + dtp = toast_flatten_tuple(ntp, cache->cc_tupdesc); } - if (!matches || !systable_recheck_tuple(scandesc, ntp)) + PG_FINALLY(); + { + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; + } + PG_END_TRY(); + + if (in_progress_ent.dead) { heap_freetuple(dtp); return NULL; diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 0008826f67c..a140a99f0a7 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -710,7 +710,7 @@ InvalidateSystemCachesExtended(bool debug_discard) int i; InvalidateCatalogSnapshot(); - ResetCatalogCaches(); + ResetCatalogCachesExt(debug_discard); RelationCacheInvalidate(debug_discard); /* gets smgr and relmap too */ for (i = 0; i < syscache_callback_count; i++) diff --git a/src/include/utils/catcache.h b/src/include/utils/catcache.h index a32d7222a99..84ca10704bc 100644 --- a/src/include/utils/catcache.h +++ b/src/include/utils/catcache.h @@ -223,6 +223,7 @@ extern CatCList *SearchCatCacheList(CatCache *cache, int nkeys, extern void ReleaseCatCacheList(CatCList *list); extern void ResetCatalogCaches(void); +extern void ResetCatalogCachesExt(bool debug_discard); extern void CatalogCacheFlushCatalog(Oid catId); extern void CatCacheInvalidate(CatCache *cache, uint32 hashValue); extern void PrepareToInvalidateCacheTuple(Relation relation, diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 0b797462df2..98f678b7607 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -359,6 +359,7 @@ CaseTestExpr CaseWhen Cash CastInfo +CatCInProgress CatCList CatCTup CatCache From 5c7c34db251161e07010d0122d2687135fc2212f Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Wed, 15 Jan 2025 01:24:24 +0900 Subject: [PATCH 075/119] ecpg: Restore detection of unsupported COPY FROM STDIN. The ecpg command includes code to warn about unsupported COPY FROM STDIN statements in input files. However, since commit 3d009e45bd, this functionality has been broken due to a bug introduced in that commit, causing ecpg to fail to detect the statement. This commit resolves the issue, restoring ecpg's ability to detect COPY FROM STDIN and issue a warning as intended. Back-patch to all supported versions. Author: Ryo Kanbayashi Reviewed-by: Hayato Kuroda, Tom Lane Discussion: https://postgr.es/m/CANOn0Ez_t5uDCUEV8c1YORMisJiU5wu681eEVZzgKwOeiKhkqQ@mail.gmail.com --- src/interfaces/ecpg/preproc/ecpg.addons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons index e94da2a3f8d..50601554763 100644 --- a/src/interfaces/ecpg/preproc/ecpg.addons +++ b/src/interfaces/ecpg/preproc/ecpg.addons @@ -248,7 +248,7 @@ ECPG: where_or_current_clauseWHERECURRENT_POFcursor_name block $$ = cat_str(2,mm_strdup("where current of"), cursor_marker); } ECPG: CopyStmtCOPYopt_binaryqualified_nameopt_column_listcopy_fromopt_programcopy_file_namecopy_delimiteropt_withcopy_optionswhere_clause addon - if (strcmp($6, "from") == 0 && + if (strcmp($5, "from") == 0 && (strcmp($7, "stdin") == 0 || strcmp($7, "stdout") == 0)) mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented"); ECPG: var_valueNumericOnly addon From b935691b8b2f7ec7d537b77cb262ee8363f4715c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 14 Jan 2025 18:50:24 -0500 Subject: [PATCH 076/119] Avoid symbol collisions between pqsignal.c and legacy-pqsignal.c. In the name of ABI stability (that is, to avoid a library major version bump for libpq), libpq still exports a version of pqsignal() that we no longer want to use ourselves. However, since that has the same link name as the function exported by src/port/pqsignal.c, there is a link ordering dependency determining which version will actually get used by code that uses libpq as well as libpgport.a. It now emerges that the wrong version has been used by pgbench and psql since commit 06843df4a rearranged their link commands. This can result in odd failures in pgbench with the -T switch, since its SIGALRM handler will now not be marked SA_RESTART. psql may have some edge-case problems in \watch, too. Since we don't want to depend on link ordering effects anymore, let's fix this in the same spirit as b6c7cfac8: use macros to change the actual link names of the competing functions. We cannot change legacy-pqsignal.c's exported name of course, so the victim has to be src/port/pqsignal.c. In master, rename its exported name to be pqsignal_fe in frontend or pqsignal_be in backend. (We could perhaps have gotten away with using the same symbol in both cases, but since the FE and BE versions now work a little differently, it seems advisable to use different names.) In back branches, rename to pqsignal_fe in frontend but keep it as pqsignal in backend. The frontend change could affect third-party code that is calling pqsignal from libpgport.a or libpgport_shlib.a, but only if the code is compiled against port.h from a different minor release than libpgport. Since we don't support using libpgport as a shared library, it seems unlikely that there will be such a problem. I left the backend symbol unchanged to avoid an ABI break for extensions. This means that the link ordering hazard still exists for any extension that links against libpq. However, none of our own extensions use both pqsignal() and libpq, and we're not making things any worse for third-party extensions that do. Report from Andy Fan, diagnosis by Fujii Masao, patch by me. Back-patch to all supported branches, as 06843df4a was. Discussion: https://postgr.es/m/87msfz5qv2.fsf@163.com --- src/include/port.h | 5 ++++- src/interfaces/libpq/legacy-pqsignal.c | 12 +++++++++--- src/port/pqsignal.c | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/include/port.h b/src/include/port.h index d03596a53f1..e7212097285 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -511,7 +511,10 @@ extern int pg_check_dir(const char *dir); /* port/pgmkdirp.c */ extern int pg_mkdir_p(char *path, int omode); -/* port/pqsignal.c */ +/* port/pqsignal.c (see also interfaces/libpq/legacy-pqsignal.c) */ +#ifdef FRONTEND +#define pqsignal pqsignal_fe +#endif typedef void (*pqsigfunc) (SIGNAL_ARGS); extern pqsigfunc pqsignal(int signo, pqsigfunc func); diff --git a/src/interfaces/libpq/legacy-pqsignal.c b/src/interfaces/libpq/legacy-pqsignal.c index 790ab5a18c0..c163dd3a09c 100644 --- a/src/interfaces/libpq/legacy-pqsignal.c +++ b/src/interfaces/libpq/legacy-pqsignal.c @@ -28,10 +28,16 @@ * with the semantics it had in 9.2; in particular, this has different * behavior for SIGALRM than the version in src/port/pqsignal.c. * - * libpq itself uses this only for SIGPIPE (and even then, only in - * non-ENABLE_THREAD_SAFETY builds), so the incompatibility isn't - * troublesome for internal references. + * libpq itself does not use this, nor does anything else in our code. + * + * src/include/port.h will #define pqsignal as pqsignal_fe, + * but here we want to export just plain "pqsignal". We can't rely on + * port.h's extern declaration either. (The point of that #define + * is to ensure that no in-tree code accidentally calls this version.) */ +#undef pqsignal +extern pqsigfunc pqsignal(int signo, pqsigfunc func); + pqsigfunc pqsignal(int signo, pqsigfunc func) { diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c index 83d876db6ca..3dc806d9b3f 100644 --- a/src/port/pqsignal.c +++ b/src/port/pqsignal.c @@ -37,6 +37,10 @@ * Set up a signal handler, with SA_RESTART, for signal "signo" * * Returns the previous handler. + * + * Note: the actual name of this function is either pqsignal_fe when + * compiled with -DFRONTEND, or pqsignal when compiled without that. + * This is to avoid a name collision with libpq's legacy-pqsignal.c. */ pqsigfunc pqsignal(int signo, pqsigfunc func) From 9420f9bb61e6c244107a01b96e9ea07231b52ba7 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 16 Jan 2025 09:26:26 +0900 Subject: [PATCH 077/119] Move routines to manipulate WAL into PostgreSQL::Test::Cluster These facilities were originally in the recovery TAP test 039_end_of_wal.pl. A follow-up bug fix with a TAP test doing similar WAL manipulations requires them, and all these had better not be duplicated due to their complexity. The routine names are tweaked to use "wal" more consistently, similarly to the existing "advance_wal". In v14 and v13, the new routines are moved to PostgresNode.pm. 039_end_of_wal.pl is updated to use the refactored routines, without changing its coverage. Reviewed-by: Alexander Kukushkin Discussion: https://postgr.es/m/CAFh8B=mozC+e1wGJq0H=0O65goZju+6ab5AU7DEWCSUA2OtwDg@mail.gmail.com Backpatch-through: 13 --- src/test/perl/PostgreSQL/Test/Cluster.pm | 148 +++++++++++++ src/test/recovery/t/039_end_of_wal.pl | 257 ++++++----------------- 2 files changed, 214 insertions(+), 191 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 50160407bc2..f0c5a1b14b8 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -2660,6 +2660,154 @@ sub lsn =pod +=item $node->write_wal($tli, $lsn, $segment_size, $data) + +Write some arbitrary data in WAL for the given segment at $lsn (in bytes). +This should be called while the cluster is not running. + +Returns the path of the WAL segment written to. + +=cut + +sub write_wal +{ + my ($self, $tli, $lsn, $segment_size, $data) = @_; + + # Calculate segment number and offset position in segment based on the + # input LSN. + my $segment = $lsn / $segment_size; + my $offset = $lsn % $segment_size; + my $path = + sprintf("%s/pg_wal/%08X%08X%08X", $self->data_dir, $tli, 0, $segment); + + open my $fh, "+<:raw", $path or die "could not open WAL segment $path"; + seek($fh, $offset, SEEK_SET) or die "could not seek WAL segment $path"; + print $fh $data; + close $fh; + + return $path; +} + +=pod + +=item $node->emit_wal($size) + +Emit a WAL record of arbitrary size, using pg_logical_emit_message(). + +Returns the end LSN of the record inserted, in bytes. + +=cut + +sub emit_wal +{ + my ($self, $size) = @_; + + return int( + $self->safe_psql( + 'postgres', + "SELECT pg_logical_emit_message(true, '', repeat('a', $size)) - '0/0'" + )); +} + + +# Private routine returning the current insert LSN of a node, in bytes. +# Used by the routines below in charge of advancing WAL to arbitrary +# positions. The insert LSN is returned in bytes. +sub _get_insert_lsn +{ + my ($self) = @_; + return int( + $self->safe_psql( + 'postgres', "SELECT pg_current_wal_insert_lsn() - '0/0'")); +} + +=pod + +=item $node->advance_wal_out_of_record_splitting_zone($wal_block_size) + +Advance WAL at the end of a page, making sure that we are far away enough +from the end of a page that we could insert a couple of small records. + +This inserts a few records of a fixed size, until the threshold gets close +enough to the end of the WAL page inserting records to. + +Returns the end LSN up to which WAL has advanced, in bytes. + +=cut + +sub advance_wal_out_of_record_splitting_zone +{ + my ($self, $wal_block_size) = @_; + + my $page_threshold = $wal_block_size / 4; + my $end_lsn = $self->_get_insert_lsn(); + my $page_offset = $end_lsn % $wal_block_size; + while ($page_offset >= $wal_block_size - $page_threshold) + { + $self->emit_wal($page_threshold); + $end_lsn = $self->_get_insert_lsn(); + $page_offset = $end_lsn % $wal_block_size; + } + return $end_lsn; +} + +=pod + +=item $node->advance_wal_to_record_splitting_zone($wal_block_size) + +Advance WAL so close to the end of a page that an XLogRecordHeader would not +fit on it. + +Returns the end LSN up to which WAL has advanced, in bytes. + +=cut + +sub advance_wal_to_record_splitting_zone +{ + my ($self, $wal_block_size) = @_; + + # Size of record header. + my $RECORD_HEADER_SIZE = 24; + + my $end_lsn = $self->_get_insert_lsn(); + my $page_offset = $end_lsn % $wal_block_size; + + # Get fairly close to the end of a page in big steps + while ($page_offset <= $wal_block_size - 512) + { + $self->emit_wal($wal_block_size - $page_offset - 256); + $end_lsn = $self->_get_insert_lsn(); + $page_offset = $end_lsn % $wal_block_size; + } + + # Calibrate our message size so that we can get closer 8 bytes at + # a time. + my $message_size = $wal_block_size - 80; + while ($page_offset <= $wal_block_size - $RECORD_HEADER_SIZE) + { + $self->emit_wal($message_size); + $end_lsn = $self->_get_insert_lsn(); + + my $old_offset = $page_offset; + $page_offset = $end_lsn % $wal_block_size; + + # Adjust the message size until it causes 8 bytes changes in + # offset, enough to be able to split a record header. + my $delta = $page_offset - $old_offset; + if ($delta > 8) + { + $message_size -= 8; + } + elsif ($delta <= 0) + { + $message_size += 8; + } + } + return $end_lsn; +} + +=pod + =item $node->wait_for_catchup(standby_name, mode, target_lsn) Wait for the replication connection with application_name standby_name until diff --git a/src/test/recovery/t/039_end_of_wal.pl b/src/test/recovery/t/039_end_of_wal.pl index 02f0091a6c5..4ffaec91611 100644 --- a/src/test/recovery/t/039_end_of_wal.pl +++ b/src/test/recovery/t/039_end_of_wal.pl @@ -20,9 +20,6 @@ # we need to know the endianness to do that. my $BIG_ENDIAN = pack("L", 0x12345678) eq pack("N", 0x12345678); -# Header size of record header. -my $RECORD_HEADER_SIZE = 24; - # Fields retrieved from code headers. my @scan_result = scan_server_header('access/xlog_internal.h', '#define\s+XLOG_PAGE_MAGIC\s+(\w+)'); @@ -36,64 +33,6 @@ my $WAL_BLOCK_SIZE; my $TLI; -# Build path of a WAL segment. -sub wal_segment_path -{ - my $node = shift; - my $tli = shift; - my $segment = shift; - my $wal_path = - sprintf("%s/pg_wal/%08X%08X%08X", $node->data_dir, $tli, 0, $segment); - return $wal_path; -} - -# Calculate from a LSN (in bytes) its segment number and its offset. -sub lsn_to_segment_and_offset -{ - my $lsn = shift; - return ($lsn / $WAL_SEGMENT_SIZE, $lsn % $WAL_SEGMENT_SIZE); -} - -# Write some arbitrary data in WAL for the given segment at LSN. -# This should be called while the cluster is not running. -sub write_wal -{ - my $node = shift; - my $tli = shift; - my $lsn = shift; - my $data = shift; - - my ($segment, $offset) = lsn_to_segment_and_offset($lsn); - my $path = wal_segment_path($node, $tli, $segment); - - open my $fh, "+<:raw", $path or die; - seek($fh, $offset, SEEK_SET) or die; - print $fh $data; - close $fh; -} - -# Emit a WAL record of arbitrary size. Returns the end LSN of the -# record inserted, in bytes. -sub emit_message -{ - my $node = shift; - my $size = shift; - return int( - $node->safe_psql( - 'postgres', - "SELECT pg_logical_emit_message(true, '', repeat('a', $size)) - '0/0'" - )); -} - -# Get the current insert LSN of a node, in bytes. -sub get_insert_lsn -{ - my $node = shift; - return int( - $node->safe_psql( - 'postgres', "SELECT pg_current_wal_insert_lsn() - '0/0'")); -} - # Get GUC value, converted to an int. sub get_int_setting { @@ -167,69 +106,6 @@ sub build_page_header $BIG_ENDIAN ? $xlp_pageaddr : 0, $xlp_rem_len); } -# Make sure we are far away enough from the end of a page that we could insert -# a couple of small records. This inserts a few records of a fixed size, until -# the threshold gets close enough to the end of the WAL page inserting records -# to. -sub advance_out_of_record_splitting_zone -{ - my $node = shift; - - my $page_threshold = $WAL_BLOCK_SIZE / 4; - my $end_lsn = get_insert_lsn($node); - my $page_offset = $end_lsn % $WAL_BLOCK_SIZE; - while ($page_offset >= $WAL_BLOCK_SIZE - $page_threshold) - { - emit_message($node, $page_threshold); - $end_lsn = get_insert_lsn($node); - $page_offset = $end_lsn % $WAL_BLOCK_SIZE; - } - return $end_lsn; -} - -# Advance so close to the end of a page that an XLogRecordHeader would not -# fit on it. -sub advance_to_record_splitting_zone -{ - my $node = shift; - - my $end_lsn = get_insert_lsn($node); - my $page_offset = $end_lsn % $WAL_BLOCK_SIZE; - - # Get fairly close to the end of a page in big steps - while ($page_offset <= $WAL_BLOCK_SIZE - 512) - { - emit_message($node, $WAL_BLOCK_SIZE - $page_offset - 256); - $end_lsn = get_insert_lsn($node); - $page_offset = $end_lsn % $WAL_BLOCK_SIZE; - } - - # Calibrate our message size so that we can get closer 8 bytes at - # a time. - my $message_size = $WAL_BLOCK_SIZE - 80; - while ($page_offset <= $WAL_BLOCK_SIZE - $RECORD_HEADER_SIZE) - { - emit_message($node, $message_size); - $end_lsn = get_insert_lsn($node); - - my $old_offset = $page_offset; - $page_offset = $end_lsn % $WAL_BLOCK_SIZE; - - # Adjust the message size until it causes 8 bytes changes in - # offset, enough to be able to split a record header. - my $delta = $page_offset - $old_offset; - if ($delta > 8) - { - $message_size -= 8; - } - elsif ($delta <= 0) - { - $message_size += 8; - } - } - return $end_lsn; -} - # Setup a new node. The configuration chosen here minimizes the number # of arbitrary records that could get generated in a cluster. Enlarging # checkpoint_timeout avoids noise with checkpoint activity. wal_level @@ -265,8 +141,8 @@ sub advance_to_record_splitting_zone ########################################################################### # xl_tot_len is 0 (a common case, we hit trailing zeroes). -emit_message($node, 0); -$end_lsn = advance_out_of_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); my $log_size = -s $node->logfile; $node->start; @@ -276,10 +152,10 @@ sub advance_to_record_splitting_zone "xl_tot_len zero"); # xl_tot_len is < 24 (presumably recycled garbage). -emit_message($node, 0); -$end_lsn = advance_out_of_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, build_record_header(23)); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(23)); $log_size = -s $node->logfile; $node->start; ok( $node->log_contains( @@ -289,10 +165,10 @@ sub advance_to_record_splitting_zone # xl_tot_len in final position, not big enough to span into a new page but # also not eligible for regular record header validation -emit_message($node, 0); -$end_lsn = advance_to_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, build_record_header(1)); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(1)); $log_size = -s $node->logfile; $node->start; ok( $node->log_contains( @@ -301,10 +177,10 @@ sub advance_to_record_splitting_zone "xl_tot_len short at end-of-page"); # Need more pages, but xl_prev check fails first. -emit_message($node, 0); -$end_lsn = advance_out_of_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); $log_size = -s $node->logfile; $node->start; @@ -313,12 +189,12 @@ sub advance_to_record_splitting_zone "xl_prev bad"); # xl_crc check fails. -emit_message($node, 0); -advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 10); +$node->emit_wal(0); +$node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(10); $node->stop('immediate'); # Corrupt a byte in that record, breaking its CRC. -write_wal($node, $TLI, $end_lsn - 8, '!'); +$node->write_wal($TLI, $end_lsn - 8, $WAL_SEGMENT_SIZE, '!'); $log_size = -s $node->logfile; $node->start; ok( $node->log_contains( @@ -335,11 +211,11 @@ sub advance_to_record_splitting_zone # written to WAL. # Good xl_prev, we hit zero page next (zero magic). -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); $log_size = -s $node->logfile; $node->start; @@ -347,16 +223,14 @@ sub advance_to_record_splitting_zone "xlp_magic zero"); # Good xl_prev, we hit garbage page next (bad magic). -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); -write_wal( - $node, $TLI, - start_of_next_page($end_lsn), - build_page_header(0xcafe, 0, 1, 0)); +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header(0xcafe, 0, 1, 0)); $log_size = -s $node->logfile; $node->start; ok($node->log_contains("invalid magic number CAFE .* LSN .*", $log_size), @@ -364,16 +238,14 @@ sub advance_to_record_splitting_zone # Good xl_prev, we hit typical recycled page (good xlp_magic, bad # xlp_pageaddr). -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); -write_wal( - $node, $TLI, - start_of_next_page($end_lsn), - build_page_header($XLP_PAGE_MAGIC, 0, 1, 0xbaaaaaad)); +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header($XLP_PAGE_MAGIC, 0, 1, 0xbaaaaaad)); $log_size = -s $node->logfile; $node->start; ok( $node->log_contains( @@ -381,15 +253,16 @@ sub advance_to_record_splitting_zone "xlp_pageaddr bad"); # Good xl_prev, xlp_magic, xlp_pageaddr, but bogus xlp_info. -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); -write_wal( - $node, $TLI, +$node->write_wal( + $TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header( $XLP_PAGE_MAGIC, 0x1234, 1, start_of_next_page($end_lsn))); $log_size = -s $node->logfile; @@ -399,15 +272,14 @@ sub advance_to_record_splitting_zone # Good xl_prev, xlp_magic, xlp_pageaddr, but xlp_info doesn't mention # continuation record. -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); -write_wal( - $node, $TLI, - start_of_next_page($end_lsn), +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header($XLP_PAGE_MAGIC, 0, 1, start_of_next_page($end_lsn))); $log_size = -s $node->logfile; $node->start; @@ -416,15 +288,16 @@ sub advance_to_record_splitting_zone # Good xl_prev, xlp_magic, xlp_pageaddr, xlp_info but xlp_rem_len doesn't add # up. -emit_message($node, 0); -$prev_lsn = advance_out_of_record_splitting_zone($node); -$end_lsn = emit_message($node, 0); +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); -write_wal( - $node, $TLI, +$node->write_wal( + $TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header( $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, 1, start_of_next_page($end_lsn), @@ -441,10 +314,10 @@ sub advance_to_record_splitting_zone ########################################################################### # xl_prev is bad and xl_tot_len is too big, but we'll check xlp_magic first. -emit_message($node, 0); -$end_lsn = advance_to_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); $log_size = -s $node->logfile; $node->start; @@ -452,14 +325,15 @@ sub advance_to_record_splitting_zone "xlp_magic zero (split record header)"); # And we'll also check xlp_pageaddr before any header checks. -emit_message($node, 0); -$end_lsn = advance_to_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); -write_wal( - $node, $TLI, +$node->write_wal( + $TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header( $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, 1, 0xbaaaaaad)); $log_size = -s $node->logfile; @@ -470,14 +344,15 @@ sub advance_to_record_splitting_zone # We'll also discover that xlp_rem_len doesn't add up before any # header checks, -emit_message($node, 0); -$end_lsn = advance_to_record_splitting_zone($node); +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); $node->stop('immediate'); -write_wal($node, $TLI, $end_lsn, +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); -write_wal( - $node, $TLI, +$node->write_wal( + $TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header( $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, 1, start_of_next_page($end_lsn), From 94c02bd3345d7837bc1f240c14db2222c85aa18c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 16 Jan 2025 20:40:07 -0500 Subject: [PATCH 078/119] Fix setrefs.c's failure to do expression processing on prune steps. We should run the expression subtrees of PartitionedRelPruneInfo structs through fix_scan_expr. Failure to do so means that AlternativeSubPlans within those expressions won't be cleaned up properly, resulting in "unrecognized node type" errors since v14. It seems fairly likely that at least some of the other steps done by fix_scan_expr are important here as well, resulting in as-yet- undetected bugs. Therefore, I've chosen to back-patch this to all supported branches including v13, even though the known symptom doesn't manifest in v13. Per bug #18778 from Alexander Lakhin. Discussion: https://postgr.es/m/18778-24cd399df6c806af@postgresql.org --- src/backend/optimizer/plan/setrefs.c | 12 ++++++++ src/test/regress/expected/partition_prune.out | 29 +++++++++++++++++++ src/test/regress/sql/partition_prune.sql | 15 ++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 0b74158bbc9..2138963d1ee 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -1767,6 +1767,12 @@ set_append_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset, 1); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset, 1); } } } @@ -1843,6 +1849,12 @@ set_mergeappend_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset, 1); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset, 1); } } } diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index 4f88e7b2b65..3deece2c4b1 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -1839,6 +1839,35 @@ explain (costs off) select * from rparted_by_int2 where a > 100_000_000_000_000; (2 rows) drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop + -> Seq Scan on int4_tbl touter + -> Append + -> Index Only Scan using asptab0_pkey on asptab0 asptab_1 + Index Cond: (id > ((SubPlan 3))::integer) + SubPlan 4 + -> Seq Scan on int4_tbl tinner_2 + -> Index Only Scan using asptab1_pkey on asptab1 asptab_2 + Index Cond: (id > ((SubPlan 3))::integer) + SubPlan 3 + -> Seq Scan on int4_tbl tinner_1 + Filter: (f1 = touter.f1) + SubPlan 2 + -> Seq Scan on int4_tbl tinner +(14 rows) + +drop table asptab; -- -- Test Partition pruning for HASH partitioning -- diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index 45f934a9848..c3c61d0fc30 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -362,6 +362,21 @@ explain (costs off) select * from rparted_by_int2 where a > 100_000_000_000_000; drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up + +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); + +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + +drop table asptab; + -- -- Test Partition pruning for HASH partitioning -- From 4d72357c40ee0abfa5aa9361683aa08e257418c5 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 17 Jan 2025 13:27:43 +0900 Subject: [PATCH 079/119] Revert recent changes related to handling of 2PC files at recovery This commit reverts 8f67f994e8ea (down to v13) and c3de0f9eed38 (down to v17), as these are proving to not be completely correct regarding two aspects: - In v17 and newer branches, c3de0f9eed38's check for epoch handling is incorrect, and does not correctly handle frozen epochs. A logic closer to widen_snapshot_xid() should be used. The 2PC code should try to integrate deeper with FullTransactionIds, 5a1dfde8334b being not enough. - In v13 and newer branches, 8f67f994e8ea is a workaround for the real issue, which is that we should not attempt CLOG lookups without reaching consistency. This exists since 728bd991c3c4, and this is reachable with ProcessTwoPhaseBuffer() called by restoreTwoPhaseData() at the beginning of recovery. Per discussion with Noah Misch. Discussion: https://postgr.es/m/20250116010051.f3.nmisch@google.com Backpatch-through: 13 --- src/backend/access/transam/twophase.c | 16 ++++++++-------- src/test/recovery/t/009_twophase.pl | 23 ----------------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 330d2a5c9ec..95aa8be9c53 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -2183,40 +2183,40 @@ ProcessTwoPhaseBuffer(TransactionId xid, if (!fromdisk) Assert(prepare_start_lsn != InvalidXLogRecPtr); - /* Reject XID if too new */ - if (TransactionIdFollowsOrEquals(xid, origNextXid)) + /* Already processed? */ + if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid)) { if (fromdisk) { ereport(WARNING, - (errmsg("removing future two-phase state file for transaction %u", + (errmsg("removing stale two-phase state file for transaction %u", xid))); RemoveTwoPhaseFile(xid, true); } else { ereport(WARNING, - (errmsg("removing future two-phase state from memory for transaction %u", + (errmsg("removing stale two-phase state from memory for transaction %u", xid))); PrepareRedoRemove(xid, true); } return NULL; } - /* Already processed? */ - if (TransactionIdDidCommit(xid) || TransactionIdDidAbort(xid)) + /* Reject XID if too new */ + if (TransactionIdFollowsOrEquals(xid, origNextXid)) { if (fromdisk) { ereport(WARNING, - (errmsg("removing stale two-phase state file for transaction %u", + (errmsg("removing future two-phase state file for transaction %u", xid))); RemoveTwoPhaseFile(xid, true); } else { ereport(WARNING, - (errmsg("removing stale two-phase state from memory for transaction %u", + (errmsg("removing future two-phase state from memory for transaction %u", xid))); PrepareRedoRemove(xid, true); } diff --git a/src/test/recovery/t/009_twophase.pl b/src/test/recovery/t/009_twophase.pl index 7642e4f0b3c..fe7e8e79802 100644 --- a/src/test/recovery/t/009_twophase.pl +++ b/src/test/recovery/t/009_twophase.pl @@ -528,27 +528,4 @@ sub configure_and_reload qq{27|issued to paris}, "Check expected t_009_tbl2 data on standby"); -############################################################################### -# Check handling of orphaned 2PC files at recovery. -############################################################################### - -$cur_primary->teardown_node; - -# Grab location in logs of primary -my $log_offset = -s $cur_primary->logfile; - -# Create a fake file with a transaction ID large enough to be in the future, -# then check that the primary is able to start and remove this file at -# recovery. - -my $future_2pc_file = $cur_primary->data_dir . '/pg_twophase/00FFFFFF'; -append_to_file $future_2pc_file, ""; - -$cur_primary->start; -$cur_primary->log_check( - "future two-phase file removed at recovery", - $log_offset, - log_like => - [qr/removing future two-phase state file for transaction 16777215/]); - done_testing(); From 2c2e1d4f42c00784b46023ba123bd5cd38d914fb Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 20 Jan 2025 09:30:36 +0900 Subject: [PATCH 080/119] Fix header check for continuation records where standbys could be stuck XLogPageRead() checks immediately for an invalid WAL record header on a standby, to be able to handle the case of continuation records that need to be read across two different sources. As written, the check was too generic, applying to any target LSN. Based on an analysis by Kyotaro Horiguchi, what really matters is to make sure that the page header is checked when attempting to read a LSN at the boundary of a segment, to handle the case of a continuation record that spawns across multiple pages when dealing with multiple segments, as WAL receivers are spawned they request WAL from the beginning of a segment. This fix has been proposed by Kyotaro Horiguchi. This could cause standbys to loop infinitely when dealing with a continuation record during a timeline jump, in the case where the contents of the record in the follow-up page are invalid. Some regression tests are added to check such scenarios, able to reproduce the original problem. In the test, the contents of a continuation record are overwritten with junk zeros on its follow-up page, and replayed on standbys. This is inspired by 039_end_of_wal.pl, and is enough to show how standbys should react on promotion by not being stuck. Without the fix, the test would fail with a timeout. The test to reproduce the problem has been written by Alexander Kukushkin. The original check has been introduced in 066871980183, for a similar problem. Author: Kyotaro Horiguchi, Alexander Kukushkin Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/CAFh8B=mozC+e1wGJq0H=0O65goZju+6ab5AU7DEWCSUA2OtwDg@mail.gmail.com Backpatch-through: 13 --- src/backend/access/transam/xlogrecovery.c | 13 +- src/test/recovery/meson.build | 1 + .../recovery/t/043_no_contrecord_switch.pl | 153 ++++++++++++++++++ 3 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 src/test/recovery/t/043_no_contrecord_switch.pl diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 3c7fb913e7e..6d48cb7e843 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -3386,12 +3386,12 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, * validates the page header anyway, and would propagate the failure up to * ReadRecord(), which would retry. However, there's a corner case with * continuation records, if a record is split across two pages such that - * we would need to read the two pages from different sources. For - * example, imagine a scenario where a streaming replica is started up, - * and replay reaches a record that's split across two WAL segments. The - * first page is only available locally, in pg_wal, because it's already - * been recycled on the primary. The second page, however, is not present - * in pg_wal, and we should stream it from the primary. There is a + * we would need to read the two pages from different sources across two + * WAL segments. + * + * The first page is only available locally, in pg_wal, because it's + * already been recycled on the primary. The second page, however, is not + * present in pg_wal, and we should stream it from the primary. There is a * recycled WAL segment present in pg_wal, with garbage contents, however. * We would read the first page from the local WAL segment, but when * reading the second page, we would read the bogus, recycled, WAL @@ -3413,6 +3413,7 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, * responsible for the validation. */ if (StandbyMode && + (targetPagePtr % wal_segment_size) == 0 && !XLogReaderValidatePageHeader(xlogreader, targetPagePtr, readBuf)) { /* diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build index f5c1021a5ea..24d0f5b0c1c 100644 --- a/src/test/recovery/meson.build +++ b/src/test/recovery/meson.build @@ -45,6 +45,7 @@ tests += { 't/037_invalid_database.pl', 't/039_end_of_wal.pl', 't/043_vacuum_horizon_floor.pl', + 't/043_no_contrecord_switch.pl', ], }, } diff --git a/src/test/recovery/t/043_no_contrecord_switch.pl b/src/test/recovery/t/043_no_contrecord_switch.pl new file mode 100644 index 00000000000..a473d3e7d3e --- /dev/null +++ b/src/test/recovery/t/043_no_contrecord_switch.pl @@ -0,0 +1,153 @@ +# Copyright (c) 2021-2025, PostgreSQL Global Development Group + +# Tests for already-propagated WAL segments ending in incomplete WAL records. + +use strict; +use warnings; + +use File::Copy; +use PostgreSQL::Test::Cluster; +use Test::More; +use Fcntl qw(SEEK_SET); + +use integer; # causes / operator to use integer math + +# Values queried from the server +my $WAL_SEGMENT_SIZE; +my $WAL_BLOCK_SIZE; +my $TLI; + +# Build name of a WAL segment, used when filtering the contents of the server +# logs. +sub wal_segment_name +{ + my $tli = shift; + my $segment = shift; + return sprintf("%08X%08X%08X", $tli, 0, $segment); +} + +# Calculate from a LSN (in bytes) its segment number and its offset, used +# when filtering the contents of the server logs. +sub lsn_to_segment_and_offset +{ + my $lsn = shift; + return ($lsn / $WAL_SEGMENT_SIZE, $lsn % $WAL_SEGMENT_SIZE); +} + +# Get GUC value, converted to an int. +sub get_int_setting +{ + my $node = shift; + my $name = shift; + return int( + $node->safe_psql( + 'postgres', + "SELECT setting FROM pg_settings WHERE name = '$name'")); +} + +sub start_of_page +{ + my $lsn = shift; + return $lsn & ~($WAL_BLOCK_SIZE - 1); +} + +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(allows_streaming => 1, has_archiving => 1); + +# The configuration is chosen here to minimize the friction with +# concurrent WAL activity. checkpoint_timeout avoids noise with +# checkpoint activity, and autovacuum is disabled to avoid any +# WAL activity generated by it. +$primary->append_conf( + 'postgresql.conf', qq( +autovacuum = off +checkpoint_timeout = '30min' +wal_keep_size = 1GB +)); + +$primary->start; +$primary->backup('backup'); + +$primary->safe_psql('postgres', "CREATE TABLE t AS SELECT 0"); + +$WAL_SEGMENT_SIZE = get_int_setting($primary, 'wal_segment_size'); +$WAL_BLOCK_SIZE = get_int_setting($primary, 'wal_block_size'); +$TLI = $primary->safe_psql('postgres', + "SELECT timeline_id FROM pg_control_checkpoint()"); + +# Get close to the end of the current WAL page, enough to fit the +# beginning of a record that spans on two pages, generating a +# continuation record. +$primary->emit_wal(0); +my $end_lsn = + $primary->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); + +# Do some math to find the record size that will overflow the page, and +# write it. +my $overflow_size = $WAL_BLOCK_SIZE - ($end_lsn % $WAL_BLOCK_SIZE); +$end_lsn = $primary->emit_wal($overflow_size); +$primary->stop('immediate'); + +# Find the beginning of the page with the continuation record and fill +# the entire page with zero bytes to simulate broken replication. +my $start_page = start_of_page($end_lsn); +my $wal_file = $primary->write_wal($TLI, $start_page, $WAL_SEGMENT_SIZE, + "\x00" x $WAL_BLOCK_SIZE); + +# Copy the file we just "hacked" to the archives. +copy($wal_file, $primary->archive_dir); + +# Start standby nodes and make sure they replay the file "hacked" from +# the archives. +my $standby1 = PostgreSQL::Test::Cluster->new('standby1'); +$standby1->init_from_backup( + $primary, 'backup', + standby => 1, + has_restoring => 1); + +my $standby2 = PostgreSQL::Test::Cluster->new('standby2'); +$standby2->init_from_backup( + $primary, 'backup', + standby => 1, + has_restoring => 1); + +my $log_size1 = -s $standby1->logfile; +my $log_size2 = -s $standby2->logfile; + +$standby1->start; +$standby2->start; + +my ($segment, $offset) = lsn_to_segment_and_offset($start_page); +my $segment_name = wal_segment_name($TLI, $segment); +my $pattern = + qq(invalid magic number 0000 .* segment $segment_name.* offset $offset); + +# We expect both standby nodes to complain about empty page when trying to +# assemble the record that spans over two pages, so wait for these in their +# logs. +$standby1->wait_for_log($pattern, $log_size1); +$standby2->wait_for_log($pattern, $log_size2); + +# Now check the case of a promotion with a timeline jump handled at +# page boundary with a continuation record. +$standby1->promote; + +# This command forces standby2 to read a continuation record from the page +# that is filled with zero bytes. +$standby1->safe_psql('postgres', 'SELECT pg_switch_wal()'); + +# Make sure WAL moves forward. +$standby1->safe_psql('postgres', + 'INSERT INTO t SELECT * FROM generate_series(1, 1000)'); + +# Configure standby2 to stream from just promoted standby1 (it also pulls WAL +# files from the archive). It should be able to catch up. +$standby2->enable_streaming($standby1); +$standby2->reload; +$standby1->wait_for_replay_catchup($standby2); + +my $result = $standby2->safe_psql('postgres', "SELECT count(*) FROM t"); +print "standby2: $result\n"; +is($result, qq(1001), 'check streamed content on standby2'); + +done_testing(); From b4b52c911aafe482f008142d751b9ede6f85f52e Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Mon, 20 Jan 2025 15:17:47 +1300 Subject: [PATCH 081/119] Fix latch event policy that hid socket events. If a WaitEventSetWait() caller asks for multiple events, an already set latch would previously prevent other events from being reported at the same time. Now, we'll also poll the kernel for other events that would fit in the caller's output buffer with a zero wait time. This policy change doesn't affect callers that ask for only one event. The main caller affected is the postmaster. If its latch is set extremely frequently by backends launching workers and workers exiting, we don't want it to handle only those jobs and ignore incoming client connections. Back-patch to 16 where the postmaster began using the API. The fast-return policy changed here is older than that, but doesn't cause any known problems in earlier releases. Reported-by: Nathan Bossart Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/Z1n5UpAiGDmFcMmd%40nathan --- src/backend/storage/ipc/latch.c | 35 ++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index e572677c703..1fd55bb321a 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1423,9 +1423,9 @@ WaitEventSetWait(WaitEventSet *set, long timeout, int rc; /* - * Check if the latch is set already. If so, leave the loop - * immediately, avoid blocking again. We don't attempt to report any - * other events that might also be satisfied. + * Check if the latch is set already first. If so, we either exit + * immediately or ask the kernel for further events available right + * now without waiting, depending on how many events the caller wants. * * If someone sets the latch between this and the * WaitEventSetWaitBlock() below, the setter will write a byte to the @@ -1470,7 +1470,16 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* could have been set above */ set->latch->maybe_sleeping = false; - break; + if (returned_events == nevents) + break; /* output buffer full already */ + + /* + * Even though we already have an event, we'll poll just once with + * zero timeout to see what non-latch events we can fit into the + * output buffer at the same time. + */ + cur_timeout = 0; + timeout = 0; } /* @@ -1479,18 +1488,16 @@ WaitEventSetWait(WaitEventSet *set, long timeout, * to retry, everything >= 1 is the number of returned events. */ rc = WaitEventSetWaitBlock(set, cur_timeout, - occurred_events, nevents); + occurred_events, nevents - returned_events); - if (set->latch) - { - Assert(set->latch->maybe_sleeping); + if (set->latch && + set->latch->maybe_sleeping) set->latch->maybe_sleeping = false; - } if (rc == -1) break; /* timeout occurred */ else - returned_events = rc; + returned_events += rc; /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) @@ -1578,7 +1585,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, /* Drain the signalfd. */ drain(); - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -1737,7 +1744,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, if (cur_event->events == WL_LATCH_SET && cur_kqueue_event->filter == EVFILT_SIGNAL) { - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -1862,7 +1869,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, /* There's data in the self-pipe, clear it. */ drain(); - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -2076,7 +2083,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, if (!ResetEvent(set->handles[cur_event->pos + 1])) elog(ERROR, "ResetEvent failed: error code %lu", GetLastError()); - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; From 5054b7e107169de0b8ece0486943339638b6cd0d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 20 Jan 2025 15:47:53 -0500 Subject: [PATCH 082/119] Avoid using timezone Asia/Manila in regression tests. The freshly-released 2025a version of tzdata has a refined estimate for the longitude of Manila, changing their value for LMT in pre-standardized-timezone days. This changes the output of one of our test cases. Since we need to be able to run with system tzdata files that may or may not contain this update, we'd better stop making that specific test. I switched it to use Asia/Singapore, which has a roughly similar UTC offset. That LMT value hasn't changed in tzdb since 2003, so we can hope that it's well established. I also noticed that this set of make_timestamptz tests only exercises zones east of Greenwich, which seems rather sad, and was not the original intent AFAICS. (We've already changed these tests once to stabilize their results across tzdata updates, cf 66b737cd9; it looks like I failed to consider the UTC-offset-sign aspect then.) To improve that, add a test with Pacific/Honolulu. That LMT offset is also quite old in tzdb, so we'll cross our fingers that it doesn't get improved. Reported-by: Christoph Berg Discussion: https://postgr.es/m/Z46inkznCxesvDEb@msg.df7cb.de Backpatch-through: 13 --- src/include/datatype/timestamp.h | 2 +- src/test/regress/expected/timestamptz.out | 10 ++++++++-- src/test/regress/sql/timestamptz.sql | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/include/datatype/timestamp.h b/src/include/datatype/timestamp.h index ab8ccf89ca9..ab04344da0b 100644 --- a/src/include/datatype/timestamp.h +++ b/src/include/datatype/timestamp.h @@ -135,7 +135,7 @@ struct pg_itm_in /* * We allow numeric timezone offsets up to 15:59:59 either way from Greenwich. * Currently, the record holders for wackiest offsets in actual use are zones - * Asia/Manila, at -15:56:00 until 1844, and America/Metlakatla, at +15:13:42 + * Asia/Manila, at -15:56:08 until 1844, and America/Metlakatla, at +15:13:42 * until 1867. If we were to reject such values we would fail to dump and * restore old timestamptz values with these zone settings. */ diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index e7ac12aafa4..55baf2f3bed 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2388,10 +2388,16 @@ SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UT Tue Dec 09 23:00:00 2014 (1 row) -SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Asia/Singapore') AT TIME ZONE 'UTC'; timezone -------------------------- - Wed Dec 09 15:56:00 1846 + Fri Dec 09 17:04:35 1881 +(1 row) + +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Pacific/Honolulu') AT TIME ZONE 'UTC'; + timezone +-------------------------- + Sat Dec 10 10:31:26 1881 (1 row) SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index 64bba0817e9..79d52d7250b 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -442,7 +442,8 @@ SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:5 -- full timezone names SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague'; SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; -SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Asia/Singapore') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Pacific/Honolulu') AT TIME ZONE 'UTC'; SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); From d62403c5129edc6444f5a17c7f15443d7500c5a3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 20 Jan 2025 16:49:15 -0500 Subject: [PATCH 083/119] Update time zone data files to tzdata release 2025a. DST law changes in Paraguay. Historical corrections for the Philippines. Backpatch-through: 13 --- src/timezone/data/tzdata.zi | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/timezone/data/tzdata.zi b/src/timezone/data/tzdata.zi index 62e78bb826c..db6ba4af2b0 100644 --- a/src/timezone/data/tzdata.zi +++ b/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2024b +# version 2025a # This zic input file is in the public domain. R d 1916 o - Jun 14 23s 1 S R d 1916 1919 - O Su>=1 23s 0 - @@ -721,12 +721,16 @@ R P 2085 o - Ap 21 2 0 - R P 2085 o - Jun 9 2 1 S R P 2086 o - Ap 13 2 0 - R P 2086 o - May 25 2 1 S -R PH 1936 o - N 1 0 1 D -R PH 1937 o - F 1 0 0 S -R PH 1954 o - Ap 12 0 1 D -R PH 1954 o - Jul 1 0 0 S -R PH 1978 o - Mar 22 0 1 D -R PH 1978 o - S 21 0 0 S +R PH 1936 o - O 31 24 1 D +R PH 1937 o - Ja 15 24 0 S +R PH 1941 o - D 15 24 1 D +R PH 1945 o - N 30 24 0 S +R PH 1954 o - Ap 11 24 1 D +R PH 1954 o - Jun 4 24 0 S +R PH 1977 o - Mar 27 24 1 D +R PH 1977 o - S 21 24 0 S +R PH 1990 o - May 21 0 1 D +R PH 1990 o - Jul 28 24 0 S R S 1920 1923 - Ap Su>=15 2 1 S R S 1920 1923 - O Su>=1 2 0 - R S 1962 o - Ap 29 2 1 S @@ -1725,7 +1729,7 @@ R Y 1972 2006 - O lastSu 2 0 S R Y 1987 2006 - Ap Su>=1 2 1 D R Yu 1965 o - Ap lastSu 0 2 DD R Yu 1965 o - O lastSu 2 0 S -R m 1931 o - April 30 0 1 D +R m 1931 o - Ap 30 0 1 D R m 1931 o - O 1 0 0 S R m 1939 o - F 5 0 1 D R m 1939 o - Jun 25 0 0 S @@ -2019,9 +2023,9 @@ R y 2002 2004 - Ap Su>=1 0 0 - R y 2002 2003 - S Su>=1 0 1 - R y 2004 2009 - O Su>=15 0 1 - R y 2005 2009 - Mar Su>=8 0 0 - -R y 2010 ma - O Su>=1 0 1 - +R y 2010 2024 - O Su>=1 0 1 - R y 2010 2012 - Ap Su>=8 0 0 - -R y 2013 ma - Mar Su>=22 0 0 - +R y 2013 2024 - Mar Su>=22 0 0 - R PE 1938 o - Ja 1 0 1 - R PE 1938 o - Ap 1 0 0 - R PE 1938 1939 - S lastSu 0 1 - @@ -2336,7 +2340,8 @@ Z America/Asuncion -3:50:40 - LMT 1890 -3:50:40 - AMT 1931 O 10 -4 - %z 1972 O -3 - %z 1974 Ap --4 y %z +-4 y %z 2024 O 15 +-3 - %z Z America/Bahia -2:34:4 - LMT 1914 -3 B %z 2003 S 24 -3 - %z 2011 O 16 @@ -3268,10 +3273,10 @@ Z Asia/Makassar 7:57:36 - LMT 1920 8 - %z 1942 F 9 9 - %z 1945 S 23 8 - WITA -Z Asia/Manila -15:56 - LMT 1844 D 31 -8:4 - LMT 1899 May 11 -8 PH P%sT 1942 May -9 - JST 1944 N +Z Asia/Manila -15:56:8 - LMT 1844 D 31 +8:3:52 - LMT 1899 S 6 4u +8 PH P%sT 1942 F 11 24 +9 - JST 1945 Mar 4 8 PH P%sT Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 2 CY EE%sT 1998 S From ddab512ebb97c03d3c0dcfe0ea20d053a31e24d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Tue, 21 Jan 2025 14:53:46 +0100 Subject: [PATCH 084/119] Fix detach of a partition that has a toplevel FK to a partitioned table In common cases, foreign keys are defined on the toplevel partitioned table; but if instead one is defined on a partition and references a partitioned table, and the referencing partition is detached, we would examine the pg_constraint row on the partition being detached, and fail to realize that the sub-constraints must be left alone. This causes the ALTER TABLE DETACH process to fail with ERROR: could not find ON INSERT check triggers of foreign key constraint NNN This is similar but not quite the same as what was fixed by 53af9491a043. This bug doesn't affect branches earlier than 15, because the detach procedure was different there, so we only backpatch down to 15. Fix by skipping such modifying constraints that are children of other constraints being detached. Author: Amul Sul Diagnosys-by: Sami Imseih Discussion: https://postgr.es/m/CAAJ_b97GuPh6wQPbxQS-Zpy16Oh+0aMv-w64QcGrLhCOZZ6p+g@mail.gmail.com --- src/backend/commands/tablecmds.c | 30 +++++++++++++++++++++-- src/test/regress/expected/foreign_key.out | 7 ++++++ src/test/regress/sql/foreign_key.sql | 8 ++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 040eb50078c..954266bc1c5 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -18779,6 +18779,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, HeapTuple tuple, newtuple; Relation trigrel = NULL; + List *fkoids = NIL; if (concurrent) { @@ -18799,6 +18800,27 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, fks = copyObject(RelationGetFKeyList(partRel)); if (fks != NIL) trigrel = table_open(TriggerRelationId, RowExclusiveLock); + + /* + * It's possible that the partition being detached has a foreign key that + * references a partitioned table. When that happens, there are multiple + * pg_constraint rows for the partition: one points to the partitioned + * table itself, while the others point to each of its partitions. Only + * the topmost one is to be considered here; the child constraints must be + * left alone, because conceptually those aren't coming from our parent + * partitioned table, but from this partition itself. + * + * We implement this by collecting all the constraint OIDs in a first scan + * of the FK array, and skipping in the loop below those constraints whose + * parents are listed here. + */ + foreach(cell, fks) + { + ForeignKeyCacheInfo *fk = (ForeignKeyCacheInfo *) lfirst(cell); + + fkoids = lappend_oid(fkoids, fk->conoid); + } + foreach(cell, fks) { ForeignKeyCacheInfo *fk = lfirst(cell); @@ -18812,9 +18834,13 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, elog(ERROR, "cache lookup failed for constraint %u", fk->conoid); conform = (Form_pg_constraint) GETSTRUCT(contup); - /* consider only the inherited foreign keys */ + /* + * Consider only inherited foreign keys, and only if their parents + * aren't in the list. + */ if (conform->contype != CONSTRAINT_FOREIGN || - !OidIsValid(conform->conparentid)) + !OidIsValid(conform->conparentid) || + list_member_oid(fkoids, conform->conparentid)) { ReleaseSysCache(contup); continue; diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 6b8c2f24142..84745b9f60c 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -2339,6 +2339,13 @@ UPDATE pk SET a = 4002 WHERE a = 4000; DELETE FROM pk WHERE a = 4002; UPDATE pk SET a = 4502 WHERE a = 4500; DELETE FROM pk WHERE a = 4502; +-- Also, detaching a partition that has the FK itself should work +-- https://postgr.es/m/CAAJ_b97GuPh6wQPbxQS-Zpy16Oh+0aMv-w64QcGrLhCOZZ6p+g@mail.gmail.com +CREATE TABLE ffk (a int, b int REFERENCES pk) PARTITION BY list (a); +CREATE TABLE ffk1 PARTITION OF ffk FOR VALUES IN (1); +ALTER TABLE ffk1 ADD FOREIGN KEY (a) REFERENCES pk; +ALTER TABLE ffk DETACH PARTITION ffk1; +DROP TABLE ffk, ffk1; CREATE SCHEMA fkpart4; SET search_path TO fkpart4; -- dropping/detaching PARTITIONs is prevented if that would break diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql index 45c7a534cb1..9f4210b26e5 100644 --- a/src/test/regress/sql/foreign_key.sql +++ b/src/test/regress/sql/foreign_key.sql @@ -1672,6 +1672,14 @@ DELETE FROM pk WHERE a = 4002; UPDATE pk SET a = 4502 WHERE a = 4500; DELETE FROM pk WHERE a = 4502; +-- Also, detaching a partition that has the FK itself should work +-- https://postgr.es/m/CAAJ_b97GuPh6wQPbxQS-Zpy16Oh+0aMv-w64QcGrLhCOZZ6p+g@mail.gmail.com +CREATE TABLE ffk (a int, b int REFERENCES pk) PARTITION BY list (a); +CREATE TABLE ffk1 PARTITION OF ffk FOR VALUES IN (1); +ALTER TABLE ffk1 ADD FOREIGN KEY (a) REFERENCES pk; +ALTER TABLE ffk DETACH PARTITION ffk1; +DROP TABLE ffk, ffk1; + CREATE SCHEMA fkpart4; SET search_path TO fkpart4; -- dropping/detaching PARTITIONs is prevented if that would break From 8c57f548534b71b5977ccc7182521acc2dbfddf1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 22 Jan 2025 11:58:20 -0500 Subject: [PATCH 085/119] Repair incorrect handling of AfterTriggerSharedData.ats_modifiedcols. This patch fixes two distinct errors that both ultimately trace to commit 71d60e2aa, which added the ats_modifiedcols field. The more severe error is that ats_modifiedcols wasn't accounted for in afterTriggerAddEvent's scanning loop that looks for a pre-existing duplicate AfterTriggerSharedData. Thus, a new event could be incorrectly matched to an AfterTriggerSharedData that has a different value of ats_modifiedcols, resulting in the wrong tg_updatedcols bitmap getting passed to the trigger whenever it finally gets fired. We'd not noticed because (a) few triggers consult tg_updatedcols, and (b) we had no tests exercising a case where such a trigger was called as an AFTER trigger. In the test case added by this commit, contrib/lo's trigger fails to remove a large object when expected because (without this fix) it thinks the LO OID column hasn't changed. The other problem was introduced by commit ce5aaea8c, which copied the modified-columns bitmap into trigger-related storage. It made a copy for every trigger event, whereas what we really want is to make a new copy only when we make a new AfterTriggerSharedData entry. (We could imagine adding extra logic to reduce the number of bitmap copies still more, but it doesn't look worthwhile at the moment.) In a simple test of an UPDATE of 10000000 rows with a single AFTER trigger, this thinko roughly tripled the amount of memory consumed by the pending-triggers data structures, from 160446744 to 480443440 bytes. Fixing the first problem requires introducing a bms_equal() call into afterTriggerAddEvent's scanning loop, which is slightly annoying from a speed perspective. However, getting rid of the excessive bms_copy() calls from the second problem balances that out; overall speed of trigger operations is the same or slightly better, in my tests. Discussion: https://postgr.es/m/3496294.1737501591@sss.pgh.pa.us Backpatch-through: 13 --- contrib/lo/expected/lo.out | 69 ++++++++++++++++++++++++++++++++++ contrib/lo/sql/lo.sql | 40 ++++++++++++++++++++ src/backend/commands/trigger.c | 18 ++++----- 3 files changed, 117 insertions(+), 10 deletions(-) diff --git a/contrib/lo/expected/lo.out b/contrib/lo/expected/lo.out index c63e4b1c704..1b6c5a85649 100644 --- a/contrib/lo/expected/lo.out +++ b/contrib/lo/expected/lo.out @@ -47,4 +47,73 @@ SELECT lo_get(43214); DELETE FROM image; SELECT lo_get(43214); ERROR: large object 43214 does not exist +-- Now let's try it with an AFTER trigger +DROP TRIGGER t_raster ON image; +CREATE CONSTRAINT TRIGGER t_raster AFTER UPDATE OR DELETE ON image + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); +SELECT lo_create(43223); + lo_create +----------- + 43223 +(1 row) + +SELECT lo_create(43224); + lo_create +----------- + 43224 +(1 row) + +SELECT lo_create(43225); + lo_create +----------- + 43225 +(1 row) + +INSERT INTO image (title, raster) VALUES ('beautiful image', 43223); +SELECT lo_get(43223); + lo_get +-------- + \x +(1 row) + +UPDATE image SET raster = 43224 WHERE title = 'beautiful image'; +SELECT lo_get(43223); -- gone +ERROR: large object 43223 does not exist +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +-- this case used to be buggy +BEGIN; +UPDATE image SET title = 'beautiful image' WHERE title = 'beautiful picture'; +UPDATE image SET raster = 43225 WHERE title = 'beautiful image'; +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +COMMIT; +SELECT lo_get(43224); -- gone +ERROR: large object 43224 does not exist +SELECT lo_get(43225); + lo_get +-------- + \x +(1 row) + +DELETE FROM image; +SELECT lo_get(43225); -- gone +ERROR: large object 43225 does not exist DROP TABLE image; diff --git a/contrib/lo/sql/lo.sql b/contrib/lo/sql/lo.sql index 77039509245..99c3bd1fab3 100644 --- a/contrib/lo/sql/lo.sql +++ b/contrib/lo/sql/lo.sql @@ -27,4 +27,44 @@ DELETE FROM image; SELECT lo_get(43214); +-- Now let's try it with an AFTER trigger + +DROP TRIGGER t_raster ON image; + +CREATE CONSTRAINT TRIGGER t_raster AFTER UPDATE OR DELETE ON image + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); + +SELECT lo_create(43223); +SELECT lo_create(43224); +SELECT lo_create(43225); + +INSERT INTO image (title, raster) VALUES ('beautiful image', 43223); + +SELECT lo_get(43223); + +UPDATE image SET raster = 43224 WHERE title = 'beautiful image'; + +SELECT lo_get(43223); -- gone +SELECT lo_get(43224); + +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; + +SELECT lo_get(43224); + +-- this case used to be buggy +BEGIN; +UPDATE image SET title = 'beautiful image' WHERE title = 'beautiful picture'; +UPDATE image SET raster = 43225 WHERE title = 'beautiful image'; +SELECT lo_get(43224); +COMMIT; + +SELECT lo_get(43224); -- gone +SELECT lo_get(43225); + +DELETE FROM image; + +SELECT lo_get(43225); -- gone + DROP TABLE image; diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 8b1d3b99fe9..cb14b3a2e5a 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -4010,13 +4010,6 @@ afterTriggerCopyBitmap(Bitmapset *src) if (src == NULL) return NULL; - /* Create event context if we didn't already */ - if (afterTriggers.event_cxt == NULL) - afterTriggers.event_cxt = - AllocSetContextCreate(TopTransactionContext, - "AfterTriggerEvents", - ALLOCSET_DEFAULT_SIZES); - oldcxt = MemoryContextSwitchTo(afterTriggers.event_cxt); dst = bms_copy(src); @@ -4118,16 +4111,21 @@ afterTriggerAddEvent(AfterTriggerEventList *events, (char *) newshared >= chunk->endfree; newshared--) { + /* compare fields roughly by probability of them being different */ if (newshared->ats_tgoid == evtshared->ats_tgoid && - newshared->ats_relid == evtshared->ats_relid && newshared->ats_event == evtshared->ats_event && + newshared->ats_firing_id == 0 && newshared->ats_table == evtshared->ats_table && - newshared->ats_firing_id == 0) + newshared->ats_relid == evtshared->ats_relid && + bms_equal(newshared->ats_modifiedcols, + evtshared->ats_modifiedcols)) break; } if ((char *) newshared < chunk->endfree) { *newshared = *evtshared; + /* now we must make a suitably-long-lived copy of the bitmap */ + newshared->ats_modifiedcols = afterTriggerCopyBitmap(evtshared->ats_modifiedcols); newshared->ats_firing_id = 0; /* just to be sure */ chunk->endfree = (char *) newshared; } @@ -6438,7 +6436,7 @@ AfterTriggerSaveEvent(EState *estate, ResultRelInfo *relinfo, new_shared.ats_table = transition_capture->tcs_private; else new_shared.ats_table = NULL; - new_shared.ats_modifiedcols = afterTriggerCopyBitmap(modifiedCols); + new_shared.ats_modifiedcols = modifiedCols; afterTriggerAddEvent(&afterTriggers.query_stack[afterTriggers.query_depth].events, &new_event, &new_shared); From 7ab181a29ba54c3a893587d37afa89a20fdcc75a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 23 Jan 2025 14:23:04 -0500 Subject: [PATCH 086/119] Don't ask for bug reports about pthread_is_threaded_np() != 0. We thought that this condition was unreachable in ExitPostmaster, but actually it's possible if you have both a misconfigured locale setting and some other mistake that causes PostmasterMain to bail out before reaching its own check of pthread_is_threaded_np(). Given the lack of other reports, let's not ask for bug reports if this occurs; instead just give the same hint as in PostmasterMain. Bug: #18783 Reported-by: anani191181515@gmail.com Author: Tom Lane Reviewed-by: Noah Misch Discussion: https://postgr.es/m/18783-d1873b95a59b9103@postgresql.org Discussion: https://postgr.es/m/206317.1737656533@sss.pgh.pa.us Backpatch-through: 13 --- src/backend/postmaster/postmaster.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 110d05d13e2..152a8a17391 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1427,6 +1427,8 @@ PostmasterMain(int argc, char *argv[]) * calls fork() without an immediate exec(), both of which have undefined * behavior in a multithreaded program. A multithreaded postmaster is the * normal case on Windows, which offers neither fork() nor sigprocmask(). + * Currently, macOS is the only platform having pthread_is_threaded_np(), + * so we need not worry whether this HINT is appropriate elsewhere. */ if (pthread_is_threaded_np() != 0) ereport(FATAL, @@ -5048,15 +5050,16 @@ ExitPostmaster(int status) /* * There is no known cause for a postmaster to become multithreaded after - * startup. Recheck to account for the possibility of unknown causes. + * startup. However, we might reach here via an error exit before + * reaching the test in PostmasterMain, so provide the same hint as there. * This message uses LOG level, because an unclean shutdown at this point * would usually not look much different from a clean shutdown. */ if (pthread_is_threaded_np() != 0) ereport(LOG, - (errcode(ERRCODE_INTERNAL_ERROR), - errmsg_internal("postmaster became multithreaded"), - errdetail("Please report this to <%s>.", PACKAGE_BUGREPORT))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("postmaster became multithreaded"), + errhint("Set the LC_ALL environment variable to a valid locale."))); #endif /* should cleanup shared memory and kill all backends */ From 155d6162e4578930d584f75599276de341685b23 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 24 Jan 2025 10:26:12 +0100 Subject: [PATCH 087/119] meson: Fix sepgsql installation The sepgsql.sql file should be installed under share/contrib/, not share/extension/, since it is not an extension. This makes it match what make install does. Discussion: https://www.postgresql.org/message-id/flat/651a5baf-5c45-4a5a-a202-0c8453a4ebf8@eisentraut.org --- contrib/sepgsql/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build index c8e518b49c0..16cfb7df4f4 100644 --- a/contrib/sepgsql/meson.build +++ b/contrib/sepgsql/meson.build @@ -37,7 +37,7 @@ contrib_targets += custom_target('sepgsql.sql', command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'], capture: true, install: true, - install_dir: contrib_data_args['install_dir'], + install_dir: dir_data / 'contrib', ) # TODO: implement sepgsql tests From 92598f4fa58da45226b3414d6d880cf4622481a7 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sat, 25 Jan 2025 00:36:48 +0100 Subject: [PATCH 088/119] Use the correct sizeof() in BufFileLoadBuffer The sizeof() call should reference buffer.data, because that's the buffer we're reading data into, not the whole PGAlignedBuffer union. This was introduced by 44cac93464, which replaced the simple buffer with a PGAlignedBuffer field. It's benign, because the buffer is the largest field of the union, so the sizes are the same. But it's easy to trip over this in a patch, so fix and backpatch. Commit 44cac93464 went into 12, but that's EOL. Backpatch-through: 13 Discussion: https://postgr.es/m/928bdab1-6567-449f-98c4-339cd2203b87@vondra.me --- src/backend/storage/file/buffile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 41ab64100e3..1964a75ca89 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -459,7 +459,7 @@ BufFileLoadBuffer(BufFile *file) */ file->nbytes = FileRead(thisfile, file->buffer.data, - sizeof(file->buffer), + sizeof(file->buffer.data), file->curOffset, WAIT_EVENT_BUFFILE_READ); if (file->nbytes < 0) From 53771e44df810d3fbccc26e71753e8e292125962 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 25 Jan 2025 12:42:05 -0500 Subject: [PATCH 089/119] Doc: recommend "psql -X" for restoring pg_dump scripts. This practice avoids possible problems caused by non-default psql options, such as disabling AUTOCOMMIT. Author: Shinya Kato Reviewed-by: Robert Treat Discussion: https://postgr.es/m/96ff23a5d858ff72ca8e823a014d16fe@oss.nttdata.com Backpatch-through: 13 --- doc/src/sgml/backup.sgml | 22 ++++++++++++++-------- doc/src/sgml/ref/pg_dump.sgml | 10 +++++++++- doc/src/sgml/ref/pg_dumpall.sgml | 15 +++++++++++++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 8cb24d6ae54..fa0d2a763ee 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -106,10 +106,10 @@ pg_dump dbname > Text files created by pg_dump are intended to - be read in by the psql program. The - general command form to restore a dump is + be read by the psql program using its default + settings. The general command form to restore a text dump is -psql dbname < dumpfile +psql -X dbname < dumpfile where dumpfile is the file output by the pg_dump command. The database dbname < template0 before executing psql (e.g., with createdb -T template0 dbname). psql + class="parameter">dbname). + To ensure psql runs with its default settings, + use the () option. + psql supports options similar to pg_dump for specifying the database server to connect to and the user name to use. See the reference page for more information. - Non-text file dumps are restored using the + + + Non-text file dumps should be restored using the utility. @@ -141,7 +147,7 @@ psql dbname < psql exit with an exit status of 3 if an SQL error occurs: -psql --set ON_ERROR_STOP=on dbname < dumpfile +psql -X --set ON_ERROR_STOP=on dbname < dumpfile Either way, you will only have a partially restored database. Alternatively, you can specify that the whole dump should be @@ -160,7 +166,7 @@ psql --set ON_ERROR_STOP=on dbname < write to or read from pipes makes it possible to dump a database directly from one server to another, for example: -pg_dump -h host1 dbname | psql -h host2 dbname +pg_dump -h host1 dbname | psql -X -h host2 dbname @@ -205,7 +211,7 @@ pg_dumpall > dumpfile The resulting dump can be restored with psql: -psql -f dumpfile postgres +psql -X -f dumpfile postgres (Actually, you can specify any existing database name to start from, but if you are loading into an empty cluster then postgres diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index b879c30c180..ec8ea8fd985 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -1479,6 +1479,14 @@ CREATE DATABASE foo WITH TEMPLATE template0; option will be automatically enabled by the subscriber if the subscription had been originally created with two_phase = true option. + + + It is generally recommended to use the + () option when restoring a database from a + plain-text pg_dump script to ensure a clean + restore process and prevent potential conflicts with + non-default psql configurations. + @@ -1496,7 +1504,7 @@ CREATE DATABASE foo WITH TEMPLATE template0; newdb: -$ psql -d newdb -f db.sql +$ psql -X -d newdb -f db.sql diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index d31585216c6..ba005ff19e2 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -786,6 +786,17 @@ PostgreSQL documentation database creation will fail for databases in non-default locations. + + + It is generally recommended to use the + () option when restoring a database from a + pg_dumpall script to ensure a clean restore + process and prevent potential conflicts with non-default + psql configurations. Additionally, because + the pg_dumpall script may + include psql meta-commands, it may be + incompatible with clients other than psql. + @@ -802,9 +813,9 @@ PostgreSQL documentation To restore database(s) from this file, you can use: -$ psql -f db.out postgres +$ psql -X -f db.out -d postgres - It is not important to which database you connect here since the + It is not important which database you connect to here since the script file created by pg_dumpall will contain the appropriate commands to create and connect to the saved databases. An exception is that if you specified , From 3d57f7cf300540bea6939fe5bdd820a606aa2669 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 25 Jan 2025 11:28:14 -0800 Subject: [PATCH 090/119] Test ECPG decadd(), decdiv(), decmul(), and decsub() for risnull() input. Since commit 757fb0e5a9a61ac8d3a67e334faeea6dc0084b3f, these Informix-compat functions return 0 without changing the output parameter. Initialize the output parameter before the test call, making that obvious. Before this, the expected test output has been depending on freed stack memory. "gcc -ftrivial-auto-var-init=pattern" revealed that. Back-patch to v13 (all supported versions). Discussion: https://postgr.es/m/20250106192748.cf.nmisch@google.com --- .../ecpg/test/compat_informix/dec_test.pgc | 10 + .../test/expected/compat_informix-dec_test.c | 10 + .../expected/compat_informix-dec_test.stdout | 232 +++++++++--------- 3 files changed, 136 insertions(+), 116 deletions(-) diff --git a/src/interfaces/ecpg/test/compat_informix/dec_test.pgc b/src/interfaces/ecpg/test/compat_informix/dec_test.pgc index f6a9f425d6f..830ab5890b2 100644 --- a/src/interfaces/ecpg/test/compat_informix/dec_test.pgc +++ b/src/interfaces/ecpg/test/compat_informix/dec_test.pgc @@ -142,6 +142,16 @@ main(void) c = deccmp(decarr[i], decarr[j]); printf("dec[c,%d,%d]: %d\n", i, j, c); + /* + * decarr[count-1] is risnull(), which makes these functions + * return 0 without changing the output parameter. Make that + * clear by initializing each output parameter. + */ + deccvint(7654321, &a); + deccvint(7654321, &s); + deccvint(7654321, &m); + deccvint(7654321, &d); + r = decadd(decarr[i], decarr[j], &a); if (r) { diff --git a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c index 8586650e879..3e68b2e0267 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c +++ b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c @@ -195,6 +195,16 @@ main(void) c = deccmp(decarr[i], decarr[j]); printf("dec[c,%d,%d]: %d\n", i, j, c); + /* + * decarr[count-1] is risnull(), which makes these functions + * return 0 without changing the output parameter. Make that + * clear by initializing each output parameter. + */ + deccvint(7654321, &a); + deccvint(7654321, &s); + deccvint(7654321, &m); + deccvint(7654321, &d); + r = decadd(decarr[i], decarr[j], &a); if (r) { diff --git a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout index 1f8675b3f3c..72791c56b59 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout +++ b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout @@ -222,10 +222,10 @@ dec[s,0,13]: dec[m,0,13]: * dec[d,0,13]: dec[c,0,14]: 2147483647 -dec[a,0,14]: -dec[s,0,14]: -dec[m,0,14]: * -dec[d,0,14]: +dec[a,0,14]: 7654321.0 +dec[s,0,14]: 7654321.0 +dec[m,0,14]: 7654321.0 +dec[d,0,14]: 7654321.0 dec[c,1,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,1,0]: @@ -297,10 +297,10 @@ dec[s,1,13]: -1234567890123456789012345680.91 dec[m,1,13]: -2469135780246913578024691357.82 dec[d,1,13]: -0.0000000000000000000000000016200000145800001 dec[c,1,14]: 2147483647 -dec[a,1,14]: 1234567890123456789012345676.91 -dec[s,1,14]: -1234567890123456789012345680.91 -dec[m,1,14]: -2469135780246913578024691357.82 -dec[d,1,14]: -0.0000000000000000000000000016200000145800001 +dec[a,1,14]: 7654321.0 +dec[s,1,14]: 7654321.0 +dec[m,1,14]: 7654321.0 +dec[d,1,14]: 7654321.0 dec[c,2,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,2,0]: @@ -372,10 +372,10 @@ dec[s,2,13]: dec[m,2,13]: dec[d,2,13]: 0.00000000000000000000000000064314000578826005 dec[c,2,14]: 2147483647 -dec[a,2,14]: -dec[s,2,14]: -dec[m,2,14]: -dec[d,2,14]: 0.00000000000000000000000000064314000578826005 +dec[a,2,14]: 7654321.0 +dec[s,2,14]: 7654321.0 +dec[m,2,14]: 7654321.0 +dec[d,2,14]: 7654321.0 dec[c,3,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,3,0]: @@ -447,10 +447,10 @@ dec[s,3,13]: -1234567890123456789012345675.47 dec[m,3,13]: dec[d,3,13]: 0.0000000000000000000000000027864000250776002 dec[c,3,14]: 2147483647 -dec[a,3,14]: 1234567890123456789012345682.35 -dec[s,3,14]: -1234567890123456789012345675.47 -dec[m,3,14]: -dec[d,3,14]: 0.0000000000000000000000000027864000250776002 +dec[a,3,14]: 7654321.0 +dec[s,3,14]: 7654321.0 +dec[m,3,14]: 7654321.0 +dec[d,3,14]: 7654321.0 dec[c,4,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,4,0]: @@ -522,10 +522,10 @@ dec[s,4,13]: -1233975400123456789012345678.91 dec[m,4,13]: dec[d,4,13]: 0.00047991690431925214 dec[c,4,14]: 2147483647 -dec[a,4,14]: 1235160380123456789012345678.91 -dec[s,4,14]: -1233975400123456789012345678.91 -dec[m,4,14]: -dec[d,4,14]: 0.00047991690431925214 +dec[a,4,14]: 7654321.0 +dec[s,4,14]: 7654321.0 +dec[m,4,14]: 7654321.0 +dec[d,4,14]: 7654321.0 dec[c,5,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,5,0]: @@ -597,10 +597,10 @@ dec[s,5,13]: -1234567890123456789012674078.91 dec[m,5,13]: dec[d,5,13]: -0.00000000000000000000026600400239403602 dec[c,5,14]: 2147483647 -dec[a,5,14]: 1234567890123456789012017278.91 -dec[s,5,14]: -1234567890123456789012674078.91 -dec[m,5,14]: -dec[d,5,14]: -0.00000000000000000000026600400239403602 +dec[a,5,14]: 7654321.0 +dec[s,5,14]: 7654321.0 +dec[m,5,14]: 7654321.0 +dec[d,5,14]: 7654321.0 dec[c,6,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,6,0]: @@ -672,10 +672,10 @@ dec[s,6,13]: dec[m,6,13]: * dec[d,6,13]: * dec[c,6,14]: 2147483647 -dec[a,6,14]: -dec[s,6,14]: -dec[m,6,14]: * -dec[d,6,14]: * +dec[a,6,14]: 7654321.0 +dec[s,6,14]: 7654321.0 +dec[m,6,14]: 7654321.0 +dec[d,6,14]: 7654321.0 dec[c,7,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,7,0]: @@ -747,10 +747,10 @@ dec[s,7,13]: dec[m,7,13]: 1234567890123456789012345.67891 dec[d,7,13]: 0.00000000000000000000000000000081000000729000007 dec[c,7,14]: 2147483647 -dec[a,7,14]: -dec[s,7,14]: -dec[m,7,14]: 1234567890123456789012345.67891 -dec[d,7,14]: 0.00000000000000000000000000000081000000729000007 +dec[a,7,14]: 7654321.0 +dec[s,7,14]: 7654321.0 +dec[m,7,14]: 7654321.0 +dec[d,7,14]: 7654321.0 dec[c,8,0]: -1 dec[a,8,0]: * dec[s,8,0]: * @@ -822,10 +822,10 @@ dec[s,8,13]: -1234567890123456789012345678.91 dec[m,8,13]: 0.000 dec[d,8,13]: 0 dec[c,8,14]: 2147483647 -dec[a,8,14]: 1234567890123456789012345678.91 -dec[s,8,14]: -1234567890123456789012345678.91 -dec[m,8,14]: 0.000 -dec[d,8,14]: 0 +dec[a,8,14]: 7654321.0 +dec[s,8,14]: 7654321.0 +dec[m,8,14]: 7654321.0 +dec[d,8,14]: 7654321.0 dec[c,9,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,9,0]: @@ -897,10 +897,10 @@ dec[s,9,13]: dec[m,9,13]: dec[d,9,13]: -0.000000000000000000000000000000047991690431925214 dec[c,9,14]: 2147483647 -dec[a,9,14]: -dec[s,9,14]: -dec[m,9,14]: -dec[d,9,14]: -0.000000000000000000000000000000047991690431925214 +dec[a,9,14]: 7654321.0 +dec[s,9,14]: 7654321.0 +dec[m,9,14]: 7654321.0 +dec[d,9,14]: 7654321.0 dec[c,10,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,10,0]: @@ -972,10 +972,10 @@ dec[s,10,13]: dec[m,10,13]: dec[d,10,13]: 0.0000000000000000000000000000026600400239403602 dec[c,10,14]: 2147483647 -dec[a,10,14]: -dec[s,10,14]: -dec[m,10,14]: -dec[d,10,14]: 0.0000000000000000000000000000026600400239403602 +dec[a,10,14]: 7654321.0 +dec[s,10,14]: 7654321.0 +dec[m,10,14]: 7654321.0 +dec[d,10,14]: 7654321.0 dec[c,11,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,11,0]: @@ -1047,10 +1047,10 @@ dec[s,11,13]: dec[m,11,13]: dec[d,11,13]: 0.00000000000000000000000000040500081364500732 dec[c,11,14]: 2147483647 -dec[a,11,14]: -dec[s,11,14]: -dec[m,11,14]: -dec[d,11,14]: 0.00000000000000000000000000040500081364500732 +dec[a,11,14]: 7654321.0 +dec[s,11,14]: 7654321.0 +dec[m,11,14]: 7654321.0 +dec[d,11,14]: 7654321.0 dec[c,12,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,12,0]: @@ -1122,10 +1122,10 @@ dec[s,12,13]: dec[m,12,13]: dec[d,12,13]: -0.00000000000000000000000000040500008464500076 dec[c,12,14]: 2147483647 -dec[a,12,14]: -dec[s,12,14]: -dec[m,12,14]: -dec[d,12,14]: -0.00000000000000000000000000040500008464500076 +dec[a,12,14]: 7654321.0 +dec[s,12,14]: 7654321.0 +dec[m,12,14]: 7654321.0 +dec[d,12,14]: 7654321.0 dec[c,13,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,13,0]: @@ -1197,85 +1197,85 @@ dec[s,13,13]: 0.00 dec[m,13,13]: dec[d,13,13]: 1.00000000000000000 dec[c,13,14]: 2147483647 -dec[a,13,14]: 2469135780246913578024691357.82 -dec[s,13,14]: 0.00 -dec[m,13,14]: -dec[d,13,14]: 1.00000000000000000 +dec[a,13,14]: 7654321.0 +dec[s,13,14]: 7654321.0 +dec[m,13,14]: 7654321.0 +dec[d,13,14]: 7654321.0 dec[c,14,0]: 2147483647 -dec[a,14,0]: 2469135780246913578024691357.82 -dec[s,14,0]: 0.00 -dec[m,14,0]: -dec[d,14,0]: 1.00000000000000000 +dec[a,14,0]: 7654321.0 +dec[s,14,0]: 7654321.0 +dec[m,14,0]: 7654321.0 +dec[d,14,0]: 7654321.0 dec[c,14,1]: 2147483647 -dec[a,14,1]: 2469135780246913578024691357.82 -dec[s,14,1]: 0.00 -dec[m,14,1]: -dec[d,14,1]: 1.00000000000000000 +dec[a,14,1]: 7654321.0 +dec[s,14,1]: 7654321.0 +dec[m,14,1]: 7654321.0 +dec[d,14,1]: 7654321.0 dec[c,14,2]: 2147483647 -dec[a,14,2]: 2469135780246913578024691357.82 -dec[s,14,2]: 0.00 -dec[m,14,2]: -dec[d,14,2]: 1.00000000000000000 +dec[a,14,2]: 7654321.0 +dec[s,14,2]: 7654321.0 +dec[m,14,2]: 7654321.0 +dec[d,14,2]: 7654321.0 dec[c,14,3]: 2147483647 -dec[a,14,3]: 2469135780246913578024691357.82 -dec[s,14,3]: 0.00 -dec[m,14,3]: -dec[d,14,3]: 1.00000000000000000 +dec[a,14,3]: 7654321.0 +dec[s,14,3]: 7654321.0 +dec[m,14,3]: 7654321.0 +dec[d,14,3]: 7654321.0 dec[c,14,4]: 2147483647 -dec[a,14,4]: 2469135780246913578024691357.82 -dec[s,14,4]: 0.00 -dec[m,14,4]: -dec[d,14,4]: 1.00000000000000000 +dec[a,14,4]: 7654321.0 +dec[s,14,4]: 7654321.0 +dec[m,14,4]: 7654321.0 +dec[d,14,4]: 7654321.0 dec[c,14,5]: 2147483647 -dec[a,14,5]: 2469135780246913578024691357.82 -dec[s,14,5]: 0.00 -dec[m,14,5]: -dec[d,14,5]: 1.00000000000000000 +dec[a,14,5]: 7654321.0 +dec[s,14,5]: 7654321.0 +dec[m,14,5]: 7654321.0 +dec[d,14,5]: 7654321.0 dec[c,14,6]: 2147483647 -dec[a,14,6]: 2469135780246913578024691357.82 -dec[s,14,6]: 0.00 -dec[m,14,6]: -dec[d,14,6]: 1.00000000000000000 +dec[a,14,6]: 7654321.0 +dec[s,14,6]: 7654321.0 +dec[m,14,6]: 7654321.0 +dec[d,14,6]: 7654321.0 dec[c,14,7]: 2147483647 -dec[a,14,7]: 2469135780246913578024691357.82 -dec[s,14,7]: 0.00 -dec[m,14,7]: -dec[d,14,7]: 1.00000000000000000 +dec[a,14,7]: 7654321.0 +dec[s,14,7]: 7654321.0 +dec[m,14,7]: 7654321.0 +dec[d,14,7]: 7654321.0 dec[c,14,8]: 2147483647 -dec[a,14,8]: 2469135780246913578024691357.82 -dec[s,14,8]: 0.00 -dec[m,14,8]: -dec[d,14,8]: 1.00000000000000000 +dec[a,14,8]: 7654321.0 +dec[s,14,8]: 7654321.0 +dec[m,14,8]: 7654321.0 +dec[d,14,8]: 7654321.0 dec[c,14,9]: 2147483647 -dec[a,14,9]: 2469135780246913578024691357.82 -dec[s,14,9]: 0.00 -dec[m,14,9]: -dec[d,14,9]: 1.00000000000000000 +dec[a,14,9]: 7654321.0 +dec[s,14,9]: 7654321.0 +dec[m,14,9]: 7654321.0 +dec[d,14,9]: 7654321.0 dec[c,14,10]: 2147483647 -dec[a,14,10]: 2469135780246913578024691357.82 -dec[s,14,10]: 0.00 -dec[m,14,10]: -dec[d,14,10]: 1.00000000000000000 +dec[a,14,10]: 7654321.0 +dec[s,14,10]: 7654321.0 +dec[m,14,10]: 7654321.0 +dec[d,14,10]: 7654321.0 dec[c,14,11]: 2147483647 -dec[a,14,11]: 2469135780246913578024691357.82 -dec[s,14,11]: 0.00 -dec[m,14,11]: -dec[d,14,11]: 1.00000000000000000 +dec[a,14,11]: 7654321.0 +dec[s,14,11]: 7654321.0 +dec[m,14,11]: 7654321.0 +dec[d,14,11]: 7654321.0 dec[c,14,12]: 2147483647 -dec[a,14,12]: 2469135780246913578024691357.82 -dec[s,14,12]: 0.00 -dec[m,14,12]: -dec[d,14,12]: 1.00000000000000000 +dec[a,14,12]: 7654321.0 +dec[s,14,12]: 7654321.0 +dec[m,14,12]: 7654321.0 +dec[d,14,12]: 7654321.0 dec[c,14,13]: 2147483647 -dec[a,14,13]: 2469135780246913578024691357.82 -dec[s,14,13]: 0.00 -dec[m,14,13]: -dec[d,14,13]: 1.00000000000000000 +dec[a,14,13]: 7654321.0 +dec[s,14,13]: 7654321.0 +dec[m,14,13]: 7654321.0 +dec[d,14,13]: 7654321.0 dec[c,14,14]: 2147483647 -dec[a,14,14]: 2469135780246913578024691357.82 -dec[s,14,14]: 0.00 -dec[m,14,14]: -dec[d,14,14]: 1.00000000000000000 +dec[a,14,14]: 7654321.0 +dec[s,14,14]: 7654321.0 +dec[m,14,14]: 7654321.0 +dec[d,14,14]: 7654321.0 0: * 1: -2 2: 0.794 From 9311fcb8648075782f59d534010352264bf8dc54 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 25 Jan 2025 11:28:14 -0800 Subject: [PATCH 091/119] At update of non-LP_NORMAL TID, fail instead of corrupting page header. The right mix of DDL and VACUUM could corrupt a catalog page header such that PageIsVerified() durably fails, requiring a restore from backup. This affects only catalogs that both have a syscache and have DDL code that uses syscache tuples to construct updates. One of the test permutations shows a variant not yet fixed. This makes !TransactionIdIsValid(TM_FailureData.xmax) possible with TM_Deleted. I think core and PGXN are indifferent to that. Per bug #17821 from Alexander Lakhin. Back-patch to v13 (all supported versions). The test case is v17+, since it uses INJECTION_POINT. Discussion: https://postgr.es/m/17821-dd8c334263399284@postgresql.org --- src/backend/access/heap/heapam.c | 47 +++++++++++++++++++++++++++++++- src/include/access/tableam.h | 3 +- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 723e34e4646..429dc2cebe3 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -73,6 +73,7 @@ #include "utils/relcache.h" #include "utils/snapmgr.h" #include "utils/spccache.h" +#include "utils/syscache.h" static HeapTuple heap_prepare_insert(Relation relation, HeapTuple tup, @@ -3110,7 +3111,51 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); lp = PageGetItemId(page, ItemPointerGetOffsetNumber(otid)); - Assert(ItemIdIsNormal(lp)); + + /* + * Usually, a buffer pin and/or snapshot blocks pruning of otid, ensuring + * we see LP_NORMAL here. When the otid origin is a syscache, we may have + * neither a pin nor a snapshot. Hence, we may see other LP_ states, each + * of which indicates concurrent pruning. + * + * Failing with TM_Updated would be most accurate. However, unlike other + * TM_Updated scenarios, we don't know the successor ctid in LP_UNUSED and + * LP_DEAD cases. While the distinction between TM_Updated and TM_Deleted + * does matter to SQL statements UPDATE and MERGE, those SQL statements + * hold a snapshot that ensures LP_NORMAL. Hence, the choice between + * TM_Updated and TM_Deleted affects only the wording of error messages. + * Settle on TM_Deleted, for two reasons. First, it avoids complicating + * the specification of when tmfd->ctid is valid. Second, it creates + * error log evidence that we took this branch. + * + * Since it's possible to see LP_UNUSED at otid, it's also possible to see + * LP_NORMAL for a tuple that replaced LP_UNUSED. If it's a tuple for an + * unrelated row, we'll fail with "duplicate key value violates unique". + * XXX if otid is the live, newer version of the newtup row, we'll discard + * changes originating in versions of this catalog row after the version + * the caller got from syscache. See syscache-update-pruned.spec. + */ + if (!ItemIdIsNormal(lp)) + { + Assert(RelationSupportsSysCache(RelationGetRelid(relation))); + + UnlockReleaseBuffer(buffer); + Assert(!have_tuple_lock); + if (vmbuffer != InvalidBuffer) + ReleaseBuffer(vmbuffer); + tmfd->ctid = *otid; + tmfd->xmax = InvalidTransactionId; + tmfd->cmax = InvalidCommandId; + *update_indexes = TU_None; + + bms_free(hot_attrs); + bms_free(sum_attrs); + bms_free(key_attrs); + bms_free(id_attrs); + /* modified_attrs not yet initialized */ + bms_free(interesting_attrs); + return TM_Deleted; + } /* * Fill in enough data in oldtup for HeapDetermineColumnsInfo to work diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 5e195fd292f..2e919d569af 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -129,7 +129,8 @@ typedef enum TU_UpdateIndexes * * xmax is the outdating transaction's XID. If the caller wants to visit the * replacement tuple, it must check that this matches before believing the - * replacement is really a match. + * replacement is really a match. This is InvalidTransactionId if the target + * was !LP_NORMAL (expected only for a TID retrieved from syscache). * * cmax is the outdating command's CID, but only when the failure code is * TM_SelfModified (i.e., something in the current transaction outdated the From 998c4fc7c2c89abad4171f78f9375bd31713b5ca Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 29 Jan 2025 14:24:36 -0500 Subject: [PATCH 092/119] Avoid breaking SJIS encoding while de-backslashing Windows paths. When running on Windows, canonicalize_path() converts '\' to '/' to prevent confusing the Windows command processor. It was doing that in a non-encoding-aware fashion; but in SJIS there are valid two-byte characters whose second byte matches '\'. So encoding corruption ensues if such a character is used in the path. We can fairly easily fix this if we know which encoding is in use, but a lot of our utilities don't have much of a clue about that. After some discussion we decided we'd settle for fixing this only in psql, and assuming that its value of client_encoding matches what the user is typing. It seems hopeless to get the server to deal with the problematic characters in database path names, so we'll just declare that case to be unsupported. That means nothing need be done in the server, nor in utility programs whose only contact with file path names is for database paths. But psql frequently deals with client-side file paths, so it'd be good if it didn't mess those up. Bug: #18735 Reported-by: Koichi Suzuki Author: Tom Lane Reviewed-by: Koichi Suzuki Discussion: https://postgr.es/m/18735-4acdb3998bb9f2b1@postgresql.org Backpatch-through: 13 --- src/bin/psql/command.c | 8 ++-- src/bin/psql/copy.c | 2 +- src/include/port.h | 1 + src/port/path.c | 105 +++++++++++++++++++++++++++++++++++------ 4 files changed, 97 insertions(+), 19 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index d0ee47b517d..e2e639ce76d 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1107,7 +1107,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch, expand_tilde(&fname); if (fname) { - canonicalize_path(fname); + canonicalize_path_enc(fname, pset.encoding); /* Always clear buffer if the file isn't modified */ discard_on_quit = true; } @@ -2701,7 +2701,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch, } else { - canonicalize_path(fname); + canonicalize_path_enc(fname, pset.encoding); fd = fopen(fname, "w"); } if (!fd) @@ -4209,7 +4209,7 @@ process_file(char *filename, bool use_relative_path) } else if (strcmp(filename, "-") != 0) { - canonicalize_path(filename); + canonicalize_path_enc(filename, pset.encoding); /* * If we were asked to resolve the pathname relative to the location @@ -4223,7 +4223,7 @@ process_file(char *filename, bool use_relative_path) strlcpy(relpath, pset.inputfile, sizeof(relpath)); get_parent_directory(relpath); join_path_components(relpath, relpath, filename); - canonicalize_path(relpath); + canonicalize_path_enc(relpath, pset.encoding); filename = relpath; } diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index 8d6ce4cedd7..c6013d8194f 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -280,7 +280,7 @@ do_copy(const char *args) /* prepare to read or write the target file */ if (options->file && !options->program) - canonicalize_path(options->file); + canonicalize_path_enc(options->file, pset.encoding); if (options->from) { diff --git a/src/include/port.h b/src/include/port.h index e7212097285..abbb88d2caf 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -53,6 +53,7 @@ extern char *first_path_var_separator(const char *pathlist); extern void join_path_components(char *ret_path, const char *head, const char *tail); extern void canonicalize_path(char *path); +extern void canonicalize_path_enc(char *path, int encoding); extern void make_native_path(char *filename); extern void cleanup_path(char *path); extern bool path_contains_parent_reference(const char *path); diff --git a/src/port/path.c b/src/port/path.c index 65c7943fee1..817f6b08348 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -35,6 +35,7 @@ #include #endif +#include "mb/pg_wchar.h" #include "pg_config_paths.h" @@ -44,6 +45,10 @@ #define IS_PATH_VAR_SEP(ch) ((ch) == ';') #endif +#ifdef WIN32 +static void debackslash_path(char *path, int encoding); +static int pg_sjis_mblen(const unsigned char *s); +#endif static void make_relative_path(char *ret_path, const char *target_path, const char *bin_path, const char *my_exec_path); static char *trim_directory(char *path); @@ -148,10 +153,73 @@ last_dir_separator(const char *filename) } +#ifdef WIN32 + +/* + * Convert '\' to '/' within the given path, assuming the path + * is in the specified encoding. + */ +static void +debackslash_path(char *path, int encoding) +{ + char *p; + + /* + * Of the supported encodings, only Shift-JIS has multibyte characters + * that can include a byte equal to '\' (0x5C). So rather than implement + * a fully encoding-aware conversion, we special-case SJIS. (Invoking the + * general encoding-aware logic in wchar.c is impractical here for + * assorted reasons.) + */ + if (encoding == PG_SJIS) + { + for (p = path; *p; p += pg_sjis_mblen((const unsigned char *) p)) + { + if (*p == '\\') + *p = '/'; + } + } + else + { + for (p = path; *p; p++) + { + if (*p == '\\') + *p = '/'; + } + } +} + /* - * make_native_path - on WIN32, change / to \ in the path + * SJIS character length * - * This effectively undoes canonicalize_path. + * This must match the behavior of + * pg_encoding_mblen_bounded(PG_SJIS, s) + * In particular, unlike the version of pg_sjis_mblen in src/common/wchar.c, + * do not allow caller to accidentally step past end-of-string. + */ +static int +pg_sjis_mblen(const unsigned char *s) +{ + int len; + + if (*s >= 0xa1 && *s <= 0xdf) + len = 1; /* 1 byte kana? */ + else if (IS_HIGHBIT_SET(*s) && s[1] != '\0') + len = 2; /* kanji? */ + else + len = 1; /* should be ASCII */ + return len; +} + +#endif /* WIN32 */ + + +/* + * make_native_path - on WIN32, change '/' to '\' in the path + * + * This reverses the '\'-to-'/' transformation of debackslash_path. + * We need not worry about encodings here, since '/' does not appear + * as a byte of a multibyte character in any supported encoding. * * This is required because WIN32 COPY is an internal CMD.EXE * command and doesn't process forward slashes in the same way @@ -181,13 +249,14 @@ make_native_path(char *filename) * on Windows. We need them to use filenames without spaces, for which a * short filename is the safest equivalent, eg: * C:/Progra~1/ + * + * Presently, this is only used on paths that we can assume are in a + * server-safe encoding, so there's no need for an encoding-aware variant. */ void cleanup_path(char *path) { #ifdef WIN32 - char *ptr; - /* * GetShortPathName() will fail if the path does not exist, or short names * are disabled on this file system. In both cases, we just return the @@ -197,11 +266,8 @@ cleanup_path(char *path) GetShortPathName(path, path, MAXPGPATH - 1); /* Replace '\' with '/' */ - for (ptr = path; *ptr; ptr++) - { - if (*ptr == '\\') - *ptr = '/'; - } + /* All server-safe encodings are alike here, so just use PG_SQL_ASCII */ + debackslash_path(path, PG_SQL_ASCII); #endif } @@ -252,6 +318,8 @@ typedef enum } canonicalize_state; /* + * canonicalize_path() + * * Clean up path by: * o make Win32 path use Unix slashes * o remove trailing quote on Win32 @@ -259,9 +327,20 @@ typedef enum * o remove duplicate (adjacent) separators * o remove '.' (unless path reduces to only '.') * o process '..' ourselves, removing it if possible + * Modifies path in-place. + * + * This comes in two variants: encoding-aware and not. The non-aware version + * is only safe to use on strings that are in a server-safe encoding. */ void canonicalize_path(char *path) +{ + /* All server-safe encodings are alike here, so just use PG_SQL_ASCII */ + canonicalize_path_enc(path, PG_SQL_ASCII); +} + +void +canonicalize_path_enc(char *path, int encoding) { char *p, *to_p; @@ -277,17 +356,15 @@ canonicalize_path(char *path) /* * The Windows command processor will accept suitably quoted paths with * forward slashes, but barfs badly with mixed forward and back slashes. + * Hence, start by converting all back slashes to forward slashes. */ - for (p = path; *p; p++) - { - if (*p == '\\') - *p = '/'; - } + debackslash_path(path, encoding); /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass \c\d" * as argv[2], so trim off trailing quote. */ + p = path + strlen(path); if (p > path && *(p - 1) == '"') *(p - 1) = '/'; #endif From 6655d931c659fda68cce090b7214cb1a9d4cfc65 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 29 Jan 2025 15:31:55 -0500 Subject: [PATCH 093/119] Handle default NULL insertion a little better. If a column is omitted in an INSERT, and there's no column default, the code in preptlist.c generates a NULL Const to be inserted. Furthermore, if the column is of a domain type, we wrap the Const in CoerceToDomain, so as to throw a run-time error if the domain has a NOT NULL constraint. That's fine as far as it goes, but there are two problems: 1. We're being sloppy about the type/typmod that the Const is labeled with. It really should have the domain's base type/typmod, since it's the input to CoerceToDomain not the output. This can result in coerce_to_domain inserting a useless length-coercion function (useless because it's being applied to a null). The coercion would typically get const-folded away later, but it'd be better not to create it in the first place. 2. We're not applying expression preprocessing (specifically, eval_const_expressions) to the resulting expression tree. The planner's primary expression-preprocessing pass already happened, so that means the length coercion step and CoerceToDomain node miss preprocessing altogether. This is at the least inefficient, since it means the length coercion and CoerceToDomain will actually be executed for each inserted row, though they could be const-folded away in most cases. Worse, it seems possible that missing preprocessing for the length coercion could result in an invalid plan (for example, due to failing to perform default-function-argument insertion). I'm not aware of any live bug of that sort with core datatypes, and it might be unreachable for extension types as well because of restrictions of CREATE CAST, but I'm not entirely convinced that it's unreachable. Hence, it seems worth back-patching the fix (although I only went back to v14, as the patch doesn't apply cleanly at all in v13). There are several places in the rewriter that are building null domain constants the same way as preptlist.c. While those are before the planner and hence don't have any reachable bug, they're still applying a length coercion that will be const-folded away later, uselessly wasting cycles. Hence, make a utility routine that all of these places can call to do it right. Making this code more careful about the typmod assigned to the generated NULL constant has visible but cosmetic effects on some of the plans shown in contrib/postgres_fdw's regression tests. Discussion: https://postgr.es/m/1865579.1738113656@sss.pgh.pa.us Backpatch-through: 14 --- .../postgres_fdw/expected/postgres_fdw.out | 24 +++++------ src/backend/optimizer/prep/preptlist.c | 34 +++++++-------- src/backend/parser/parse_coerce.c | 37 ++++++++++++++++ src/backend/rewrite/rewriteHandler.c | 42 +++++-------------- src/backend/rewrite/rewriteManip.c | 30 ++++++------- src/include/parser/parse_coerce.h | 3 ++ 6 files changed, 92 insertions(+), 78 deletions(-) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 9b7a7eed057..b534d860560 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -4292,13 +4292,13 @@ EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6; PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo'); EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft1 Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft1 '::character(10), NULL::user_enum + Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft1 '::character(10), NULL::user_enum (5 rows) ALTER TABLE "S 1"."T 1" RENAME TO "T 0"; @@ -4326,13 +4326,13 @@ EXECUTE st6; (9 rows) EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft1 Remote SQL: INSERT INTO "S 1"."T 0"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft1 '::character(10), NULL::user_enum + Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft1 '::character(10), NULL::user_enum (5 rows) ALTER TABLE "S 1"."T 0" RENAME TO "T 1"; @@ -4703,13 +4703,13 @@ explain (verbose, costs off) select * from ft3 f, loct3 l -- =================================================================== EXPLAIN (verbose, costs off) INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20; - QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Insert on public.ft2 Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Subquery Scan on "*SELECT*" - Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1", NULL::integer, "*SELECT*"."?column?_2", NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft2 '::character(10), NULL::user_enum + Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1", NULL::integer, "*SELECT*"."?column?_2", NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft2 '::character(10), NULL::user_enum -> Foreign Scan on public.ft2 ft2_1 Output: (ft2_1.c1 + 1000), (ft2_1.c2 + 100), (ft2_1.c3 || ft2_1.c3) Remote SQL: SELECT "C 1", c2, c3 FROM "S 1"."T 1" LIMIT 20::bigint @@ -5819,14 +5819,14 @@ SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1; EXPLAIN (verbose, costs off) INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo') RETURNING tableoid::regclass; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft2 Output: (ft2.tableoid)::regclass Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: 1200, 999, NULL::integer, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft2 '::character(10), NULL::user_enum + Output: 1200, 999, NULL::integer, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft2 '::character(10), NULL::user_enum (6 rows) INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo') RETURNING tableoid::regclass; diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index 9d46488ef7c..d60972dd983 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -46,7 +46,8 @@ #include "parser/parsetree.h" #include "utils/rel.h" -static List *expand_insert_targetlist(List *tlist, Relation rel); +static List *expand_insert_targetlist(PlannerInfo *root, List *tlist, + Relation rel); /* @@ -102,7 +103,7 @@ preprocess_targetlist(PlannerInfo *root) */ tlist = parse->targetList; if (command_type == CMD_INSERT) - tlist = expand_insert_targetlist(tlist, target_relation); + tlist = expand_insert_targetlist(root, tlist, target_relation); else if (command_type == CMD_UPDATE) root->update_colnos = extract_update_targetlist_colnos(tlist); @@ -148,7 +149,8 @@ preprocess_targetlist(PlannerInfo *root) ListCell *l2; if (action->commandType == CMD_INSERT) - action->targetList = expand_insert_targetlist(action->targetList, + action->targetList = expand_insert_targetlist(root, + action->targetList, target_relation); else if (action->commandType == CMD_UPDATE) action->updateColnos = @@ -352,7 +354,7 @@ extract_update_targetlist_colnos(List *tlist) * but now this code is only applied to INSERT targetlists. */ static List * -expand_insert_targetlist(List *tlist, Relation rel) +expand_insert_targetlist(PlannerInfo *root, List *tlist, Relation rel) { List *new_tlist = NIL; ListCell *tlist_item; @@ -406,26 +408,18 @@ expand_insert_targetlist(List *tlist, Relation rel) * confuse code comparing the finished plan to the target * relation, however. */ - Oid atttype = att_tup->atttypid; - Oid attcollation = att_tup->attcollation; Node *new_expr; if (!att_tup->attisdropped) { - new_expr = (Node *) makeConst(atttype, - -1, - attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - atttype, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); + /* Must run expression preprocessing on any non-const nodes */ + if (!IsA(new_expr, Const)) + new_expr = eval_const_expressions(root, new_expr); } else { diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 52787b67943..dd55b30b494 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -1263,6 +1263,43 @@ coerce_to_specific_type(ParseState *pstate, Node *node, constructName); } +/* + * coerce_null_to_domain() + * Build a NULL constant, then wrap it in CoerceToDomain + * if the desired type is a domain type. This allows any + * NOT NULL domain constraint to be enforced at runtime. + */ +Node * +coerce_null_to_domain(Oid typid, int32 typmod, Oid collation, + int typlen, bool typbyval) +{ + Node *result; + Oid baseTypeId; + int32 baseTypeMod = typmod; + + /* + * The constant must appear to have the domain's base type/typmod, else + * coerce_to_domain() will apply a length coercion which is useless. + */ + baseTypeId = getBaseTypeAndTypmod(typid, &baseTypeMod); + result = (Node *) makeConst(baseTypeId, + baseTypeMod, + collation, + typlen, + (Datum) 0, + true, /* isnull */ + typbyval); + if (typid != baseTypeId) + result = coerce_to_domain(result, + baseTypeId, baseTypeMod, + typid, + COERCION_IMPLICIT, + COERCE_IMPLICIT_CAST, + -1, + false); + return result; +} + /* * parser_coercion_errposition - report coercion error location, if possible * diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 27d4f718843..57f075de394 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -1004,23 +1004,11 @@ rewriteTargetListIU(List *targetList, if (commandType == CMD_INSERT) new_tle = NULL; else - { - new_expr = (Node *) makeConst(att_tup->atttypid, - -1, - att_tup->attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - /* this is to catch a NOT NULL domain constraint */ - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - att_tup->atttypid, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); - } + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); } if (new_expr) @@ -1582,21 +1570,11 @@ rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, continue; } - new_expr = (Node *) makeConst(att_tup->atttypid, - -1, - att_tup->attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - /* this is to catch a NOT NULL domain constraint */ - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - att_tup->atttypid, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); } newList = lappend(newList, new_expr); } diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 615160aa129..7e9fe8e823c 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -22,6 +22,7 @@ #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "rewrite/rewriteManip.h" +#include "utils/lsyscache.h" typedef struct @@ -1713,20 +1714,21 @@ ReplaceVarsFromTargetList_callback(Var *var, return (Node *) var; case REPLACEVARS_SUBSTITUTE_NULL: - - /* - * If Var is of domain type, we should add a CoerceToDomain - * node, in case there is a NOT NULL domain constraint. - */ - return coerce_to_domain((Node *) makeNullConst(var->vartype, - var->vartypmod, - var->varcollid), - InvalidOid, -1, - var->vartype, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); + { + /* + * If Var is of domain type, we must add a CoerceToDomain + * node, in case there is a NOT NULL domain constraint. + */ + int16 vartyplen; + bool vartypbyval; + + get_typlenbyval(var->vartype, &vartyplen, &vartypbyval); + return coerce_null_to_domain(var->vartype, + var->vartypmod, + var->varcollid, + vartyplen, + vartypbyval); + } } elog(ERROR, "could not find replacement targetlist entry for attno %d", var->varattno); diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h index 35ce4a3547a..63486622631 100644 --- a/src/include/parser/parse_coerce.h +++ b/src/include/parser/parse_coerce.h @@ -63,6 +63,9 @@ extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node, Oid targetTypeId, int32 targetTypmod, const char *constructName); +extern Node *coerce_null_to_domain(Oid typid, int32 typmod, Oid collation, + int typlen, bool typbyval); + extern int parser_coercion_errposition(ParseState *pstate, int coerce_location, Node *input_expr); From f7a08b6e96eeedde1104a68220a9717ceb2c4ec9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 30 Jan 2025 15:36:07 -0500 Subject: [PATCH 094/119] Avoid integer overflow while testing wal_skip_threshold condition. smgrDoPendingSyncs had two distinct risks of integer overflow while deciding which way to ensure durability of a newly-created relation. First, it accumulated the total size of all forks in a variable of type BlockNumber (uint32). While we restrict an individual fork's size to fit in that, I don't believe there's such a restriction on all of them added together. Second, it proceeded to multiply the sum by BLCKSZ, which most certainly could overflow a uint32. (The exact expression is total_blocks * BLCKSZ / 1024. The compiler might choose to optimize that to total_blocks * 8, which is not at quite as much risk of overflow as a literal reading would be, but it's still wrong.) If an overflow did occur it could lead to a poor choice to shove a very large relation into WAL instead of fsync'ing it. This wouldn't be fatal, but it could be inefficient. Change total_blocks to uint64 which should be plenty, and rearrange the comparison calculation to be overflow-safe. I noticed this while looking for ramifications of the proposed change in MAX_KILOBYTES. It's not entirely clear to me why wal_skip_threshold is limited to MAX_KILOBYTES in the first place, but in any case this code is unsafe regardless of the range of wal_skip_threshold. Oversight in c6b92041d which introduced wal_skip_threshold, so back-patch to v13. Discussion: https://postgr.es/m/1a01f0-66ec2d80-3b-68487680@27595217 Backpatch-through: 13 --- src/backend/catalog/storage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 56dc9469843..afc813a078d 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -781,7 +781,7 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker) { ForkNumber fork; BlockNumber nblocks[MAX_FORKNUM + 1]; - BlockNumber total_blocks = 0; + uint64 total_blocks = 0; SMgrRelation srel; srel = smgropen(pendingsync->rlocator, InvalidBackendId); @@ -825,7 +825,7 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker) * main fork is longer than ever but FSM fork gets shorter. */ if (pendingsync->is_truncated || - total_blocks * BLCKSZ / 1024 >= wal_skip_threshold) + total_blocks >= wal_skip_threshold * (uint64) 1024 / BLCKSZ) { /* allocate the initial array, or extend it, if needed */ if (maxrels == 0) From 2f9b769b3098556199445c98e15e0cb7174ea943 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 31 Jan 2025 11:06:09 +0900 Subject: [PATCH 095/119] Fix comment of StrategySyncStart() The top comment of StrategySyncStart() mentions BufferSync(), but this function calls BgBufferSync(), not BufferSync(). Oversight in 9cd00c457e6a. Author: Ashutosh Bapat Discussion: https://postgr.es/m/CAExHW5tgkjag8i-s=RFrCn5KAWDrC4zEPPkfUKczfccPOxBRQQ@mail.gmail.com Backpatch-through: 13 --- src/backend/storage/buffer/freelist.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c index 1c804fd2f59..6f657d88175 100644 --- a/src/backend/storage/buffer/freelist.c +++ b/src/backend/storage/buffer/freelist.c @@ -380,10 +380,10 @@ StrategyFreeBuffer(BufferDesc *buf) } /* - * StrategySyncStart -- tell BufferSync where to start syncing + * StrategySyncStart -- tell BgBufferSync where to start syncing * * The result is the buffer index of the best buffer to sync first. - * BufferSync() will proceed circularly around the buffer array from there. + * BgBufferSync() will proceed circularly around the buffer array from there. * * In addition, we return the completed-pass count (which is effectively * the higher-order bits of nextVictimBuffer) and the count of recent buffer From f07ebd54a304002c7ae289cddb5666e03f32fcd2 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sun, 2 Feb 2025 11:31:29 +0900 Subject: [PATCH 096/119] Mention jsonlog in description of logging_collector in GUC table logging_collector was only mentioning stderr and csvlog, and forgot about jsonlog. Oversight in dc686681e079, that has added support for jsonlog in log_destination. While on it, the description in the GUC table is tweaked to be more consistent with the documentation and postgresql.conf.sample. Author: Umar Hayat Reviewed-by: Ashutosh Bapat, Tom Lane Discussion: https://postgr.es/m/CAD68Dp1K_vBYqBEukHw=1jF7e76t8aszGZTFL2ugi=H7r=a7MA@mail.gmail.com Backpatch-through: 13 --- src/backend/utils/misc/guc_tables.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index c029bd176d1..ab97dea63c4 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -1630,7 +1630,7 @@ struct config_bool ConfigureNamesBool[] = }, { {"logging_collector", PGC_POSTMASTER, LOGGING_WHERE, - gettext_noop("Start a subprocess to capture stderr output and/or csvlogs into log files."), + gettext_noop("Start a subprocess to capture stderr, csvlog and/or jsonlog into log files."), NULL }, &Logging_collector, From e8d8174caf75c5724847b43b886a7feb1628c4d4 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 4 Feb 2025 13:26:57 -0600 Subject: [PATCH 097/119] vacuumdb: Add missing PQfinish() calls to vacuum_one_database(). A few of the version checks in vacuum_one_database() do not call PQfinish() before exiting. This precedent was unintentionally established in commit 00d1e88d36, and while it's probably not too problematic, it seems better to properly close the connection. Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/Z6JAwqN1I8ljTuXp%40nathan Backpatch-through: 13 --- src/bin/scripts/vacuumdb.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index c59790cd123..c475c0f2861 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -568,20 +568,32 @@ vacuum_one_database(ConnParams *cparams, } if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--min-xid-age", "9.6"); + } if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--min-mxid-age", "9.6"); + } if (vacopts->parallel_workers >= 0 && PQserverVersion(conn) < 130000) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--parallel", "13"); + } if (vacopts->buffer_usage_limit && PQserverVersion(conn) < 160000) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--buffer-usage-limit", "16"); + } /* skip_database_stats is used automatically if server supports it */ vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000); From d54d5668b4d7ef44e2c8475ed3944686293e9829 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Wed, 5 Feb 2025 00:15:17 +0200 Subject: [PATCH 098/119] pg_controldata: Fix possible errors on corrupted pg_control Protect against malformed timestamps. Also protect against negative WalSegSz as it triggers division by zero: ((0x100000000UL) / (WalSegSz)) can turn into zero in XLogFileName(xlogfilename, ControlFile->checkPointCopy.ThisTimeLineID, segno, WalSegSz); because if WalSegSz is -1 then by arithmetic rules in C we get 0x100000000UL / 0xFFFFFFFFFFFFFFFFUL == 0. Author: Ilyasov Ian Author: Anton Voloshin Backpatch-through: 13 --- src/bin/pg_controldata/pg_controldata.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index c390ec51ce9..a54ceb4eba5 100644 --- a/src/bin/pg_controldata/pg_controldata.c +++ b/src/bin/pg_controldata/pg_controldata.c @@ -97,6 +97,7 @@ main(int argc, char *argv[]) bool crc_ok; char *DataDir = NULL; time_t time_tmp; + struct tm *tm_tmp; char pgctime_str[128]; char ckpttime_str[128]; char mock_auth_nonce_str[MOCK_AUTH_NONCE_LEN * 2 + 1]; @@ -197,20 +198,30 @@ main(int argc, char *argv[]) * about %c */ time_tmp = (time_t) ControlFile->time; - strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt, - localtime(&time_tmp)); + tm_tmp = localtime(&time_tmp); + + if (tm_tmp != NULL) + strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt, tm_tmp); + else + snprintf(pgctime_str, sizeof(pgctime_str), _("???")); + time_tmp = (time_t) ControlFile->checkPointCopy.time; - strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt, - localtime(&time_tmp)); + tm_tmp = localtime(&time_tmp); + + if (tm_tmp != NULL) + strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt, tm_tmp); + else + snprintf(ckpttime_str, sizeof(ckpttime_str), _("???")); /* * Calculate name of the WAL file containing the latest checkpoint's REDO * start point. * - * A corrupted control file could report a WAL segment size of 0, and to - * guard against division by zero, we need to treat that specially. + * A corrupted control file could report a WAL segment size of 0 or + * negative value, and to guard against division by zero, we need to treat + * that specially. */ - if (WalSegSz != 0) + if (WalSegSz > 0) { XLogSegNo segno; From 80620931053dc64eb9cff7a77a5270b189ce7f39 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 099/119] meson: Narrow dependencies for 'install-quiet' target Previously test dependencies, which are not actually installed, were unnecessarily built. Apply this to all branches with meson support, as part of an effort to fix incorrect test dependencies that can lead to test failures. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a32e@eisentraut.org Backpatch: 16-, where meson support was added --- meson.build | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 4e59feb91da..cdfdbb79e88 100644 --- a/meson.build +++ b/meson.build @@ -3112,24 +3112,30 @@ if libintl.found() and meson.version().version_compare('>=0.60') endif -all_built = [ +# all targets that 'meson install' needs +installed_targets = [ backend_targets, bin_targets, libpq_st, pl_targets, contrib_targets, nls_mo_targets, - testprep_targets, ecpg_targets, ] +# all targets that require building code +all_built = [ + installed_targets, + testprep_targets, +] + # Meson's default install target is quite verbose. Provide one that is quiet. install_quiet = custom_target('install-quiet', output: 'install-quiet', build_always_stale: true, build_by_default: false, command: [meson_bin, meson_args, 'install', '--quiet', '--no-rebuild'], - depends: all_built, + depends: installed_targets, ) # Target to install files used for tests, which aren't installed by default From dab83a62fc62ecc3183314134d40b723eb4332cd Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 100/119] meson: Improve dependencies for tmp_install test target The missing dependency was, e.g., visible when doing ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite cube because meson (and thus its internal meson-test-prereq target) did not know about a lot of the required targets. Previously tmp_install did not actually depend on the relevant files being built. That was mostly not visible, because "meson test" currently uses the 'default' targets as a test's dependency if no dependency is specified. However, there are plans to narrow that on the meson side, to make it quicker to run tests. Apply this to all branches with meson support, as part of an effort to fix incorrect test dependencies that can lead to test failures. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a32e@eisentraut.org Backpatch: 16-, where meson support was added --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index cdfdbb79e88..0623799ee23 100644 --- a/meson.build +++ b/meson.build @@ -3190,6 +3190,7 @@ test('tmp_install', priority: setup_tests_priority, timeout: 300, is_parallel: false, + depends: installed_targets, suite: ['setup']) test('install_test_files', From 0577620667921328b94e96ed0bef98036f21cc95 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 101/119] meson: Add pg_regress_ecpg to ecpg test dependencies This is required to ensure correct test dependencies, previously pg_regress_ecpg would not necessarily be built. The missing dependency was, e.g., visible when doing ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite ecpg Apply this to all branches with meson support, as part of an effort to fix incorrect test dependencies that can lead to test failures. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a32e@eisentraut.org Backpatch: 16-, where meson support was added --- src/interfaces/ecpg/test/meson.build | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build index 8fc352b0145..4f73faa302d 100644 --- a/src/interfaces/ecpg/test/meson.build +++ b/src/interfaces/ecpg/test/meson.build @@ -5,6 +5,8 @@ if meson.is_cross_build() subdir_done() endif +ecpg_test_dependencies = [] + pg_regress_ecpg_sources = pg_regress_c + files( 'pg_regress_ecpg.c', ) @@ -23,7 +25,7 @@ pg_regress_ecpg = executable('pg_regress_ecpg', 'install': false }, ) -testprep_targets += pg_regress_ecpg +ecpg_test_dependencies += pg_regress_ecpg # create .c files and executables from .pgc files ecpg_test_exec_kw = { @@ -51,8 +53,6 @@ ecpg_preproc_test_command_end = [ '@INPUT@' ] -ecpg_test_dependencies = [] - subdir('compat_informix') subdir('compat_oracle') subdir('connect') From 5acf0636f87410fef77d38a23738023267ab6dd3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 102/119] meson: Add missing dependencies to libpq_pipeline test The missing dependency was, e.g., visible when doing ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite libpq_pipeline Apply this to all branches with meson support, as part of an effort to fix incorrect test dependencies that can lead to test failures. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a32e@eisentraut.org Backpatch: 16-, where meson support was added --- src/test/modules/libpq_pipeline/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build index 91fd96ba524..cf0e3ead656 100644 --- a/src/test/modules/libpq_pipeline/meson.build +++ b/src/test/modules/libpq_pipeline/meson.build @@ -27,5 +27,6 @@ tests += { 'tests': [ 't/001_libpq_pipeline.pl', ], + 'deps': [libpq_pipeline], }, } From ad80e5823a50c81502782ffd7d5a794005461f22 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 103/119] meson: Add missing dependencies for libpq tests The missing dependency was, e.g., visible when doing ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite libpq This is a bit more complicated than other related fixes, because until now libpq's tests depended on 'frontend_code', which includes a dependency on fe_utils, which in turns on libpq. That in turn required src/interfaces/libpq/test to be entered from the top-level, not from libpq/meson.build. Because of that the test definitions in libpq/meson.build could not declare a dependency on the binaries defined in libpq/test/meson.build. To fix this, this commit creates frontend_no_fe_utils_code, which allows us to recurse into libpq/test from withing libpq/meson.build. Apply this to all branches with meson support, as part of an effort to fix incorrect test dependencies that can lead to test failures. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a32e@eisentraut.org Backpatch: 16-, where meson support was added --- meson.build | 11 ++++++++++- src/interfaces/libpq/meson.build | 5 ++--- src/interfaces/libpq/test/meson.build | 12 ++++++++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/meson.build b/meson.build index 0623799ee23..e3a4addb89d 100644 --- a/meson.build +++ b/meson.build @@ -2951,6 +2951,16 @@ frontend_shlib_code = declare_dependency( dependencies: [shlib_code, os_deps, libintl], ) +# For frontend code that doesn't use fe_utils - this mainly exists for libpq's +# tests, which are defined before fe_utils is defined, as fe_utils depends on +# libpq. +frontend_no_fe_utils_code = declare_dependency( + include_directories: [postgres_inc], + link_with: [common_static, pgport_static], + sources: generated_headers, + dependencies: [os_deps, libintl], +) + # Dependencies both for static and shared libpq libpq_deps += [ thread_dep, @@ -3018,7 +3028,6 @@ subdir('src') subdir('contrib') subdir('src/test') -subdir('src/interfaces/libpq/test') subdir('src/interfaces/ecpg/test') subdir('doc/src/sgml') diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build index 80e6a15adf8..8a2872c0eea 100644 --- a/src/interfaces/libpq/meson.build +++ b/src/interfaces/libpq/meson.build @@ -1,8 +1,5 @@ # Copyright (c) 2022-2023, PostgreSQL Global Development Group -# test/ is entered via top-level meson.build, that way it can use the default -# args for executables (which depend on libpq). - libpq_sources = files( 'fe-auth-scram.c', 'fe-auth.c', @@ -107,6 +104,7 @@ install_data('pg_service.conf.sample', install_dir: dir_data, ) +subdir('test') tests += { 'name': 'libpq', @@ -120,6 +118,7 @@ tests += { 't/004_load_balance_dns.pl', ], 'env': {'with_ssl': ssl_library}, + 'deps': libpq_test_deps, }, } diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build index d56b63e1186..3c9eb09d313 100644 --- a/src/interfaces/libpq/test/meson.build +++ b/src/interfaces/libpq/test/meson.build @@ -1,5 +1,7 @@ # Copyright (c) 2022-2023, PostgreSQL Global Development Group +libpq_test_deps = [] + libpq_uri_regress_sources = files( 'libpq_uri_regress.c', ) @@ -10,9 +12,9 @@ if host_system == 'windows' '--FILEDESC', 'libpq test program',]) endif -testprep_targets += executable('libpq_uri_regress', +libpq_test_deps += executable('libpq_uri_regress', libpq_uri_regress_sources, - dependencies: [frontend_code, libpq], + dependencies: [frontend_no_fe_utils_code, libpq], kwargs: default_bin_args + { 'install': false, } @@ -29,10 +31,12 @@ if host_system == 'windows' '--FILEDESC', 'libpq test program',]) endif -testprep_targets += executable('libpq_testclient', +libpq_test_deps += executable('libpq_testclient', libpq_testclient_sources, - dependencies: [frontend_code, libpq], + dependencies: [frontend_no_fe_utils_code, libpq], kwargs: default_bin_args + { 'install': false, } ) + +testprep_targets += libpq_test_deps From d9b5e2fc09b65a6512561c7dbb97e0836dcf933e Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Tue, 4 Feb 2025 17:45:57 -0500 Subject: [PATCH 104/119] meson: ci: ensure tests are built before running them Meson 1.7 stopped building all the dependencies of tests as part of the default build target. But it does breaks CI because we only built the default target before running the test, and ran the tests with --no-rebuild. The simplest fix would be to remove --no-rebuild from MTEST_ARGS, but it seems better to explicitly build the test dependencies, so compiler warnings / errors are visible as part of the build step. Discussion: https://postgr.es/m/CAGECzQSvM3iSDmjF+=Kof5an6jN8UbkP_4cKKT9w6GZavmb5yQ@mail.gmail.com Backpatch: 16-, where meson was added --- .cirrus.tasks.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 197270feeaa..ab44d24e347 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -17,6 +17,9 @@ env: CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS CHECKFLAGS: -Otarget PROVE_FLAGS: --timer + # Build test dependencies as part of the build step, to see compiler + # errors/warnings in one place. + MBUILD_TARGET: all testprep MTEST_ARGS: --print-errorlogs --no-rebuild -C build PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf @@ -99,7 +102,7 @@ task: EOF build_script: | su postgres <<-EOF - ninja -C build -j${BUILD_JOBS} + ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET} EOF upload_caches: ccache @@ -176,7 +179,7 @@ task: -Dextra_lib_dirs=/usr/local/lib -Dextra_include_dirs=/usr/local/include/ \ build EOF - build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}' + build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET}' upload_caches: ccache test_world_script: | @@ -378,8 +381,8 @@ task: build-32 EOF - build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}' - build_32_script: su postgres -c 'ninja -C build-32 -j${BUILD_JOBS}' + build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET}' + build_32_script: su postgres -c 'ninja -C build-32 -j${BUILD_JOBS} ${MBUILD_TARGET}' upload_caches: ccache @@ -498,7 +501,7 @@ task: -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ build - build_script: ninja -C build -j${BUILD_JOBS} + build_script: ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET} upload_caches: ccache test_world_script: | @@ -571,7 +574,7 @@ task: build_script: | vcvarsall x64 - ninja -C build + ninja -C build %MBUILD_TARGET% check_world_script: | vcvarsall x64 @@ -629,7 +632,7 @@ task: %BASH% -c "meson setup -Ddebug=true -Doptimization=g -Dcassert=true -Db_pch=true -Dnls=disabled -DTAR=%TAR% build" build_script: | - %BASH% -c "ninja -C build" + %BASH% -c "ninja -C build ${MBUILD_TARGET}" upload_caches: ccache From b26a3bc2f62433d1a8bc9ec9a7f8c52cc7a1677c Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Wed, 5 Feb 2025 13:58:40 +0100 Subject: [PATCH 105/119] doc: Update links which returned 404 Two links in the isn module documentation were pointing to tools which had been moved, resulting in 404 error responses. Update to the new URLs for the tools. The link to the Sequoia 2000 page in the history section was no longer working, and since the page is no longer available online update our link to point at the paper instead which is on a stable URL. These links exist in all versions of the documentation so backpatch to all supported branches. Author: Daniel Gustafsson Reported-by: charukiewicz@protonmail.com Discussion: https://postgr.es/m/173679670185.705.8565555804465055355@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/biblio.sgml | 18 ++++++++++++++++++ doc/src/sgml/history.sgml | 5 ++--- doc/src/sgml/isn.sgml | 4 ++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/biblio.sgml b/doc/src/sgml/biblio.sgml index cd8aa3e8aad..4674544461d 100644 --- a/doc/src/sgml/biblio.sgml +++ b/doc/src/sgml/biblio.sgml @@ -546,5 +546,23 @@ ssimkovi@ag.or.at + + + <ulink url="https://dsf.berkeley.edu/papers/S2K-91-05.pdf"> + An overview of the Sequoia 2000 project + </ulink> + + + M. + Stonebraker + + + + + Digest of Papers COMPCON Spring 1992 + 1992 + 383–388 + + diff --git a/doc/src/sgml/history.sgml b/doc/src/sgml/history.sgml index 19bea5390b9..3bf60fc563b 100644 --- a/doc/src/sgml/history.sgml +++ b/doc/src/sgml/history.sgml @@ -69,9 +69,8 @@ url="https://www.ibm.com/">IBM) picked up the code and commercialized it. In late 1992, POSTGRES became the primary data manager - for the - - Sequoia 2000 scientific computing project. + for the Sequoia 2000 scientific computing project described in + . diff --git a/doc/src/sgml/isn.sgml b/doc/src/sgml/isn.sgml index ea2aabc87d7..264455204c9 100644 --- a/doc/src/sgml/isn.sgml +++ b/doc/src/sgml/isn.sgml @@ -398,9 +398,9 @@ SELECT isbn13(id) FROM test; - + - + Care was taken during the creation of the algorithms and they From 60516fc8b491f941988b6f4a3a55167b98a9351b Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 7 Feb 2025 15:09:13 +0100 Subject: [PATCH 106/119] meson: Fix linking using old OpenSSL lib names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before OpenSSL 1.1.0 the legacy names ssleay32 and libeay32 were still used on Windows, and while we have support for this auto- conf the meson buildsystem only used the new names on all plat- forms. This adds support for the old name scheme when building on Windows. This patch only applies to 17 and 16 as master no longer support OpenSSL 1.0.2. Author: Darek Ślusarczyk Reviewed-by: Nazir Bilal Yavuz Reviewed-by: Daniel Gustafsson Discussion: https://postgr.es/m/CAN55FZ1Nk8wqY=mTrN78H026TuGV50h2H6uq1PwxhTauPYi3ug@mail.gmail.com Backpatch-through: 16 --- meson.build | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index e3a4addb89d..ef4e3446757 100644 --- a/meson.build +++ b/meson.build @@ -1339,14 +1339,37 @@ if sslopt in ['auto', 'openssl'] # via library + headers if not ssl.found() + is_windows = host_system == 'windows' + + ssl_lib_common_params = { + 'dirs': test_lib_d, + 'header_include_directories': postgres_inc, + 'has_headers': ['openssl/ssl.h', 'openssl/err.h'], + } ssl_lib = cc.find_library('ssl', - dirs: test_lib_d, - header_include_directories: postgres_inc, - has_headers: ['openssl/ssl.h', 'openssl/err.h'], - required: openssl_required) + kwargs: ssl_lib_common_params, + required: openssl_required and not is_windows + ) + # Before OpenSSL 1.1.0, there was a different naming convention for + # libraries on Windows, so try the alternative name if ssl wasn't found + if not ssl_lib.found() and is_windows + ssl_lib = cc.find_library('ssleay32', + kwargs: ssl_lib_common_params, + required: openssl_required + ) + endif + crypto_lib = cc.find_library('crypto', dirs: test_lib_d, - required: openssl_required) + required: openssl_required and not is_windows) + # Before OpenSSL 1.1.0, there was a different naming convention for + # libraries on Windows, so try the alternatve name if crypto wasn't found + if not crypto_lib.found() and is_windows + crypto_lib = cc.find_library('libeay32', + dirs: test_lib_d, + required: openssl_required) + endif + if ssl_lib.found() and crypto_lib.found() ssl_int = [ssl_lib, crypto_lib] ssl = declare_dependency(dependencies: ssl_int, include_directories: postgres_inc) From bbf1ef72c22f1f3db778db0aaab8a1daa82d81f8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 7 Feb 2025 12:40:41 -0500 Subject: [PATCH 107/119] Doc: clarify behavior of timestamptz input some more. Try to make it absolutely plain that we don't retain the originally specified time zone, only the UTC timestamp. While at it, make glossary entries for "UTC" and "GMT". Author: Robert Treat Co-authored-by: Tom Lane Discussion: https://postgr.es/m/173796426022.1064.9135167366862649513@wrigleys.postgresql.org Backpatch-through: 13 --- doc/src/sgml/datatype.sgml | 17 ++++++++++------- doc/src/sgml/glossary.sgml | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index 40c115a3cc3..d621437c414 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -2245,24 +2245,27 @@ TIMESTAMP '2004-10-19 10:23:54+02' TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' + - In a literal that has been determined to be timestamp without time + + In a value that has been determined to be timestamp without time zone, PostgreSQL will silently ignore any time zone indication. That is, the resulting value is derived from the date/time - fields in the input value, and is not adjusted for time zone. + fields in the input string, and is not adjusted for time zone. - For timestamp with time zone, the internally stored - value is always in UTC (Universal - Coordinated Time, traditionally known as Greenwich Mean Time, - GMT). An input value that has an explicit - time zone specified is converted to UTC using the appropriate offset + For timestamp with time zone values, an input string + that includes an explicit time zone will be converted to UTC + (Universal Coordinated + Time) using the appropriate offset for that time zone. If no time zone is stated in the input string, then it is assumed to be in the time zone indicated by the system's parameter, and is converted to UTC using the offset for the timezone zone. + In either case, the value is stored internally as UTC, and the + originally stated or assumed time zone is not retained. diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml index f947eccd006..a0f0608c6ac 100644 --- a/doc/src/sgml/glossary.sgml +++ b/doc/src/sgml/glossary.sgml @@ -834,6 +834,11 @@ + + GMT + + + Grant @@ -1998,6 +2003,17 @@ + + UTC + + + Universal Coordinated Time, the primary global time reference, + approximately the time prevailing at the zero meridian of longitude. + Often but inaccurately referred to as GMT (Greenwich Mean Time). + + + + Vacuum From 21b815f92e82f6aad557d99492b12a912943fdbc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 7 Feb 2025 13:41:42 -0500 Subject: [PATCH 108/119] Fix pgbench performance issue induced by commit af35fe501. Commit af35fe501 caused "pgbench -i" to emit a '\r' character for each data row loaded (when stderr is a terminal). That's effectively invisible on-screen, but it causes the connected terminal program to consume a lot of cycles. It's even worse if you're connected over ssh, as the data then has to pass through the ssh tunnel. Simplest fix is to move the added logic inside the if-tests that check whether to print a progress line. We could do it another way that avoids duplicating these few lines, but on the whole this seems the most transparent way to write it. Like the previous commit, back-patch to all supported versions. Reported-by: Andres Freund Author: Tom Lane Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/4k4drkh7bcmdezq6zbkhp25mnrzpswqi2o75d5uv2eeg3aq6q7@b7kqdmzzwzgb Backpatch-through: 13 --- src/bin/pgbench/pgbench.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 1aa6661f142..4c3a6a44f43 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4983,6 +4983,16 @@ initGenerateDataClientSide(PGconn *con) j, (int64) naccounts * scale, (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec); + + /* + * If the previous progress message is longer than the current + * one, add spaces to the current line to fully overwrite any + * remaining characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; } /* let's not call the timing for each row, but only each 100 rows */ else if (use_quiet && (j % 100 == 0)) @@ -4997,20 +5007,20 @@ initGenerateDataClientSide(PGconn *con) j, (int64) naccounts * scale, (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec); + /* + * If the previous progress message is longer than the current + * one, add spaces to the current line to fully overwrite any + * remaining characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; + /* skip to the next interval */ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS); } } - - /* - * If the previous progress message is longer than the current one, - * add spaces to the current line to fully overwrite any remaining - * characters from the previous message. - */ - if (prev_chars > chars) - fprintf(stderr, "%*c", prev_chars - chars, ' '); - fputc(eol, stderr); - prev_chars = chars; } if (eol != '\n') From 2aa91e3513067e7e76f66a2f2a7f17d82c9a102d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 9 Feb 2025 13:58:53 -0500 Subject: [PATCH 109/119] Release notes for 17.3, 16.7, 15.11, 14.16, 13.19. --- doc/src/sgml/release-16.sgml | 1265 ++++++++++++++++++++++++++++++++++ 1 file changed, 1265 insertions(+) diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml index 44c7ea72409..470761bd411 100644 --- a/doc/src/sgml/release-16.sgml +++ b/doc/src/sgml/release-16.sgml @@ -1,6 +1,1271 @@ + + Release 16.7 + + + Release date: + 2025-02-13 + + + + This release contains a variety of fixes from 16.6. + For information about new features in major release 16, see + . + + + + Migration to Version 16.7 + + + A dump/restore is not required for those running 16.X. + + + + However, if you are upgrading from a version earlier than 16.5, + see . + + + + + Changes + + + + + + + Exclude parallel workers from connection privilege checks and limits + (Tom Lane) + § + + + + Do not + check datallowconn, rolcanlogin, + and ACL_CONNECT privileges when starting a + parallel worker, instead assuming that it's enough for the leader + process to have passed similar checks originally. This avoids, for + example, unexpected failures of parallelized queries when the leader + is running as a role that lacks login privilege. In the same vein, + enforce ReservedConnections, + datconnlimit, and rolconnlimit + limits only against regular backends, and count only regular + backends while checking if the limits were already reached. Those + limits are meant to prevent excessive consumption of process slots + for regular backends --- but parallel workers and other special + processes have their own pools of process slots with their own limit + checks. + + + + + + + Fix possible re-use of stale results in window aggregates (David + Rowley) + § + + + + A window aggregate with a run condition optimization + and a pass-by-reference result type might incorrectly return the + result from the previous partition instead of performing a fresh + calculation. + + + + + + + Keep TransactionXmin in sync + with MyProc->xmin (Heikki Linnakangas) + § + + + + This oversight could permit a process to try to access data that had + already been vacuumed away. One known consequence is + transient could not access status of transaction + errors. + + + + + + + Fix race condition that could cause failure to add a newly-inserted + catalog entry to a catalog cache list (Heikki Linnakangas) + § + + + + This could result, for example, in failure to use a newly-created + function within an existing session. + + + + + + + Prevent possible catalog corruption when a system catalog is + vacuumed concurrently with an update (Noah Misch) + § + + + + + + + Fix data corruption when relation truncation fails (Thomas Munro) + § + § + § + + + + The filesystem calls needed to perform relation truncation could + fail, leaving inconsistent state on disk (for example, effectively + reviving deleted data). We can't really prevent that, but we can + recover by dint of making such failures into PANICs, so that + consistency is restored by replaying from WAL up to just before the + attempted truncation. This isn't a hugely desirable behavior, but + such failures are rare enough that it seems an acceptable solution. + + + + + + + Prevent checkpoints from starting during relation truncation + (Robert Haas) + § + + + + This avoids a race condition wherein the modified file might not get + fsync'd before completing the checkpoint, creating a risk of data + corruption if the operating system crashes soon after. + + + + + + + Avoid possibly losing an update of + pg_database.datfrozenxid + when VACUUM runs concurrently with + a REASSIGN OWNED that changes that database's + owner (Kirill Reshke) + § + + + + + + + Fix incorrect tg_updatedcols values + passed to AFTER UPDATE triggers (Tom Lane) + § + + + + In some cases the tg_updatedcols bitmap + could describe the set of columns updated by an earlier command in + the same transaction, fooling the trigger into doing the wrong + thing. + + + + Also, prevent memory bloat caused by making too many copies of + the tg_updatedcols bitmap. + + + + + + + Fix detach of a partition that has its own foreign-key constraint + referencing a partitioned table (Amul Sul) + § + + + + In common cases, foreign keys are defined on a partitioned table's + top level; but if instead one is defined on a partition and + references a partitioned table, and the referencing partition is + detached, the relevant pg_constraint + entries were updated incorrectly. This led to errors + like could not find ON INSERT check triggers of foreign key + constraint. + + + + + + + Fix mis-processing of to_timestamp's + FFn format codes + (Tom Lane) + § + + + + An integer format code immediately + preceding FFn would + consume all available digits, leaving none + for FFn. + + + + + + + When deparsing an XMLTABLE() expression, ensure + that XML namespace names are double-quoted when necessary (Dean + Rasheed) + § + + + + + + + Include the ldapscheme option + in pg_hba_file_rules() output (Laurenz Albe) + § + § + + + + + + + Don't merge UNION operations if their column + collations aren't consistent (Tom Lane) + § + + + + Previously we ignored collations when deciding if it's safe to + merge UNION steps into a single + N-way UNION operation. This was arguably valid + before the introduction of nondeterministic collations, but it's not + anymore, since the collation in use can affect the definition of + uniqueness. + + + + + + + Prevent wrong varnullingrels planner errors after + pulling up a subquery that's underneath an outer join (Tom Lane) + § + § + + + + + + + Ignore nulling-relation marker bits when looking up statistics + (Richard Guo) + § + + + + This oversight could lead to failure to use relevant statistics + about expressions, or to corrupt MVNDistinct + entry errors. + + + + + + + Fix missed expression processing for partition pruning steps + (Tom Lane) + § + + + + This oversight could lead to unrecognized node type + errors, and perhaps other problems, in queries accessing partitioned + tables. + + + + + + + Allow dshash tables to grow past 1GB (Matthias van de Meent) + § + + + + This avoids errors like invalid DSA memory alloc request + size. The case can occur for example in transactions that + process several million tables. + + + + + + + Avoid possible integer overflow + in bringetbitmap() (James Hunter, Evgeniy + Gorbanyov) + § + + + + Since the result is only used for statistical purposes, the effects + of this error were mostly cosmetic. + + + + + + + Ensure that an already-set process latch doesn't prevent the + postmaster from noticing socket events (Thomas Munro) + § + + + + An extremely heavy workload of backends launching workers and + workers exiting could prevent the postmaster from responding to + incoming client connections in a timely fashion. + + + + + + + Prevent streaming standby servers from looping infinitely when + reading a WAL record that crosses pages (Kyotaro Horiguchi, + Alexander Kukushkin) + § + + + + This would happen when the record's continuation is on a page that + needs to be read from a different WAL source. + + + + + + + Fix unintended promotion of FATAL errors to PANIC during early + process startup (Noah Misch) + § + + + + This fixes some unlikely cases that would result in PANIC: + proc_exit() called in child process. + + + + + + + Fix cases where an operator family member operator or support + procedure could become a dangling reference (Tom Lane) + § + § + + + + In some cases a data type could be dropped while references to its + OID still remain in pg_amop + or pg_amproc. While that caused no + immediate issues, an attempt to drop the owning operator family + would fail, and pg_dump would produce + bogus output when dumping the operator family. This fix causes + creation and modification of operator families/classes to add + needed dependency entries so that dropping a data type will also + drop any dependent operator family elements. That does not help + vulnerable pre-existing operator families, though, so a band-aid has + also been added to DROP OPERATOR FAMILY to + prevent failure when dropping a family that has dangling members. + + + + + + + Fix multiple memory leaks in logical decoding output (Vignesh C, + Masahiko Sawada, Boyu Yang) + § + § + § + + + + + + + Fix small memory leak when + updating the application_name + or cluster_name settings (Tofig Aliev) + § + + + + + + + Avoid integer overflow while + testing wal_skip_threshold condition (Tom Lane) + § + + + + A transaction that created a very large relation could mistakenly + decide to ensure durability by copying the relation into WAL instead + of fsync'ing it, thereby negating the point + of wal_skip_threshold. (This only matters + when wal_level is set + to minimal, else a WAL copy is required anyway.) + + + + + + + Fix unsafe order of operations during cache lookups (Noah Misch) + § + + + + The only known consequence was a usually-harmless you don't + own a lock of type ExclusiveLock warning + during GRANT TABLESPACE. + + + + + + + Fix possible failed to resolve name failures when + using JIT on older ARM platforms (Thomas Munro) + § + + + + This could occur as a consequence of inconsistency about the default + setting of between gcc and clang. + At least Debian and Ubuntu are known to ship gcc and clang compilers + that target armv8-a but differ on the use of outline atomics by + default. + + + + + + + Fix assertion failure in WITH RECURSIVE ... UNION + queries (David Rowley) + § + + + + + + + Avoid assertion failure in rule deparsing if a set operation leaf + query contains set operations (Man Zeng, Tom Lane) + § + + + + + + + Avoid edge-case assertion failure in parallel query startup (Tom Lane) + § + + + + + + + Fix assertion failure at shutdown when writing out the statistics + file (Michael Paquier) + § + + + + + + + In NULLIF(), avoid passing a read-write + expanded object pointer to the data type's equality function + (Tom Lane) + § + + + + The equality function could modify or delete the object if it's + given a read-write pointer, which would be bad if we decide to + return it as the NULLIF() result. There is + probably no problem with any built-in equality function, but it's + easy to demonstrate a failure with one coded in PL/pgSQL. + + + + + + + Ensure that expression preprocessing is applied to a default null + value in INSERT (Tom Lane) + § + + + + If the target column is of a domain type, the planner must insert a + coerce-to-domain step not just a null constant, and this expression + missed going through some required processing steps. There is no + known consequence with domains based on core data types, but in + theory an error could occur with domains based on extension types. + + + + + + + Repair memory leaks in PL/Python (Mat Arye, Tom Lane) + § + + + + Repeated use of PLyPlan.execute + or plpy.cursor resulted in memory leakage for + the duration of the calling PL/Python function. + + + + + + + Fix PL/Tcl to compile with Tcl 9 (Peter Eisentraut) + § + + + + + + + In the ecpg preprocessor, fix possible + misprocessing of cursors that reference out-of-scope variables + (Tom Lane) + § + + + + + + + In ecpg, fix compile-time warnings about + unsupported use of COPY ... FROM STDIN (Ryo + Kanbayashi) + § + + + + Previously, the intended warning was not issued due to a typo. + + + + + + + Fix psql to safely handle file path names + that are encoded in SJIS (Tom Lane) + § + + + + Some two-byte characters in SJIS have a second byte that is equal to + ASCII backslash (\). These characters were + corrupted by path name normalization, preventing access to files + whose names include such characters. + + + + + + + Fix use of wrong version of pqsignal() + in pgbench + and psql (Fujii Masao, Tom Lane) + § + + + + This error could lead to misbehavior when using + the option in pgbench + or the \watch command + in psql, due to interrupted system calls + not being resumed as expected. + + + + + + + Fix misexecution of some nested \if constructs + in pgbench (Michail Nikolaev) + § + + + + An \if command appearing within a false + (not-being-executed) \if branch was incorrectly + treated the same as \elif. + + + + + + + In pgbench, fix possible misdisplay of + progress messages during table initialization (Yushi Ogiwara, Tatsuo + Ishii, Fujii Masao) + § + § + + + + + + + Make pg_controldata more robust against + corrupted pg_control files (Ilyasov Ian, Anton + Voloshin) + § + + + + Since pg_controldata will attempt to + print the contents of pg_control even if the + CRC check fails, it must take care not to misbehave for invalid + field values. This patch fixes some issues triggered by invalid + timestamps and apparently-negative WAL segment sizes. + + + + + + + Fix possible crash in pg_dump with + identity sequences attached to tables that are extension members + (Tom Lane) + § + + + + + + + Fix memory leak in pg_restore + with zstd-compressed data (Tom Lane) + § + + + + The leak was per-decompression-operation, so would be most + noticeable with a dump containing many tables or large objects. + + + + + + + Fix pg_basebackup to correctly + handle pg_wal.tar files exceeding 2GB on + Windows (Davinder Singh, Thomas Munro) + § + § + + + + + + + Use SQL-standard function bodies in the declarations + of contrib/earthdistance's SQL-language + functions (Tom Lane, Ronan Dunklau) + § + + + + This change allows their references + to contrib/cube to be resolved during extension + creation, reducing the risk of search-path-based failures and + possible attacks. + + + + In particular, this restores their usability in contexts like + generated columns, for which PostgreSQL + v17 restricts the search path on security grounds. We have received + reports of databases failing to be upgraded to v17 because of that. + This patch has been included in v16 to provide a workaround: + updating the earthdistance extension to this + version beforehand should allow an upgrade to succeed. + + + + + + + Update configuration probes that determine the compiler switches + needed to access ARM CRC instructions (Tom Lane) + § + + + + On ARM platforms where the baseline CPU target lacks CRC + instructions, we need to supply a switch to + persuade the compiler to compile such instructions. Recent versions + of gcc reject the value we were trying, leading to silently falling + back to software CRC. + + + + + + + Fix meson build system to support old OpenSSL libraries on Windows + (Darek Slusarczyk) + § + + + + Add support for the legacy library + names ssleay32 + and libeay32. + + + + + + + In Windows builds using meson, ensure all libcommon and libpgport + functions are exported (Vladlen Popolitov, Heikki Linnakangas) + § + § + + + + This fixes unresolved external symbol build errors + for extensions. + + + + + + + Fix meson configuration process to correctly detect + OSSP's uuid.h header file under MSVC + (Andrew Dunstan) + § + + + + + + + When building with meson, install pgevent + in pkglibdir + not bindir (Peter Eisentraut) + § + + + + This matches the behavior of the make-based build system and the old + MSVC build system. + + + + + + + When building with meson, install sepgsql.sql + under share/contrib/ + not share/extension/ (Peter Eisentraut) + § + + + + This matches what the make-based build system does. + + + + + + + Update time zone data files to tzdata + release 2025a for DST law changes in Paraguay, plus historical + corrections for the Philippines (Tom Lane) + § + + + + + + + + Release 16.6 From ef23624caf89aaf472bd9fa687534149be9f49ae Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 10 Feb 2025 15:05:03 +0100 Subject: [PATCH 110/119] Translation updates Source-Git-URL: https://git.postgresql.org/git/pgtranslation/messages.git Source-Git-Hash: b87044c97e0de71889c8d23c0ad3241080785d71 --- src/backend/po/de.po | 1481 +++++++++++++------------- src/backend/po/es.po | 601 ++++++----- src/backend/po/fr.po | 2 +- src/backend/po/ja.po | 1356 +++++++++++------------ src/backend/po/ru.po | 1480 ++++++++++++------------- src/bin/pg_basebackup/po/fr.po | 2 +- src/bin/pg_basebackup/po/ja.po | 2 +- src/bin/pg_controldata/po/ru.po | 131 +-- src/bin/pg_ctl/po/ru.po | 6 +- src/bin/pg_dump/po/ru.po | 130 +-- src/bin/pg_rewind/po/ru.po | 86 +- src/bin/psql/po/de.po | 62 +- src/bin/psql/po/es.po | 63 +- src/bin/psql/po/fr.po | 64 +- src/bin/psql/po/ja.po | 68 +- src/bin/psql/po/ru.po | 70 +- src/bin/scripts/po/ru.po | 96 +- src/interfaces/ecpg/preproc/po/ru.po | 16 +- src/interfaces/libpq/po/de.po | 444 ++++---- src/interfaces/libpq/po/es.po | 119 ++- src/interfaces/libpq/po/ru.po | 117 +- src/pl/plpython/po/ru.po | 24 +- src/pl/tcl/po/ru.po | 42 +- 23 files changed, 3268 insertions(+), 3194 deletions(-) diff --git a/src/backend/po/de.po b/src/backend/po/de.po index 5f95230d87d..58459aa783a 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: 2024-11-08 08:59+0000\n" +"POT-Creation-Date: 2025-02-07 08:59+0000\n" "PO-Revision-Date: 2024-08-02 11:13+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -152,8 +152,8 @@ msgstr "" #: 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:4213 -#: access/transam/xlogrecovery.c:4316 access/transam/xlogutils.c:838 +#: 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 @@ -165,8 +165,8 @@ msgstr "" #: 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:1537 utils/init/miscinit.c:1671 -#: utils/init/miscinit.c:1748 utils/misc/guc.c:4615 utils/misc/guc.c:4665 +#: 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 "konnte Datei »%s« nicht öffnen: %m" @@ -175,7 +175,7 @@ msgstr "konnte Datei »%s« nicht öffnen: %m" #: access/transam/twophase.c:1751 access/transam/twophase.c:1760 #: access/transam/xlog.c:8791 access/transam/xlogfuncs.c:708 #: backup/basebackup_server.c:175 backup/basebackup_server.c:268 -#: postmaster/postmaster.c:5573 postmaster/syslogger.c:1571 +#: postmaster/postmaster.c:5575 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 #: utils/cache/relmapper.c:948 #, c-format @@ -192,8 +192,8 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" #: 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:1135 storage/smgr/md.c:1180 -#: storage/sync/sync.c:451 utils/misc/guc.c:4385 +#: 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 "konnte Datei »%s« nicht fsyncen: %m" @@ -203,13 +203,13 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../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:269 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1412 +#: ../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:2537 postmaster/postmaster.c:4130 -#: postmaster/postmaster.c:5498 postmaster/postmaster.c:5869 +#: 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 @@ -222,7 +222,7 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: 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:4363 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 +#: 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 @@ -269,16 +269,16 @@ msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" #: ../common/exec.c:412 libpq/pqcomm.c:724 storage/ipc/latch.c:1134 -#: storage/ipc/latch.c:1314 storage/ipc/latch.c:1547 storage/ipc/latch.c:1709 -#: storage/ipc/latch.c:1835 +#: storage/ipc/latch.c:1314 storage/ipc/latch.c:1554 storage/ipc/latch.c:1716 +#: storage/ipc/latch.c:1842 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:868 +#: ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 #: utils/misc/ps_status.c:230 utils/misc/ps_status.c:238 #, c-format msgid "out of memory\n" @@ -305,7 +305,7 @@ 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:1564 storage/file/fd.c:2880 +#: postmaster/postmaster.c:1566 storage/file/fd.c:2880 #: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" @@ -440,9 +440,9 @@ msgstr "Tipp: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: postmaster/postmaster.c:2211 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4562 utils/misc/guc.c:6744 -#: utils/misc/guc.c:6785 +#: 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 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" @@ -523,15 +523,15 @@ msgstr "konnte Datei »%s« nicht löschen: %m" msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" -#: ../common/scram-common.c:282 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "konnte Salt nicht kodieren" -#: ../common/scram-common.c:298 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "konnte Stored Key nicht kodieren" -#: ../common/scram-common.c:315 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "konnte Server Key nicht kodieren" @@ -648,7 +648,7 @@ msgstr "Versuche werden für 30 Sekunden wiederholt." msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Möglicherweise stört eine Antivirus-, Datensicherungs- oder ähnliche Software das Datenbanksystem." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format msgid "could not get current working directory: %s\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" @@ -878,7 +878,7 @@ msgstr "RESET darf keinen Parameterwert enthalten" msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1302 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "Tabellen mit WITH OIDS werden nicht unterstützt" @@ -1000,7 +1000,7 @@ msgstr "alte GIN-Indexe unterstützen keine Scans des ganzen Index oder Suchen n msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Um das zu reparieren, führen Sie REINDEX INDEX \"%s\" aus." -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 +#: access/gin/ginutil.c:146 executor/execExpr.c:2177 #: utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 #: utils/adt/rowtypes.c:984 #, c-format @@ -1088,7 +1088,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:671 #: catalog/heap.c:677 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2015 commands/tablecmds.c:17711 commands/view.c:86 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17711 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,38 +1143,38 @@ 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:2048 +#: access/heap/heapam.c:2049 #, 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:2567 +#: access/heap/heapam.c:2568 #, 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:2614 +#: access/heap/heapam.c:2615 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3062 access/heap/heapam.c:6294 access/index/genam.c:819 +#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 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:3194 +#: access/heap/heapam.c:3239 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4705 access/heap/heapam.c:4743 -#: access/heap/heapam.c:5008 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 +#: access/heap/heapam.c:5053 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:6107 commands/trigger.c:3347 +#: access/heap/heapam.c:6152 commands/trigger.c:3347 #: executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" @@ -1201,7 +1201,7 @@ msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" #: access/transam/xlog.c:3941 access/transam/xlog.c:8780 #: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 #: backup/basebackup_server.c:244 commands/dbcommands.c:495 -#: postmaster/postmaster.c:4557 postmaster/postmaster.c:5560 +#: postmaster/postmaster.c:4558 postmaster/postmaster.c:5562 #: replication/logical/origin.c:603 replication/slot.c:1804 #: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 #, c-format @@ -1217,13 +1217,13 @@ msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" #: 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:4567 postmaster/postmaster.c:4577 +#: 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 storage/file/buffile.c:545 -#: storage/file/copydir.c:197 utils/init/miscinit.c:1612 -#: utils/init/miscinit.c:1623 utils/init/miscinit.c:1631 utils/misc/guc.c:4346 -#: utils/misc/guc.c:4377 utils/misc/guc.c:5513 utils/misc/guc.c:5531 +#: 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" @@ -1465,8 +1465,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:2843 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17406 commands/tablecmds.c:19249 +#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17406 commands/tablecmds.c:19275 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1571,7 +1571,7 @@ msgstr "tid (%u, %u) ist nicht gültig für Relation »%s«" msgid "%s cannot be empty." msgstr "%s kann nicht leer sein." -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4808 +#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s ist zu lang (maximal %d Zeichen)." @@ -1720,36 +1720,36 @@ msgstr "kann nicht bis MultiXact %u trunkieren, weil sie nicht auf der Festplatt msgid "invalid MultiXactId: %u" msgstr "ungültige MultiXactId: %u" -#: access/transam/parallel.c:729 access/transam/parallel.c:848 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "Initialisierung von parallelem Arbeitsprozess fehlgeschlagen" -#: access/transam/parallel.c:730 access/transam/parallel.c:849 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Weitere Einzelheiten sind möglicherweise im Serverlog zu finden." -#: access/transam/parallel.c:910 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "Postmaster beendete während einer parallelen Transaktion" -#: access/transam/parallel.c:1097 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "Verbindung mit parallelem Arbeitsprozess verloren" -#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 +#: access/transam/parallel.c:1182 access/transam/parallel.c:1184 msgid "parallel worker" msgstr "paralleler Arbeitsprozess" -#: access/transam/parallel.c:1319 replication/logical/applyparallelworker.c:893 +#: access/transam/parallel.c:1338 replication/logical/applyparallelworker.c:893 #, c-format msgid "could not map dynamic shared memory segment" msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" -#: access/transam/parallel.c:1324 replication/logical/applyparallelworker.c:899 +#: access/transam/parallel.c:1343 replication/logical/applyparallelworker.c:899 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ungültige magische Zahl in dynamischem Shared-Memory-Segment" @@ -2281,7 +2281,7 @@ msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" #: 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 -#: utils/init/miscinit.c:1769 +#: utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "Datenbankdateien sind inkompatibel mit Server" @@ -3280,7 +3280,7 @@ msgstr "pausiere am Ende der Wiederherstellung" msgid "Execute pg_wal_replay_resume() to promote." msgstr "Führen Sie pg_wal_replay_resume() aus, um den Server zum Primärserver zu befördern." -#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4628 +#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4629 #, c-format msgid "recovery has paused" msgstr "Wiederherstellung wurde pausiert" @@ -3305,119 +3305,119 @@ msgstr "konnte nicht aus WAL-Segment %s, LSN %X/%X, Position %u lesen: %m" msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "konnte nicht aus WAL-Segment %s, LSN %X/%X, Position %u lesen: %d von %zu gelesen" -#: access/transam/xlogrecovery.c:4010 +#: access/transam/xlogrecovery.c:4011 #, c-format msgid "invalid checkpoint location" msgstr "ungültige Checkpoint-Position" -#: access/transam/xlogrecovery.c:4020 +#: access/transam/xlogrecovery.c:4021 #, c-format msgid "invalid checkpoint record" msgstr "ungültiger Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4026 +#: access/transam/xlogrecovery.c:4027 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4034 +#: access/transam/xlogrecovery.c:4035 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "ungültige xl_info im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4040 +#: access/transam/xlogrecovery.c:4041 #, c-format msgid "invalid length of checkpoint record" msgstr "ungültige Länge des Checkpoint-Datensatzes" -#: access/transam/xlogrecovery.c:4094 +#: access/transam/xlogrecovery.c:4095 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "neue Zeitleiste %u ist kein Kind der Datenbanksystemzeitleiste %u" -#: access/transam/xlogrecovery.c:4108 +#: access/transam/xlogrecovery.c:4109 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "neue Zeitleiste %u zweigte von der aktuellen Datenbanksystemzeitleiste %u vor dem aktuellen Wiederherstellungspunkt %X/%X ab" -#: access/transam/xlogrecovery.c:4127 +#: access/transam/xlogrecovery.c:4128 #, c-format msgid "new target timeline is %u" msgstr "neue Zielzeitleiste ist %u" -#: access/transam/xlogrecovery.c:4330 +#: access/transam/xlogrecovery.c:4331 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" -#: access/transam/xlogrecovery.c:4390 +#: access/transam/xlogrecovery.c:4391 #, c-format msgid "received promote request" msgstr "Anforderung zum Befördern empfangen" -#: access/transam/xlogrecovery.c:4619 +#: access/transam/xlogrecovery.c:4620 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "Hot Standby ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4620 access/transam/xlogrecovery.c:4647 -#: access/transam/xlogrecovery.c:4677 +#: access/transam/xlogrecovery.c:4621 access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4678 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d ist eine niedrigere Einstellung als auf dem Primärserver, wo der Wert %d war." -#: access/transam/xlogrecovery.c:4629 +#: access/transam/xlogrecovery.c:4630 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Wenn die Wiederherstellungspause beendet wird, wird der Server herunterfahren." -#: access/transam/xlogrecovery.c:4630 +#: access/transam/xlogrecovery.c:4631 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Sie können den Server dann neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4642 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "Beförderung ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4651 +#: access/transam/xlogrecovery.c:4652 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Starten Sie den Server neu, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4675 +#: access/transam/xlogrecovery.c:4676 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4681 +#: access/transam/xlogrecovery.c:4682 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Sie können den Server neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4723 +#: access/transam/xlogrecovery.c:4724 #, c-format msgid "multiple recovery targets specified" msgstr "mehrere Wiederherstellungsziele angegeben" -#: access/transam/xlogrecovery.c:4724 +#: access/transam/xlogrecovery.c:4725 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr "Höchstens eins aus recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid darf gesetzt sein." -#: access/transam/xlogrecovery.c:4735 +#: access/transam/xlogrecovery.c:4736 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Der einzige erlaubte Wert ist »immediate«." -#: access/transam/xlogrecovery.c:4887 utils/adt/timestamp.c:186 +#: access/transam/xlogrecovery.c:4888 utils/adt/timestamp.c:186 #: utils/adt/timestamp.c:439 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp ist außerhalb des gültigen Bereichs: »%s«" -#: access/transam/xlogrecovery.c:4932 +#: access/transam/xlogrecovery.c:4933 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline ist keine gültige Zahl." @@ -3448,7 +3448,7 @@ msgstr "Der fehlgeschlagene Archivbefehl war: %s" msgid "archive command was terminated by exception 0x%X" msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3678 +#: archive/shell_archive.c:107 postmaster/postmaster.c:3679 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "Sehen Sie die Beschreibung des Hexadezimalwerts in der C-Include-Datei »ntstatus.h« nach." @@ -3664,7 +3664,7 @@ msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1166 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" @@ -4435,9 +4435,9 @@ msgstr "kann %s nicht löschen, weil andere Objekte davon abhängen" #: 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:6638 -#: utils/misc/guc.c:6672 utils/misc/guc.c:6706 utils/misc/guc.c:6749 -#: utils/misc/guc.c:6791 +#: 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" msgstr "%s" @@ -4625,14 +4625,14 @@ msgstr "Dadurch würde die generierte Spalte von ihrem eigenen Wert abhängen." msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1298 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1292 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "Spalte »%s« hat Typ %s, aber der Vorgabeausdruck hat Typ %s" #: catalog/heap.c:2814 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:1303 +#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1297 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen." @@ -4738,12 +4738,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:3607 +#: catalog/index.c:3685 commands/indexcmds.c:3614 #, 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:3487 commands/indexcmds.c:3631 +#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -4760,7 +4760,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:5738 +#: commands/trigger.c:5736 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" @@ -5064,74 +5064,74 @@ msgid "unrecognized object type \"%s\"" msgstr "unbekannter Objekttyp »%s«" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2966 #, c-format msgid "column %s of %s" msgstr "Spalte %s von %s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2981 #, c-format msgid "function %s" msgstr "Funktion %s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2994 #, c-format msgid "type %s" msgstr "Typ %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:3031 #, c-format msgid "cast from %s to %s" msgstr "Typumwandlung von %s in %s" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3064 #, c-format msgid "collation %s" msgstr "Sortierfolge %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3095 #, c-format msgid "constraint %s on %s" msgstr "Constraint %s für %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s" msgstr "Constraint %s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3133 #, c-format msgid "conversion %s" msgstr "Konversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3155 #, c-format msgid "default value for %s" msgstr "Vorgabewert für %s" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3166 #, c-format msgid "language %s" msgstr "Sprache %s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3174 #, c-format msgid "large object %u" msgstr "Large Object %u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3187 #, c-format msgid "operator %s" msgstr "Operator %s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3224 #, c-format msgid "operator class %s for access method %s" msgstr "Operatorklasse %s für Zugriffsmethode %s" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3252 #, c-format msgid "access method %s" msgstr "Zugriffsmethode %s" @@ -5140,7 +5140,7 @@ msgstr "Zugriffsmethode %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "Operator %d (%s, %s) von %s: %s" @@ -5149,236 +5149,236 @@ msgstr "Operator %d (%s, %s) von %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3372 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "Funktion %d (%s, %s) von %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3426 #, c-format msgid "rule %s on %s" msgstr "Regel %s für %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3472 #, c-format msgid "trigger %s on %s" msgstr "Trigger %s für %s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3492 #, c-format msgid "schema %s" msgstr "Schema %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3520 #, c-format msgid "statistics object %s" msgstr "Statistikobjekt %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3551 #, c-format msgid "text search parser %s" msgstr "Textsucheparser %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3582 #, c-format msgid "text search dictionary %s" msgstr "Textsuchewörterbuch %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3613 #, c-format msgid "text search template %s" msgstr "Textsuchevorlage %s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3644 #, c-format msgid "text search configuration %s" msgstr "Textsuchekonfiguration %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3657 #, c-format msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3694 catalog/objectaddress.c:5546 #, c-format msgid "membership of role %s in role %s" msgstr "Mitgliedschaft von Rolle %s in Rolle %s" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3715 #, c-format msgid "database %s" msgstr "Datenbank %s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3731 #, c-format msgid "tablespace %s" msgstr "Tablespace %s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3742 #, c-format msgid "foreign-data wrapper %s" msgstr "Fremddaten-Wrapper %s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3752 #, c-format msgid "server %s" msgstr "Server %s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3785 #, c-format msgid "user mapping for %s on server %s" msgstr "Benutzerabbildung für %s auf Server %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3837 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3841 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3847 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3851 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3857 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3861 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3867 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3871 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3877 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "Vorgabeprivilegien für neue Schemas von Rolle %s" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3884 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "Vorgabeprivilegien von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3888 #, c-format msgid "default privileges belonging to role %s" msgstr "Vorgabeprivilegien von Rolle %s" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3910 #, c-format msgid "extension %s" msgstr "Erweiterung %s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3927 #, c-format msgid "event trigger %s" msgstr "Ereignistrigger %s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3951 #, c-format msgid "parameter %s" msgstr "Parameter %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3994 #, c-format msgid "policy %s on %s" msgstr "Policy %s für %s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:4008 #, c-format msgid "publication %s" msgstr "Publikation %s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:4021 #, c-format msgid "publication of schema %s in publication %s" msgstr "Publikation von Schema %s in Publikation %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4052 #, c-format msgid "publication of %s in publication %s" msgstr "Publikation von %s in Publikation %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4065 #, c-format msgid "subscription %s" msgstr "Subskription %s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4086 #, c-format msgid "transform for %s language %s" msgstr "Transformation %s für Sprache %s" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4157 #, c-format msgid "table %s" msgstr "Tabelle %s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4162 #, c-format msgid "index %s" msgstr "Index %s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4166 #, c-format msgid "sequence %s" msgstr "Sequenz %s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4170 #, c-format msgid "toast table %s" msgstr "TOAST-Tabelle %s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4174 #, c-format msgid "view %s" msgstr "Sicht %s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4178 #, c-format msgid "materialized view %s" msgstr "materialisierte Sicht %s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4182 #, c-format msgid "composite type %s" msgstr "zusammengesetzter Typ %s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4186 #, c-format msgid "foreign table %s" msgstr "Fremdtabelle %s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4191 #, c-format msgid "relation %s" msgstr "Relation %s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4232 #, c-format msgid "operator family %s for access method %s" msgstr "Operatorfamilie %s für Zugriffsmethode %s" @@ -5420,7 +5420,7 @@ msgstr "Anfangswert darf nicht ausgelassen werden, wenn Übergangsfunktion strik msgid "return type of inverse transition function %s is not %s" msgstr "Rückgabetyp der inversen Übergangsfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3008 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "Striktheit der vorwärtigen und inversen Übergangsfunktionen einer Aggregatfunktion müssen übereinstimmen" @@ -6062,7 +6062,7 @@ msgstr "Fehler während der Erzeugung eines Multirange-Typs für Typ »%s«." msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Sie können einen Multirange-Typnamen manuell angeben, mit dem Attribut »multirange_type_name«." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:530 storage/buffer/bufmgr.c:1145 #, c-format msgid "invalid page in block %u of relation %s" msgstr "ungültige Seite in Block %u von Relation %s" @@ -6157,86 +6157,86 @@ msgstr "Parameter »parallel« muss SAFE, RESTRICTED oder UNSAFE sein" msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "Parameter »%s« muss READ_ONLY, SHAREABLE oder READ_WRITE sein" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:87 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" msgstr "Ereignistrigger »%s« existiert bereits" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "Fremddaten-Wrapper »%s« existiert bereits" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:96 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "Sprache »%s« existiert bereits" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:99 commands/publicationcmds.c:771 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:101 commands/subscriptioncmds.c:657 +#: commands/alter.c:102 commands/subscriptioncmds.c:657 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" -#: commands/alter.c:124 +#: commands/alter.c:125 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "Konversion »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:128 +#: commands/alter.c:129 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "Statistikobjekt »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:132 +#: commands/alter.c:133 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "Textsucheparser »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:136 +#: commands/alter.c:137 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "Textsuchewörterbuch »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:140 +#: commands/alter.c:141 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "Textsuchevorlage »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:144 +#: commands/alter.c:145 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "Textsuchekonfiguration »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:217 +#: commands/alter.c:218 #, c-format msgid "must be superuser to rename %s" msgstr "nur Superuser können %s umbenennen" -#: commands/alter.c:259 commands/subscriptioncmds.c:636 +#: commands/alter.c:260 commands/subscriptioncmds.c:636 #: commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 #: commands/subscriptioncmds.c:1837 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=false ist nur für Superuser" -#: commands/alter.c:260 commands/subscriptioncmds.c:637 +#: commands/alter.c:261 commands/subscriptioncmds.c:637 #: commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 #: commands/subscriptioncmds.c:1838 #, c-format msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." msgstr "Subskriptionen mit der Option password_required auf falsch gesetzt können nur vom Superuser erzeugt oder geändert werden." -#: commands/alter.c:775 +#: commands/alter.c:776 #, c-format msgid "must be superuser to set schema of %s" msgstr "nur Superuser können Schema von %s setzen" @@ -6256,8 +6256,8 @@ msgstr "Nur Superuser können Zugriffsmethoden anlegen." msgid "access method \"%s\" already exists" msgstr "Zugriffsmethode »%s« existiert bereits" -#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 -#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:846 +#: commands/opclasscmds.c:376 commands/opclasscmds.c:834 #, c-format msgid "access method \"%s\" does not exist" msgstr "Zugriffsmethode »%s« existiert nicht" @@ -6450,10 +6450,10 @@ msgstr "Attribut »%s« für Sortierfolge unbekannt" #: commands/collationcmds.c:125 commands/collationcmds.c:131 #: commands/define.c:389 commands/tablecmds.c:7952 -#: replication/pgoutput/pgoutput.c:309 replication/pgoutput/pgoutput.c:332 -#: replication/pgoutput/pgoutput.c:346 replication/pgoutput/pgoutput.c:356 -#: replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 -#: replication/pgoutput/pgoutput.c:386 replication/walsender.c:996 +#: 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 #, c-format msgid "conflicting or redundant options" @@ -6571,8 +6571,8 @@ msgstr "keine brauchbaren System-Locales gefunden" #: commands/dbcommands.c:1944 commands/dbcommands.c:2142 #: commands/dbcommands.c:2382 commands/dbcommands.c:2475 #: commands/dbcommands.c:2588 commands/dbcommands.c:3091 -#: utils/init/postinit.c:1021 utils/init/postinit.c:1085 -#: utils/init/postinit.c:1157 +#: utils/init/postinit.c:1023 utils/init/postinit.c:1087 +#: utils/init/postinit.c:1159 #, c-format msgid "database \"%s\" does not exist" msgstr "Datenbank »%s« existiert nicht" @@ -6843,7 +6843,7 @@ msgstr "Spalte »%s« ist eine generierte Spalte" msgid "Generated columns cannot be used in COPY." msgstr "Generierte Spalten können nicht in COPY verwendet werden." -#: commands/copy.c:842 commands/indexcmds.c:1886 commands/statscmds.c:242 +#: commands/copy.c:842 commands/indexcmds.c:1893 commands/statscmds.c:242 #: commands/tablecmds.c:2419 commands/tablecmds.c:3141 #: commands/tablecmds.c:3655 parser/parse_relation.c:3698 #: parser/parse_relation.c:3708 parser/parse_relation.c:3726 @@ -7299,7 +7299,7 @@ msgid "cannot use invalid database \"%s\" as template" msgstr "ungültige Datenbank »%s« kann nicht als Template verwendet werden" #: commands/dbcommands.c:988 commands/dbcommands.c:2393 -#: utils/init/postinit.c:1100 +#: utils/init/postinit.c:1102 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Verwenden Sie DROP DATABASE, um ungültige Datenbanken zu löschen." @@ -8658,298 +8658,298 @@ msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "kann nicht mehr als %d Argument an eine Prozedur übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Prozedur übergeben" -#: commands/indexcmds.c:640 +#: commands/indexcmds.c:647 #, c-format msgid "must specify at least one column" msgstr "mindestens eine Spalte muss angegeben werden" -#: commands/indexcmds.c:644 +#: commands/indexcmds.c:651 #, c-format msgid "cannot use more than %d columns in an index" msgstr "Index kann nicht mehr als %d Spalten enthalten" -#: commands/indexcmds.c:687 +#: commands/indexcmds.c:694 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "kann keinen Index für Relation »%s« erzeugen" -#: commands/indexcmds.c:713 +#: commands/indexcmds.c:720 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "kann Index für partitionierte Tabelle »%s« nicht nebenläufig erzeugen" -#: commands/indexcmds.c:718 +#: commands/indexcmds.c:725 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "kann keinen Exclusion-Constraint für partitionierte Tabelle »%s« erzeugen" -#: commands/indexcmds.c:728 +#: commands/indexcmds.c:735 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "kann keine Indexe für temporäre Tabellen anderer Sitzungen erzeugen" -#: commands/indexcmds.c:766 commands/tablecmds.c:802 commands/tablespace.c:1184 +#: commands/indexcmds.c:773 commands/tablecmds.c:802 commands/tablespace.c:1184 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "für partitionierte Relationen kann kein Standard-Tablespace angegeben werden" -#: commands/indexcmds.c:798 commands/tablecmds.c:833 commands/tablecmds.c:3435 +#: commands/indexcmds.c:805 commands/tablecmds.c:833 commands/tablecmds.c:3435 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "nur geteilte Relationen können in den Tablespace »pg_global« gelegt werden" -#: commands/indexcmds.c:831 +#: commands/indexcmds.c:838 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "ersetze Zugriffsmethode »gist« für obsolete Methode »rtree«" -#: commands/indexcmds.c:852 +#: commands/indexcmds.c:859 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "Zugriffsmethode »%s« unterstützt keine Unique Indexe" -#: commands/indexcmds.c:857 +#: commands/indexcmds.c:864 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "Zugriffsmethode »%s« unterstützt keine eingeschlossenen Spalten" -#: commands/indexcmds.c:862 +#: commands/indexcmds.c:869 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "Zugriffsmethode »%s« unterstützt keine mehrspaltigen Indexe" -#: commands/indexcmds.c:867 +#: commands/indexcmds.c:874 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "Zugriffsmethode »%s« unterstützt keine Exclusion-Constraints" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1001 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "Partitionierungsschlüssel kann nicht mit Zugriffsmethode »%s« mit einem Index gepaart werden" -#: commands/indexcmds.c:1004 +#: commands/indexcmds.c:1011 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "nicht unterstützter %s-Constraint mit Partitionierungsschlüsseldefinition" -#: commands/indexcmds.c:1006 +#: commands/indexcmds.c:1013 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s-Constraints können nicht verwendet werden, wenn Partitionierungsschlüssel Ausdrücke enthalten." -#: commands/indexcmds.c:1048 +#: commands/indexcmds.c:1055 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "Unique-Constraint für partitionierte Tabelle muss alle Partitionierungsspalten enthalten" -#: commands/indexcmds.c:1049 +#: commands/indexcmds.c:1056 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "Im %s-Constraint in Tabelle »%s« fehlt Spalte »%s«, welche Teil des Partitionierungsschlüssels ist." -#: commands/indexcmds.c:1068 commands/indexcmds.c:1087 +#: commands/indexcmds.c:1075 commands/indexcmds.c:1094 #, c-format msgid "index creation on system columns is not supported" msgstr "Indexerzeugung für Systemspalten wird nicht unterstützt" -#: commands/indexcmds.c:1316 tcop/utility.c:1526 +#: commands/indexcmds.c:1323 tcop/utility.c:1526 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "kann keinen Unique Index für partitionierte Tabelle »%s« erzeugen" -#: commands/indexcmds.c:1318 tcop/utility.c:1528 +#: commands/indexcmds.c:1325 tcop/utility.c:1528 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Tabelle »%s« enthält Partitionen, die Fremdtabellen sind." -#: commands/indexcmds.c:1803 +#: commands/indexcmds.c:1810 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "Funktionen im Indexprädikat müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1881 parser/parse_utilcmd.c:2557 +#: commands/indexcmds.c:1888 parser/parse_utilcmd.c:2557 #: parser/parse_utilcmd.c:2692 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "Spalte »%s«, die im Schlüssel verwendet wird, existiert nicht" -#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:1845 +#: commands/indexcmds.c:1912 parser/parse_utilcmd.c:1845 #, c-format msgid "expressions are not supported in included columns" msgstr "in eingeschlossenen Spalten werden keine Ausdrücke unterstützt" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1953 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "Funktionen im Indexausdruck müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:1968 #, c-format msgid "including column does not support a collation" msgstr "inkludierte Spalte unterstützt keine Sortierfolge" -#: commands/indexcmds.c:1965 +#: commands/indexcmds.c:1972 #, c-format msgid "including column does not support an operator class" msgstr "inkludierte Spalte unterstützt keine Operatorklasse" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1976 #, c-format msgid "including column does not support ASC/DESC options" msgstr "inkludierte Spalte unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1980 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2014 +#: commands/indexcmds.c:2021 #, c-format 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:2022 commands/tablecmds.c:17718 commands/typecmds.c:807 +#: 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 #: utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "Sortierfolgen werden von Typ %s nicht unterstützt" -#: commands/indexcmds.c:2087 +#: commands/indexcmds.c:2094 #, c-format msgid "operator %s is not commutative" msgstr "Operator %s ist nicht kommutativ" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2096 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "In Exclusion-Constraints können nur kommutative Operatoren verwendet werden." -#: commands/indexcmds.c:2115 +#: commands/indexcmds.c:2122 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "Operator %s ist kein Mitglied der Operatorfamilie »%s«" -#: commands/indexcmds.c:2118 +#: commands/indexcmds.c:2125 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "Der Exklusionsoperator muss in Beziehung zur Indexoperatorklasse des Constraints stehen." -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2160 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:2158 +#: commands/indexcmds.c:2165 #, c-format 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:2204 commands/tablecmds.c:17743 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17743 #: commands/tablecmds.c:17749 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«" -#: commands/indexcmds.c:2206 +#: commands/indexcmds.c:2213 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Sie müssen für den Index eine Operatorklasse angeben oder eine Standardoperatorklasse für den Datentyp definieren." -#: commands/indexcmds.c:2235 commands/indexcmds.c:2243 -#: commands/opclasscmds.c:205 +#: commands/indexcmds.c:2242 commands/indexcmds.c:2250 +#: commands/opclasscmds.c:206 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2257 commands/typecmds.c:2289 +#: commands/indexcmds.c:2264 commands/typecmds.c:2289 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" -#: commands/indexcmds.c:2347 +#: commands/indexcmds.c:2354 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "es gibt mehrere Standardoperatorklassen für Datentyp %s" -#: commands/indexcmds.c:2675 +#: commands/indexcmds.c:2682 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" -#: commands/indexcmds.c:2899 +#: commands/indexcmds.c:2906 #, 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:2913 +#: commands/indexcmds.c:2920 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2958 commands/indexcmds.c:3468 -#: commands/indexcmds.c:3596 +#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 +#: commands/indexcmds.c:3603 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2981 +#: commands/indexcmds.c:2988 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:3075 +#: commands/indexcmds.c:3082 #, 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:3108 +#: commands/indexcmds.c:3115 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:3154 +#: commands/indexcmds.c:3161 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:3157 +#: commands/indexcmds.c:3164 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3348 commands/indexcmds.c:4204 +#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3500 commands/indexcmds.c:3552 +#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 #, 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:3506 +#: commands/indexcmds.c:3513 #, 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:3661 +#: commands/indexcmds.c:3668 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3682 +#: commands/indexcmds.c:3689 #, 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:4185 commands/indexcmds.c:4197 +#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4187 commands/indexcmds.c:4206 +#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 #, c-format msgid "%s." msgstr "%s." @@ -8989,224 +8989,224 @@ msgstr "neue Daten für materialisierte Sicht »%s« enthalten doppelte Zeilen o msgid "Row: %s" msgstr "Zeile: %s" -#: commands/opclasscmds.c:124 +#: commands/opclasscmds.c:125 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "Operatorfamilie »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/opclasscmds.c:267 +#: commands/opclasscmds.c:268 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "Operatorfamilie »%s« für Zugriffsmethode »%s« existiert bereits" -#: commands/opclasscmds.c:416 +#: commands/opclasscmds.c:417 #, c-format msgid "must be superuser to create an operator class" msgstr "nur Superuser können Operatorklassen erzeugen" -#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 -#: commands/opclasscmds.c:1056 +#: commands/opclasscmds.c:494 commands/opclasscmds.c:911 +#: commands/opclasscmds.c:1057 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "ungültige Operatornummer %d, muss zwischen 1 und %d sein" -#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 -#: commands/opclasscmds.c:1072 +#: commands/opclasscmds.c:539 commands/opclasscmds.c:961 +#: commands/opclasscmds.c:1073 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "ungültige Funktionsnummer %d, muss zwischen 1 und %d sein" -#: commands/opclasscmds.c:567 +#: commands/opclasscmds.c:568 #, c-format msgid "storage type specified more than once" msgstr "Storage-Typ mehrmals angegeben" -#: commands/opclasscmds.c:594 +#: commands/opclasscmds.c:595 #, c-format msgid "storage type cannot be different from data type for access method \"%s\"" msgstr "Storage-Typ kann nicht vom Datentyp der Zugriffsmethode »%s« verschieden sein" -#: commands/opclasscmds.c:610 +#: commands/opclasscmds.c:611 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "Operatorklasse »%s« für Zugriffsmethode »%s« existiert bereits" -#: commands/opclasscmds.c:638 +#: commands/opclasscmds.c:639 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "konnte Operatorklasse »%s« nicht zum Standard für Typ %s machen" -#: commands/opclasscmds.c:641 +#: commands/opclasscmds.c:642 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "Operatorklasse »%s« ist bereits der Standard." -#: commands/opclasscmds.c:801 +#: commands/opclasscmds.c:802 #, c-format msgid "must be superuser to create an operator family" msgstr "nur Superuser können Operatorfamilien erzeugen" -#: commands/opclasscmds.c:861 +#: commands/opclasscmds.c:862 #, c-format msgid "must be superuser to alter an operator family" msgstr "nur Superuser können Operatorfamilien ändern" -#: commands/opclasscmds.c:919 +#: commands/opclasscmds.c:920 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "Operatorargumenttypen müssen in ALTER OPERATOR FAMILY angegeben werden" -#: commands/opclasscmds.c:994 +#: commands/opclasscmds.c:995 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "STORAGE kann in ALTER OPERATOR FAMILY nicht angegeben werden" -#: commands/opclasscmds.c:1128 +#: commands/opclasscmds.c:1129 #, c-format msgid "one or two argument types must be specified" msgstr "ein oder zwei Argumenttypen müssen angegeben werden" -#: commands/opclasscmds.c:1154 +#: commands/opclasscmds.c:1155 #, c-format msgid "index operators must be binary" msgstr "Indexoperatoren müssen binär sein" -#: commands/opclasscmds.c:1173 +#: commands/opclasscmds.c:1174 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "Zugriffsmethode »%s« unterstützt keine Sortieroperatoren" -#: commands/opclasscmds.c:1184 +#: commands/opclasscmds.c:1185 #, c-format msgid "index search operators must return boolean" msgstr "Indexsuchoperatoren müssen Typ boolean zurückgeben" -#: commands/opclasscmds.c:1224 +#: commands/opclasscmds.c:1225 #, c-format msgid "associated data types for operator class options parsing functions must match opclass input type" msgstr "zugehörige Datentypen für Operatorklassenoptionsparsefunktionen müssen mit Operatorklasseneingabetyp übereinstimmen" -#: commands/opclasscmds.c:1231 +#: commands/opclasscmds.c:1232 #, c-format msgid "left and right associated data types for operator class options parsing functions must match" msgstr "linke und rechte zugehörige Datentypen für Operatorklassenoptionsparsefunktionen müssen übereinstimmen" -#: commands/opclasscmds.c:1239 +#: commands/opclasscmds.c:1240 #, c-format msgid "invalid operator class options parsing function" msgstr "ungültige Operatorklassenoptionsparsefunktion" -#: commands/opclasscmds.c:1240 +#: commands/opclasscmds.c:1241 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "Gültige Signatur einer Operatorklassenoptionsparsefunktion ist %s." -#: commands/opclasscmds.c:1259 +#: commands/opclasscmds.c:1260 #, c-format msgid "btree comparison functions must have two arguments" msgstr "btree-Vergleichsfunktionen müssen zwei Argumente haben" -#: commands/opclasscmds.c:1263 +#: commands/opclasscmds.c:1264 #, c-format msgid "btree comparison functions must return integer" msgstr "btree-Vergleichsfunktionen müssen Typ integer zurückgeben" -#: commands/opclasscmds.c:1280 +#: commands/opclasscmds.c:1281 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "btree-Sortierunterstützungsfunktionen müssen Typ »internal« akzeptieren" -#: commands/opclasscmds.c:1284 +#: commands/opclasscmds.c:1285 #, c-format msgid "btree sort support functions must return void" msgstr "btree-Sortierunterstützungsfunktionen müssen Typ void zurückgeben" -#: commands/opclasscmds.c:1295 +#: commands/opclasscmds.c:1296 #, c-format msgid "btree in_range functions must have five arguments" msgstr "btree-in_range-Funktionen müssen fünf Argumente haben" -#: commands/opclasscmds.c:1299 +#: commands/opclasscmds.c:1300 #, c-format msgid "btree in_range functions must return boolean" msgstr "btree-in_range-Funktionen müssen Typ boolean zurückgeben" -#: commands/opclasscmds.c:1315 +#: commands/opclasscmds.c:1316 #, c-format msgid "btree equal image functions must have one argument" msgstr "btree-equal-image-Funktionen müssen ein Argument haben" -#: commands/opclasscmds.c:1319 +#: commands/opclasscmds.c:1320 #, c-format msgid "btree equal image functions must return boolean" msgstr "btree-equal-image-Funktionen müssen Typ boolean zurückgeben" -#: commands/opclasscmds.c:1332 +#: commands/opclasscmds.c:1333 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "btree-equal-image-Funktionen dürfen nicht typübergreifend sein" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1343 #, c-format msgid "hash function 1 must have one argument" msgstr "Hash-Funktion 1 muss ein Argument haben" -#: commands/opclasscmds.c:1346 +#: commands/opclasscmds.c:1347 #, c-format msgid "hash function 1 must return integer" msgstr "Hash-Funktion 1 muss Typ integer zurückgeben" -#: commands/opclasscmds.c:1353 +#: commands/opclasscmds.c:1354 #, c-format msgid "hash function 2 must have two arguments" msgstr "Hash-Funktion 2 muss zwei Argumente haben" -#: commands/opclasscmds.c:1357 +#: commands/opclasscmds.c:1358 #, c-format msgid "hash function 2 must return bigint" msgstr "Hash-Funktion 2 muss Typ bigint zurückgeben" -#: commands/opclasscmds.c:1382 +#: commands/opclasscmds.c:1383 #, c-format msgid "associated data types must be specified for index support function" msgstr "zugehörige Datentypen müssen für Indexunterstützungsfunktion angegeben werden" -#: commands/opclasscmds.c:1407 +#: commands/opclasscmds.c:1408 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "Funktionsnummer %d für (%s,%s) einscheint mehrmals" -#: commands/opclasscmds.c:1414 +#: commands/opclasscmds.c:1415 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "Operatornummer %d für (%s,%s) einscheint mehrmals" -#: commands/opclasscmds.c:1460 +#: commands/opclasscmds.c:1461 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "Operator %d(%s,%s) existiert bereits in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1590 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "Funktion %d(%s,%s) existiert bereits in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1745 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "Operator %d(%s,%s) existiert nicht in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1785 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "Funktion %d(%s,%s) existiert nicht in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1816 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "Operatorklasse »%s« für Zugriffsmethode »%s« existiert bereits in Schema »%s«" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1839 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "Operatorfamilie »%s« für Zugriffsmethode »%s« existiert bereits in Schema »%s«" @@ -9365,7 +9365,7 @@ 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 -#: utils/init/miscinit.c:1822 +#: utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "ungültige Listensyntax für Parameter »%s«" @@ -9807,7 +9807,7 @@ msgstr "Statistikobjekt »%s.%s« existiert nicht, wird übersprungen" msgid "unrecognized subscription parameter: \"%s\"" msgstr "unbekannter Subskriptionsparameter: »%s«" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:395 +#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:402 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "unbekannter Origin-Wert: »%s«" @@ -9979,7 +9979,7 @@ msgid "Verify that initial data copied from the publisher tables did not come fr msgstr "Überprüfen Sie, dass die von den publizierten Tabellen kopierten initialen Daten nicht von anderen Origins kamen." #: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:893 -#: replication/pgoutput/pgoutput.c:1112 +#: replication/pgoutput/pgoutput.c:1138 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "für Tabelle »%s.%s« können nicht verschiedene Spaltenlisten für verschiedene Publikationen verwendet werden" @@ -10076,7 +10076,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:19292 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19318 #: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" @@ -10239,11 +10239,11 @@ msgstr "geerbte Spalte »%s« hat Typkonflikt" #: commands/tablecmds.c:2613 commands/tablecmds.c:2642 #: commands/tablecmds.c:2661 commands/tablecmds.c:2933 #: commands/tablecmds.c:2969 commands/tablecmds.c:2985 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 #: parser/parse_param.c:223 #, c-format msgid "%s versus %s" @@ -10902,7 +10902,7 @@ msgstr "USING kann nicht angegeben werden, wenn der Typ einer generierten Spalte #: commands/tablecmds.c:12446 commands/tablecmds.c:17561 #: commands/tablecmds.c:17651 commands/trigger.c:663 -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:972 +#: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Spalte »%s« ist eine generierte Spalte." @@ -11425,54 +11425,54 @@ msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19326 commands/tablecmds.c:19346 -#: commands/tablecmds.c:19367 commands/tablecmds.c:19386 -#: commands/tablecmds.c:19428 +#: commands/tablecmds.c:19352 commands/tablecmds.c:19372 +#: commands/tablecmds.c:19393 commands/tablecmds.c:19412 +#: commands/tablecmds.c:19454 #, 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:19329 +#: commands/tablecmds.c:19355 #, 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:19349 +#: commands/tablecmds.c:19375 #, 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:19370 +#: commands/tablecmds.c:19396 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:19389 +#: commands/tablecmds.c:19415 #, 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:19431 +#: commands/tablecmds.c:19457 #, 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:19667 +#: commands/tablecmds.c:19693 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:19674 +#: commands/tablecmds.c:19700 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:19700 +#: commands/tablecmds.c:19726 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:19710 +#: commands/tablecmds.c:19736 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" @@ -11863,17 +11863,17 @@ msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4608 +#: commands/trigger.c:4606 #, 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:5789 +#: commands/trigger.c:5787 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5812 +#: commands/trigger.c:5810 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" @@ -12392,8 +12392,8 @@ msgstr "Um das Passwort einer anderen Rolle zu ändern, muss der aktuelle Benutz #: commands/user.c:826 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können Mitglieder hinzufügen." +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können Mitglieder hinzufügen oder entfernen." #: commands/user.c:871 #, c-format @@ -12425,11 +12425,11 @@ msgstr "Nur Rollen mit dem %s-Attribut und der %s-Option für die Zielrollen kö msgid "cannot use special role specifier in DROP ROLE" msgstr "in DROP ROLE kann kein Rollenplatzhalter verwendet werden" -#: commands/user.c:1136 commands/user.c:1358 commands/variable.c:836 -#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 +#: 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/regproc.c:1551 utils/init/miscinit.c:756 +#: utils/adt/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" msgstr "Rolle »%s« existiert nicht" @@ -12888,32 +12888,42 @@ msgstr "»client_encoding« kann jetzt nicht geändert werden." msgid "cannot change client_encoding during a parallel operation" msgstr "client_encoding kann nicht während einer parallelen Operation geändert werden" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "es wird keine Berechtigung gegeben werden, um Sitzungsautorisierung »%s« zu setzen" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "keine Berechtigung, um Sitzungsautorisierung »%s« zu setzen" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "Berechtigung fehlt, um Rolle »%s« zu setzen" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "keine Berechtigung, um Rolle »%s« zu setzen" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour wird von dieser Installation nicht unterstützt" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "SSL wird von dieser Installation nicht unterstützt" @@ -13004,19 +13014,19 @@ msgstr "Cursor »%s« ist nicht auf eine Zeile positioniert" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "Cursor »%s« ist kein einfach aktualisierbarer Scan der Tabelle »%s«" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2510 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "Typ von Parameter %d (%s) stimmt nicht mit dem überein, als der Plan vorbereitet worden ist (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2522 #, c-format msgid "no value found for parameter %d" msgstr "kein Wert für Parameter %d gefunden" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 -#: executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 -#: executor/execExprInterp.c:4350 executor/nodeModifyTable.c:205 +#: 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 #, c-format @@ -13033,7 +13043,7 @@ msgstr "Anfrage hat zu viele Spalten." 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:4252 +#: executor/execExpr.c:651 executor/execExprInterp.c:4264 #: executor/nodeModifyTable.c:217 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." @@ -13044,17 +13054,17 @@ msgstr "Tabelle hat Typ %s auf Position %d, aber Anfrage erwartet %s." msgid "window function calls cannot be nested" msgstr "Aufrufe von Fensterfunktionen können nicht geschachtelt werden" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1626 #, c-format msgid "target type is not an array" msgstr "Zieltyp ist kein Array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1966 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()-Spalte hat Typ %s statt Typ %s" -#: executor/execExpr.c:2576 executor/execSRF.c:719 parser/parse_func.c:138 +#: executor/execExpr.c:2584 executor/execSRF.c:719 parser/parse_func.c:138 #: parser/parse_func.c:655 parser/parse_func.c:1032 #, c-format msgid "cannot pass more than %d argument to a function" @@ -13062,39 +13072,39 @@ msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "kann nicht mehr als %d Argument an eine Funktion übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Funktion übergeben" -#: executor/execExpr.c:2603 executor/execSRF.c:739 executor/functions.c:1068 +#: executor/execExpr.c:2611 executor/execSRF.c:739 executor/functions.c:1068 #: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: executor/execExpr.c:3009 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3017 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "kann aus Typ %s kein Element auswählen, weil er Subscripting nicht unterstützt" -#: executor/execExpr.c:3137 executor/execExpr.c:3159 +#: executor/execExpr.c:3145 executor/execExpr.c:3167 #, c-format msgid "type %s does not support subscripted assignment" msgstr "Typ %s unterstützt Wertzuweisungen in Elemente nicht" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:1974 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "Attribut %d von Typ %s wurde gelöscht" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:1980 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "Attribut %d von Typ %s hat falschen Typ" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 -#: executor/execExprInterp.c:3150 +#: executor/execExprInterp.c:1982 executor/execExprInterp.c:3116 +#: executor/execExprInterp.c:3162 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." -#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 +#: executor/execExprInterp.c:2062 utils/adt/expandedrecord.c:99 #: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 #: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 #: utils/fmgr/funcapi.c:569 @@ -13102,22 +13112,22 @@ msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: executor/execExprInterp.c:2588 +#: executor/execExprInterp.c:2600 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF wird für diesen Tabellentyp nicht unterstützt" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2813 #, c-format msgid "cannot merge incompatible arrays" msgstr "kann inkompatible Arrays nicht verschmelzen" -#: executor/execExprInterp.c:2802 +#: executor/execExprInterp.c:2814 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s verwendet werden." -#: executor/execExprInterp.c:2823 utils/adt/arrayfuncs.c:266 +#: 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 @@ -13126,12 +13136,12 @@ msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen (%d) überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 +#: executor/execExprInterp.c:2855 executor/execExprInterp.c:2890 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 +#: executor/execExprInterp.c:2867 utils/adt/array_expanded.c:274 #: utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 #: utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 #: utils/adt/arrayfuncs.c:2654 utils/adt/arrayfuncs.c:2670 @@ -13144,29 +13154,29 @@ msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dim msgid "array size exceeds the maximum allowed (%d)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:3115 executor/execExprInterp.c:3161 #, c-format msgid "attribute %d has wrong type" msgstr "Attribut %d hat falschen Typ" -#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3747 utils/adt/domains.c:155 #, c-format msgid "domain %s does not allow null values" msgstr "Domäne %s erlaubt keine NULL-Werte" -#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3762 utils/adt/domains.c:193 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "Wert für Domäne %s verletzt Check-Constraint »%s«" -#: executor/execExprInterp.c:4235 +#: executor/execExprInterp.c:4247 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "Tabellenzeile enthält %d Attribut, aber Anfrage erwartet %d." msgstr[1] "Tabellenzeile enthält %d Attribute, aber Anfrage erwartet %d." -#: executor/execExprInterp.c:4351 executor/execSRF.c:978 +#: executor/execExprInterp.c:4363 executor/execSRF.c:978 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Physischer Speicher stimmt nicht überein mit gelöschtem Attribut auf Position %d." @@ -13206,175 +13216,175 @@ msgstr "Schlüssel %s kollidiert mit vorhandenem Schlüssel %s." msgid "Key conflicts with existing key." msgstr "Der Schlüssel kollidiert mit einem vorhandenen Schlüssel." -#: executor/execMain.c:1045 +#: executor/execMain.c:1037 #, c-format msgid "cannot change sequence \"%s\"" msgstr "kann Sequenz »%s« nicht ändern" -#: executor/execMain.c:1051 +#: executor/execMain.c:1043 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "kann TOAST-Relation »%s« nicht ändern" -#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3092 -#: rewrite/rewriteHandler.c:3990 +#: executor/execMain.c:1061 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:4023 #, c-format msgid "cannot insert into view \"%s\"" msgstr "kann nicht in Sicht »%s« einfügen" -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3095 -#: rewrite/rewriteHandler.c:3993 +#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3128 +#: rewrite/rewriteHandler.c:4026 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Um Einfügen in die Sicht zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger oder eine ON INSERT DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3100 -#: rewrite/rewriteHandler.c:3998 +#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3133 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "cannot update view \"%s\"" msgstr "kann Sicht »%s« nicht aktualisieren" -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3103 -#: rewrite/rewriteHandler.c:4001 +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3136 +#: rewrite/rewriteHandler.c:4034 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Um Aktualisieren der Sicht zu ermöglichen, richten Sie einen INSTEAD OF UPDATE Trigger oder eine ON UPDATE DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1085 rewrite/rewriteHandler.c:3108 -#: rewrite/rewriteHandler.c:4006 +#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3141 +#: rewrite/rewriteHandler.c:4039 #, c-format msgid "cannot delete from view \"%s\"" msgstr "kann nicht aus Sicht »%s« löschen" -#: executor/execMain.c:1087 rewrite/rewriteHandler.c:3111 -#: rewrite/rewriteHandler.c:4009 +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:4042 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Um Löschen aus der Sicht zu ermöglichen, richten Sie einen INSTEAD OF DELETE Trigger oder eine ON DELETE DO INSTEAD Regel ohne Bedingung ein." -#: executor/execMain.c:1098 +#: executor/execMain.c:1090 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "kann materialisierte Sicht »%s« nicht ändern" -#: executor/execMain.c:1110 +#: executor/execMain.c:1102 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "kann nicht in Fremdtabelle »%s« einfügen" -#: executor/execMain.c:1116 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "Fremdtabelle »%s« erlaubt kein Einfügen" -#: executor/execMain.c:1123 +#: executor/execMain.c:1115 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht aktualisieren" -#: executor/execMain.c:1129 +#: executor/execMain.c:1121 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "Fremdtabelle »%s« erlaubt kein Aktualisieren" -#: executor/execMain.c:1136 +#: executor/execMain.c:1128 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "kann nicht aus Fremdtabelle »%s« löschen" -#: executor/execMain.c:1142 +#: executor/execMain.c:1134 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "Fremdtabelle »%s« erlaubt kein Löschen" -#: executor/execMain.c:1153 +#: executor/execMain.c:1145 #, c-format msgid "cannot change relation \"%s\"" msgstr "kann Relation »%s« nicht ändern" -#: executor/execMain.c:1180 +#: executor/execMain.c:1172 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "kann Zeilen in Sequenz »%s« nicht sperren" -#: executor/execMain.c:1187 +#: executor/execMain.c:1179 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "kann Zeilen in TOAST-Relation »%s« nicht sperren" -#: executor/execMain.c:1194 +#: executor/execMain.c:1186 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "kann Zeilen in Sicht »%s« nicht sperren" -#: executor/execMain.c:1202 +#: executor/execMain.c:1194 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "kann Zeilen in materialisierter Sicht »%s« nicht sperren" -#: executor/execMain.c:1211 executor/execMain.c:2716 +#: executor/execMain.c:1203 executor/execMain.c:2711 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "kann Zeilen in Fremdtabelle »%s« nicht sperren" -#: executor/execMain.c:1217 +#: executor/execMain.c:1209 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "kann Zeilen in Relation »%s« nicht sperren" -#: executor/execMain.c:1930 +#: executor/execMain.c:1925 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "neue Zeile für Relation »%s« verletzt Partitions-Constraint" -#: executor/execMain.c:1932 executor/execMain.c:2016 executor/execMain.c:2067 -#: executor/execMain.c:2177 +#: executor/execMain.c:1927 executor/execMain.c:2011 executor/execMain.c:2062 +#: executor/execMain.c:2172 #, c-format msgid "Failing row contains %s." msgstr "Fehlgeschlagene Zeile enthält %s." -#: executor/execMain.c:2013 +#: executor/execMain.c:2008 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "NULL-Wert in Spalte »%s« von Relation »%s« verletzt Not-Null-Constraint" -#: executor/execMain.c:2065 +#: executor/execMain.c:2060 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "neue Zeile für Relation »%s« verletzt Check-Constraint »%s«" -#: executor/execMain.c:2175 +#: executor/execMain.c:2170 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "neue Zeile verletzt Check-Option für Sicht »%s«" -#: executor/execMain.c:2185 +#: executor/execMain.c:2180 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« für Tabelle »%s«" -#: executor/execMain.c:2190 +#: executor/execMain.c:2185 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene für Tabelle »%s«" -#: executor/execMain.c:2198 +#: executor/execMain.c:2193 #, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "Zielzeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2203 +#: executor/execMain.c:2198 #, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "Zielzeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2210 +#: executor/execMain.c:2205 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2215 +#: executor/execMain.c:2210 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" @@ -13595,7 +13605,7 @@ msgstr "Die letzte Anweisung gibt zu wenige Spalten zurück." msgid "return type %s is not supported for SQL functions" msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2992 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "Aggregatfunktion %u muss kompatiblen Eingabe- und Übergangstyp haben" @@ -13768,7 +13778,7 @@ msgstr "Frame-Ende-Offset darf nicht NULL sein" msgid "frame ending offset must not be negative" msgstr "Frame-Ende-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2908 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "Aggregatfunktion %s unterstützt die Verwendung als Fensterfunktion nicht" @@ -16033,12 +16043,12 @@ msgstr "ungültige Zeichenkette in Message" msgid "invalid message format" msgstr "ungültiges Message-Format" -#: main/main.c:235 +#: main/main.c:237 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup fehlgeschlagen: %d\n" -#: main/main.c:329 +#: main/main.c:331 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -16047,7 +16057,7 @@ msgstr "" "%s ist der PostgreSQL-Server.\n" "\n" -#: main/main.c:330 +#: main/main.c:332 #, c-format msgid "" "Usage:\n" @@ -16058,107 +16068,107 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: main/main.c:331 +#: main/main.c:333 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: main/main.c:332 +#: main/main.c:334 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ZAHL Anzahl der geteilten Puffer\n" -#: main/main.c:333 +#: main/main.c:335 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:334 +#: main/main.c:336 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME Wert des Konfigurationsparameters ausgeben, dann beenden\n" -#: main/main.c:335 +#: main/main.c:337 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 Debug-Level\n" -#: main/main.c:336 +#: main/main.c:338 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D VERZEICHNIS Datenbankverzeichnis\n" -#: main/main.c:337 +#: main/main.c:339 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e verwende europäisches Datumseingabeformat (DMY)\n" -#: main/main.c:338 +#: main/main.c:340 #, c-format msgid " -F turn fsync off\n" msgstr " -F »fsync« ausschalten\n" -#: main/main.c:339 +#: main/main.c:341 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME horche auf Hostname oder IP-Adresse\n" -#: main/main.c:340 +#: main/main.c:342 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i ermögliche TCP/IP-Verbindungen (veraltet)\n" -#: main/main.c:341 +#: main/main.c:343 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k VERZEICHNIS Ort der Unix-Domain-Socket\n" -#: main/main.c:343 +#: main/main.c:345 #, c-format msgid " -l enable SSL connections\n" msgstr " -l ermögliche SSL-Verbindungen\n" -#: main/main.c:345 +#: main/main.c:347 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N ZAHL Anzahl der erlaubten Verbindungen\n" -#: main/main.c:346 +#: main/main.c:348 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT auf dieser Portnummer horchen\n" -#: main/main.c:347 +#: main/main.c:349 #, c-format msgid " -s show statistics after each query\n" msgstr " -s zeige Statistiken nach jeder Anfrage\n" -#: main/main.c:348 +#: main/main.c:350 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S ZAHL setze Speicher für Sortiervorgänge (in kB)\n" -#: main/main.c:349 +#: main/main.c:351 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: main/main.c:350 +#: main/main.c:352 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:351 +#: main/main.c:353 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config zeige Konfigurationsparameter und beende\n" -#: main/main.c:352 +#: main/main.c:354 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: main/main.c:354 +#: main/main.c:356 #, c-format msgid "" "\n" @@ -16167,37 +16177,37 @@ msgstr "" "\n" "Entwickleroptionen:\n" -#: main/main.c:355 +#: main/main.c:357 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h verbiete Verwendung einiger Plantypen\n" -#: main/main.c:356 +#: main/main.c:358 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O erlaube Änderungen an Systemtabellenstruktur\n" -#: main/main.c:357 +#: main/main.c:359 #, c-format msgid " -P disable system indexes\n" msgstr " -P schalte Systemindexe aus\n" -#: main/main.c:358 +#: main/main.c:360 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex zeige Zeitmessung nach jeder Anfrage\n" -#: main/main.c:359 +#: main/main.c:361 #, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr " -T SIGABRT an alle Backend-Prozesse senden wenn einer stirbt\n" -#: main/main.c:360 +#: main/main.c:362 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W ZAHL warte ZAHL Sekunden, um Debugger starten zu können\n" -#: main/main.c:362 +#: main/main.c:364 #, c-format msgid "" "\n" @@ -16206,39 +16216,39 @@ msgstr "" "\n" "Optionen für Einzelbenutzermodus:\n" -#: main/main.c:363 +#: main/main.c:365 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single wählt den Einzelbenutzermodus (muss erstes Argument sein)\n" -#: main/main.c:364 +#: main/main.c:366 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME Datenbankname (Vorgabe: Benutzername)\n" -#: main/main.c:365 +#: main/main.c:367 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 Debug-Level setzen\n" -#: main/main.c:366 +#: main/main.c:368 #, c-format msgid " -E echo statement before execution\n" msgstr " -E gebe Befehl vor der Ausführung aus\n" -#: main/main.c:367 +#: main/main.c:369 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr "" " -j verwende Zeilenende nicht als Anfrageende im interaktiven\n" " Modus\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:370 main/main.c:376 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r DATEINAME sende stdout und stderr in genannte Datei\n" -#: main/main.c:370 +#: main/main.c:372 #, c-format msgid "" "\n" @@ -16247,22 +16257,22 @@ msgstr "" "\n" "Optionen für Bootstrap-Modus:\n" -#: main/main.c:371 +#: main/main.c:373 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot wählt den Bootstrap-Modus (muss erstes Argument sein)\n" -#: main/main.c:372 +#: main/main.c:374 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check wählt den Check-Modus (muss erstes Argument sein)\n" -#: main/main.c:373 +#: main/main.c:375 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME Datenbankname (Pflichtangabe im Bootstrap-Modus)\n" -#: main/main.c:376 +#: main/main.c:378 #, c-format msgid "" "\n" @@ -16279,12 +16289,12 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: main/main.c:380 +#: main/main.c:382 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: main/main.c:391 +#: main/main.c:393 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16298,12 +16308,12 @@ msgstr "" "Dokumentation finden Sie weitere Informationen darüber, wie der\n" "Server richtig gestartet wird.\n" -#: main/main.c:408 +#: main/main.c:410 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: reelle und effektive Benutzer-IDs müssen übereinstimmen\n" -#: main/main.c:415 +#: main/main.c:417 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16338,8 +16348,8 @@ msgstr "Relation »%s« hat keinen zusammengesetzten Typ" msgid "unrecognized JSON encoding: %s" msgstr "unbekannte JSON-Kodierung: %s" -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: 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 #: utils/fmgr/funcapi.c:669 #, c-format @@ -16374,44 +16384,44 @@ msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s kann nicht auf die nullbare Seite eines äußeren Verbundes angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1367 parser/analyze.c:1772 parser/analyze.c:2029 +#: optimizer/plan/planner.c:1361 parser/analyze.c:1772 parser/analyze.c:2029 #: parser/analyze.c:3242 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:2082 optimizer/plan/planner.c:4042 +#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4036 #, c-format msgid "could not implement GROUP BY" msgstr "konnte GROUP BY nicht implementieren" -#: optimizer/plan/planner.c:2083 optimizer/plan/planner.c:4043 -#: optimizer/plan/planner.c:4683 optimizer/prep/prepunion.c:1053 +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4037 +#: optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Einige Datentypen unterstützen nur Hashing, während andere nur Sortieren unterstützen." -#: optimizer/plan/planner.c:4682 +#: optimizer/plan/planner.c:4676 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:6021 +#: optimizer/plan/planner.c:6015 #, c-format msgid "could not implement window PARTITION BY" msgstr "konnte PARTITION BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6022 +#: optimizer/plan/planner.c:6016 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fensterpartitionierungsspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/planner.c:6026 +#: optimizer/plan/planner.c:6020 #, c-format msgid "could not implement window ORDER BY" msgstr "konnte ORDER BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6027 +#: optimizer/plan/planner.c:6021 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." @@ -16427,7 +16437,7 @@ msgid "All column datatypes must be hashable." msgstr "Alle Spaltendatentypen müssen hashbar sein." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1051 #, c-format msgid "could not implement %s" msgstr "konnte %s nicht implementieren" @@ -17315,121 +17325,121 @@ msgid "argument of %s must not return a set" msgstr "Argument von %s darf keine Ergebnismenge zurückgeben" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s-Typen %s und %s passen nicht zusammen" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "Argumenttypen %s und %s passen nicht zusammen" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s konnte Typ %s nicht in %s umwandeln" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "als »%s« deklarierte Argumente sind nicht alle gleich" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 #: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "als %s deklariertes Argument ist kein Array sondern Typ %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 #: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "als %s deklariertes Argument ist kein Bereichstyp sondern Typ %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "als %s deklariertes Argument ist kein Multirange-Typ sondern Typ %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kann Elementtyp des Arguments mit Typ »anyarray« nicht bestimmen" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "als %s deklariertes Argument ist nicht mit als %s deklariertem Argument konsistent" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "konnte polymorphischen Typ nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "mit »anynonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "mit »anyenum« gepaarter Typ ist kein Enum-Typ: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "Argumente der anycompatible-Familie können nicht in einen gemeinsamen Typ umgewandelt werden" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "konnte polymorphischen Typ %s nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "mit »anycompatiblenonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyrange oder anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyelement, anyarray, anynonarray, anyenum, anyrange oder anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "Ein Ergebnis mit Typ internal benötigt mindestens eine Eingabe mit Typ internal." @@ -18777,7 +18787,7 @@ msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELE msgstr "Regeln mit WHERE-Bedingungen können als Aktion nur SELECT, INSERT, UPDATE oder DELETE haben" #: parser/parse_utilcmd.c:3174 parser/parse_utilcmd.c:3275 -#: rewrite/rewriteHandler.c:540 rewrite/rewriteManip.c:1087 +#: rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1088 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION/INTERSECTION/EXCEPT mit Bedingung sind nicht implementiert" @@ -19092,12 +19102,12 @@ msgstr "Huge Pages werden auf dieser Plattform nicht unterstützt" msgid "huge pages not supported with the current shared_memory_type setting" msgstr "Huge Pages werden mit der aktuellen shared_memory_type-Einstellung nicht unterstützt" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1358 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1402 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "bereits bestehender Shared-Memory-Block (Schlüssel %lu, ID %lu) wird noch benutzt" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1360 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1404 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Beenden Sie alle alten Serverprozesse, die zum Datenverzeichnis »%s« gehören." @@ -19261,32 +19271,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:2353 +#: postmaster/autovacuum.c:2355 #, 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:2589 +#: postmaster/autovacuum.c:2591 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2592 +#: postmaster/autovacuum.c:2594 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2786 +#: postmaster/autovacuum.c:2788 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3400 +#: postmaster/autovacuum.c:3402 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3401 +#: postmaster/autovacuum.c:3403 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." @@ -19516,32 +19526,32 @@ msgstr "%s: konnte externe PID-Datei »%s« nicht schreiben: %s\n" msgid "could not load %s" msgstr "konnte %s nicht laden" -#: postmaster/postmaster.c:1434 +#: postmaster/postmaster.c:1436 #, c-format msgid "postmaster became multithreaded during startup" msgstr "Postmaster ist während des Starts multithreaded geworden" -#: postmaster/postmaster.c:1435 +#: postmaster/postmaster.c:1437 postmaster/postmaster.c:5062 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Setzen Sie die Umgebungsvariable LC_ALL auf eine gültige Locale." -#: postmaster/postmaster.c:1536 +#: postmaster/postmaster.c:1538 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: konnte Pfad des eigenen Programs nicht finden" -#: postmaster/postmaster.c:1543 +#: postmaster/postmaster.c:1545 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: konnte kein passendes Programm »postgres« finden" -#: postmaster/postmaster.c:1566 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1568 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Dies kann auf eine unvollständige PostgreSQL-Installation hindeuten, oder darauf, dass die Datei »%s« von ihrer richtigen Stelle verschoben worden ist." -#: postmaster/postmaster.c:1593 +#: postmaster/postmaster.c:1595 #, c-format msgid "" "%s: could not find the database system\n" @@ -19553,460 +19563,460 @@ msgstr "" "aber die Datei »%s« konnte nicht geöffnet werden: %s\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1890 +#: postmaster/postmaster.c:1892 #, c-format msgid "issuing %s to recalcitrant children" msgstr "%s wird an ungehorsame Kinder gesendet" -#: postmaster/postmaster.c:1912 +#: postmaster/postmaster.c:1914 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "führe sofortiges Herunterfahren durch, weil Sperrdatei im Datenverzeichnis ungültig ist" -#: postmaster/postmaster.c:1987 postmaster/postmaster.c:2015 +#: postmaster/postmaster.c:1989 postmaster/postmaster.c:2017 #, c-format msgid "incomplete startup packet" msgstr "unvollständiges Startpaket" -#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2032 +#: postmaster/postmaster.c:2001 postmaster/postmaster.c:2034 #, c-format msgid "invalid length of startup packet" msgstr "ungültige Länge des Startpakets" -#: postmaster/postmaster.c:2061 +#: postmaster/postmaster.c:2063 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2079 +#: postmaster/postmaster.c:2081 #, c-format msgid "received unencrypted data after SSL request" msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" -#: postmaster/postmaster.c:2080 postmaster/postmaster.c:2124 +#: postmaster/postmaster.c:2082 postmaster/postmaster.c:2126 #, c-format msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." msgstr "Das könnte entweder ein Fehler in der Client-Software oder ein Hinweis auf einen versuchten Man-in-the-Middle-Angriff sein." -#: postmaster/postmaster.c:2105 +#: postmaster/postmaster.c:2107 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2123 +#: postmaster/postmaster.c:2125 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" -#: postmaster/postmaster.c:2147 +#: postmaster/postmaster.c:2149 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "nicht unterstütztes Frontend-Protokoll %u.%u: Server unterstützt %u.0 bis %u.%u" -#: postmaster/postmaster.c:2214 +#: postmaster/postmaster.c:2216 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." -#: postmaster/postmaster.c:2255 +#: postmaster/postmaster.c:2257 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "ungültiges Layout des Startpakets: Abschluss als letztes Byte erwartet" -#: postmaster/postmaster.c:2272 +#: postmaster/postmaster.c:2274 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" -#: postmaster/postmaster.c:2336 +#: postmaster/postmaster.c:2338 #, c-format msgid "the database system is starting up" msgstr "das Datenbanksystem startet" -#: postmaster/postmaster.c:2342 +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is not yet accepting connections" msgstr "das Datenbanksystem nimmt noch keine Verbindungen an" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2345 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Konsistenter Wiederherstellungszustand wurde noch nicht erreicht." -#: postmaster/postmaster.c:2347 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is not accepting connections" msgstr "das Datenbanksystem nimmt keine Verbindungen an" -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2350 #, c-format msgid "Hot standby mode is disabled." msgstr "Hot-Standby-Modus ist deaktiviert." -#: postmaster/postmaster.c:2353 +#: postmaster/postmaster.c:2355 #, c-format msgid "the database system is shutting down" msgstr "das Datenbanksystem fährt herunter" -#: postmaster/postmaster.c:2358 +#: postmaster/postmaster.c:2360 #, c-format msgid "the database system is in recovery mode" msgstr "das Datenbanksystem ist im Wiederherstellungsmodus" -#: postmaster/postmaster.c:2363 storage/ipc/procarray.c:491 +#: postmaster/postmaster.c:2365 storage/ipc/procarray.c:491 #: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 #, c-format msgid "sorry, too many clients already" msgstr "tut mir leid, schon zu viele Verbindungen" -#: postmaster/postmaster.c:2450 +#: postmaster/postmaster.c:2452 #, c-format msgid "wrong key in cancel request for process %d" msgstr "falscher Schlüssel in Stornierungsanfrage für Prozess %d" -#: postmaster/postmaster.c:2462 +#: postmaster/postmaster.c:2464 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d in Stornierungsanfrage stimmte mit keinem Prozess überein" -#: postmaster/postmaster.c:2729 +#: postmaster/postmaster.c:2730 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP empfangen, Konfigurationsdateien werden neu geladen" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2753 postmaster/postmaster.c:2757 +#: postmaster/postmaster.c:2754 postmaster/postmaster.c:2758 #, c-format msgid "%s was not reloaded" msgstr "%s wurde nicht neu geladen" -#: postmaster/postmaster.c:2767 +#: postmaster/postmaster.c:2768 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-Konfiguration wurde nicht neu geladen" -#: postmaster/postmaster.c:2857 +#: postmaster/postmaster.c:2858 #, c-format msgid "received smart shutdown request" msgstr "intelligentes Herunterfahren verlangt" -#: postmaster/postmaster.c:2898 +#: postmaster/postmaster.c:2899 #, c-format msgid "received fast shutdown request" msgstr "schnelles Herunterfahren verlangt" -#: postmaster/postmaster.c:2916 +#: postmaster/postmaster.c:2917 #, c-format msgid "aborting any active transactions" msgstr "etwaige aktive Transaktionen werden abgebrochen" -#: postmaster/postmaster.c:2940 +#: postmaster/postmaster.c:2941 #, c-format msgid "received immediate shutdown request" msgstr "sofortiges Herunterfahren verlangt" -#: postmaster/postmaster.c:3016 +#: postmaster/postmaster.c:3017 #, c-format msgid "shutdown at recovery target" msgstr "Herunterfahren beim Wiederherstellungsziel" -#: postmaster/postmaster.c:3034 postmaster/postmaster.c:3070 +#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 msgid "startup process" msgstr "Startprozess" -#: postmaster/postmaster.c:3037 +#: postmaster/postmaster.c:3038 #, c-format msgid "aborting startup due to startup process failure" msgstr "Serverstart abgebrochen wegen Startprozessfehler" -#: postmaster/postmaster.c:3110 +#: postmaster/postmaster.c:3111 #, c-format msgid "database system is ready to accept connections" msgstr "Datenbanksystem ist bereit, um Verbindungen anzunehmen" -#: postmaster/postmaster.c:3131 +#: postmaster/postmaster.c:3132 msgid "background writer process" msgstr "Background-Writer-Prozess" -#: postmaster/postmaster.c:3178 +#: postmaster/postmaster.c:3179 msgid "checkpointer process" msgstr "Checkpointer-Prozess" -#: postmaster/postmaster.c:3194 +#: postmaster/postmaster.c:3195 msgid "WAL writer process" msgstr "WAL-Schreibprozess" -#: postmaster/postmaster.c:3209 +#: postmaster/postmaster.c:3210 msgid "WAL receiver process" msgstr "WAL-Receiver-Prozess" -#: postmaster/postmaster.c:3224 +#: postmaster/postmaster.c:3225 msgid "autovacuum launcher process" msgstr "Autovacuum-Launcher-Prozess" -#: postmaster/postmaster.c:3242 +#: postmaster/postmaster.c:3243 msgid "archiver process" msgstr "Archivierprozess" -#: postmaster/postmaster.c:3255 +#: postmaster/postmaster.c:3256 msgid "system logger process" msgstr "Systemlogger-Prozess" -#: postmaster/postmaster.c:3312 +#: postmaster/postmaster.c:3313 #, c-format msgid "background worker \"%s\"" msgstr "Background-Worker »%s«" -#: postmaster/postmaster.c:3391 postmaster/postmaster.c:3411 -#: postmaster/postmaster.c:3418 postmaster/postmaster.c:3436 +#: postmaster/postmaster.c:3392 postmaster/postmaster.c:3412 +#: postmaster/postmaster.c:3419 postmaster/postmaster.c:3437 msgid "server process" msgstr "Serverprozess" -#: postmaster/postmaster.c:3490 +#: postmaster/postmaster.c:3491 #, c-format msgid "terminating any other active server processes" msgstr "aktive Serverprozesse werden abgebrochen" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3665 +#: postmaster/postmaster.c:3666 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) beendete mit Status %d" -#: postmaster/postmaster.c:3667 postmaster/postmaster.c:3679 -#: postmaster/postmaster.c:3689 postmaster/postmaster.c:3700 +#: postmaster/postmaster.c:3668 postmaster/postmaster.c:3680 +#: postmaster/postmaster.c:3690 postmaster/postmaster.c:3701 #, c-format msgid "Failed process was running: %s" msgstr "Der fehlgeschlagene Prozess führte aus: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3676 +#: postmaster/postmaster.c:3677 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) wurde durch Ausnahme 0x%X beendet" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3686 +#: postmaster/postmaster.c:3687 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) wurde von Signal %d beendet: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3698 +#: postmaster/postmaster.c:3699 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) beendete mit unbekanntem Status %d" -#: postmaster/postmaster.c:3906 +#: postmaster/postmaster.c:3907 #, c-format msgid "abnormal database system shutdown" msgstr "abnormales Herunterfahren des Datenbanksystems" -#: postmaster/postmaster.c:3932 +#: postmaster/postmaster.c:3933 #, c-format msgid "shutting down due to startup process failure" msgstr "fahre herunter wegen Startprozessfehler" -#: postmaster/postmaster.c:3938 +#: postmaster/postmaster.c:3939 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "fahre herunter, weil restart_after_crash aus ist" -#: postmaster/postmaster.c:3950 +#: postmaster/postmaster.c:3951 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alle Serverprozesse beendet; initialisiere neu" -#: postmaster/postmaster.c:4144 postmaster/postmaster.c:5462 -#: postmaster/postmaster.c:5860 +#: postmaster/postmaster.c:4145 postmaster/postmaster.c:5464 +#: postmaster/postmaster.c:5862 #, c-format msgid "could not generate random cancel key" msgstr "konnte zufälligen Stornierungsschlüssel nicht erzeugen" -#: postmaster/postmaster.c:4206 +#: postmaster/postmaster.c:4207 #, c-format msgid "could not fork new process for connection: %m" msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:4248 +#: postmaster/postmaster.c:4249 msgid "could not fork new process for connection: " msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): " -#: postmaster/postmaster.c:4354 +#: postmaster/postmaster.c:4355 #, c-format msgid "connection received: host=%s port=%s" msgstr "Verbindung empfangen: Host=%s Port=%s" -#: postmaster/postmaster.c:4359 +#: postmaster/postmaster.c:4360 #, c-format msgid "connection received: host=%s" msgstr "Verbindung empfangen: Host=%s" -#: postmaster/postmaster.c:4596 +#: postmaster/postmaster.c:4597 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "konnte Serverprozess »%s« nicht ausführen: %m" -#: postmaster/postmaster.c:4654 +#: postmaster/postmaster.c:4655 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "konnte Backend-Parameter-Datei-Mapping nicht erzeugen: Fehlercode %lu" -#: postmaster/postmaster.c:4663 +#: postmaster/postmaster.c:4664 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "konnte Backend-Parameter-Speicher nicht mappen: Fehlercode %lu" -#: postmaster/postmaster.c:4690 +#: postmaster/postmaster.c:4691 #, c-format msgid "subprocess command line too long" msgstr "Kommandozeile für Subprozess zu lang" -#: postmaster/postmaster.c:4708 +#: postmaster/postmaster.c:4709 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "Aufruf von CreateProcess() fehlgeschlagen: %m (Fehlercode %lu)" -#: postmaster/postmaster.c:4735 +#: postmaster/postmaster.c:4736 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "konnte Sicht der Backend-Parameter-Datei nicht unmappen: Fehlercode %lu" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4740 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "konnte Handle für Backend-Parameter-Datei nicht schließen: Fehlercode %lu" -#: postmaster/postmaster.c:4761 +#: postmaster/postmaster.c:4762 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "Aufgabe nach zu vielen Versuchen, Shared Memory zu reservieren" -#: postmaster/postmaster.c:4762 +#: postmaster/postmaster.c:4763 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Dies kann durch ASLR oder Antivirus-Software verursacht werden." -#: postmaster/postmaster.c:4935 +#: postmaster/postmaster.c:4936 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL-Konfiguration konnte im Kindprozess nicht geladen werden" -#: postmaster/postmaster.c:5060 +#: postmaster/postmaster.c:5061 #, c-format -msgid "Please report this to <%s>." -msgstr "Bitte berichten Sie dies an <%s>." +msgid "postmaster became multithreaded" +msgstr "Postmaster ist multithreaded geworden" -#: postmaster/postmaster.c:5128 +#: postmaster/postmaster.c:5130 #, c-format msgid "database system is ready to accept read-only connections" msgstr "Datenbanksystem ist bereit, um lesende Verbindungen anzunehmen" -#: postmaster/postmaster.c:5386 +#: postmaster/postmaster.c:5388 #, c-format msgid "could not fork startup process: %m" msgstr "konnte Startprozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5390 +#: postmaster/postmaster.c:5392 #, c-format msgid "could not fork archiver process: %m" msgstr "konnte Archivierer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5394 +#: postmaster/postmaster.c:5396 #, c-format msgid "could not fork background writer process: %m" msgstr "konnte Background-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5398 +#: postmaster/postmaster.c:5400 #, c-format msgid "could not fork checkpointer process: %m" msgstr "konnte Checkpointer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5402 +#: postmaster/postmaster.c:5404 #, c-format msgid "could not fork WAL writer process: %m" msgstr "konnte WAL-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5406 +#: postmaster/postmaster.c:5408 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "konnte WAL-Receiver-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5410 +#: postmaster/postmaster.c:5412 #, c-format msgid "could not fork process: %m" msgstr "konnte Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5611 postmaster/postmaster.c:5638 +#: postmaster/postmaster.c:5613 postmaster/postmaster.c:5640 #, c-format msgid "database connection requirement not indicated during registration" msgstr "die Notwendigkeit, Datenbankverbindungen zu erzeugen, wurde bei der Registrierung nicht angezeigt" -#: postmaster/postmaster.c:5622 postmaster/postmaster.c:5649 +#: postmaster/postmaster.c:5624 postmaster/postmaster.c:5651 #, c-format msgid "invalid processing mode in background worker" msgstr "ungültiger Verarbeitungsmodus in Background-Worker" -#: postmaster/postmaster.c:5734 +#: postmaster/postmaster.c:5736 #, c-format msgid "could not fork worker process: %m" msgstr "konnte Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5846 +#: postmaster/postmaster.c:5848 #, c-format msgid "no slot available for new worker process" msgstr "kein Slot für neuen Worker-Prozess verfügbar" -#: postmaster/postmaster.c:6177 +#: postmaster/postmaster.c:6179 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "konnte Socket %d nicht für Verwendung in Backend duplizieren: Fehlercode %d" -#: postmaster/postmaster.c:6209 +#: postmaster/postmaster.c:6211 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "konnte geerbtes Socket nicht erzeugen: Fehlercode %d\n" -#: postmaster/postmaster.c:6238 +#: postmaster/postmaster.c:6240 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "konnte Servervariablendatei »%s« nicht öffnen: %s\n" -#: postmaster/postmaster.c:6245 +#: postmaster/postmaster.c:6247 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "konnte nicht aus Servervariablendatei »%s« lesen: %s\n" -#: postmaster/postmaster.c:6254 +#: postmaster/postmaster.c:6256 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht löschen: %s\n" -#: postmaster/postmaster.c:6271 +#: postmaster/postmaster.c:6273 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "konnte Sicht der Backend-Variablen nicht mappen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6280 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "konnte Sicht der Backend-Variablen nicht unmappen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6287 +#: postmaster/postmaster.c:6289 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" -#: postmaster/postmaster.c:6446 +#: postmaster/postmaster.c:6448 #, c-format msgid "could not read exit code for process\n" msgstr "konnte Exitcode des Prozesses nicht lesen\n" -#: postmaster/postmaster.c:6488 +#: postmaster/postmaster.c:6490 #, c-format msgid "could not post child completion status\n" msgstr "konnte Child-Completion-Status nicht versenden\n" @@ -20808,57 +20818,57 @@ msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachric 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" -#: replication/pgoutput/pgoutput.c:317 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "invalid proto_version" msgstr "ungültige proto_version" -#: replication/pgoutput/pgoutput.c:322 +#: replication/pgoutput/pgoutput.c:329 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version »%s« ist außerhalb des gültigen Bereichs" -#: replication/pgoutput/pgoutput.c:339 +#: replication/pgoutput/pgoutput.c:346 #, c-format msgid "invalid publication_names syntax" msgstr "ungültige Syntax für publication_names" -#: replication/pgoutput/pgoutput.c:440 +#: replication/pgoutput/pgoutput.c:466 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or lower" msgstr "Client sendete proto_version=%d, aber Server unterstützt nur Protokoll %d oder niedriger" -#: replication/pgoutput/pgoutput.c:446 +#: replication/pgoutput/pgoutput.c:472 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or higher" msgstr "Client sendete proto_version=%d, aber Server unterstützt nur Protokoll %d oder höher" -#: replication/pgoutput/pgoutput.c:452 +#: replication/pgoutput/pgoutput.c:478 #, c-format msgid "publication_names parameter missing" msgstr "Parameter »publication_names« fehlt" -#: replication/pgoutput/pgoutput.c:466 +#: replication/pgoutput/pgoutput.c:492 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:498 #, c-format msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt paralleles Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:503 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "Streaming angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" -#: replication/pgoutput/pgoutput.c:494 +#: replication/pgoutput/pgoutput.c:520 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt Zwei-Phasen-Commit nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:499 +#: replication/pgoutput/pgoutput.c:525 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "Zwei-Phasen-Commit angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" @@ -21175,7 +21185,7 @@ msgstr "konnte nicht in WAL-Segment %s bei Position %u, Länge %lu schreiben: %m msgid "cannot use %s with a logical replication slot" msgstr "%s kann nicht mit einem logischem Replikations-Slot verwendet werden" -#: replication/walsender.c:623 storage/smgr/md.c:1529 +#: replication/walsender.c:623 storage/smgr/md.c:1541 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "konnte Positionszeiger nicht ans Ende der Datei »%s« setzen: %m" @@ -21469,218 +21479,218 @@ msgstr "Regel »%s« für Relation »%s« existiert nicht" msgid "renaming an ON SELECT rule is not allowed" msgstr "Umbenennen einer ON-SELECT-Regel ist nicht erlaubt" -#: rewrite/rewriteHandler.c:584 +#: rewrite/rewriteHandler.c:590 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH-Anfragename »%s« erscheint sowohl in der Regelaktion als auch in der umzuschreibenden Anfrage" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:617 #, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "INSERT ... SELECT-Regelaktionen werden für Anfrangen mit datenmodifizierenden Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:664 +#: rewrite/rewriteHandler.c:670 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING-Listen können nicht in mehreren Regeln auftreten" -#: rewrite/rewriteHandler.c:896 rewrite/rewriteHandler.c:935 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:941 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "kann keinen Wert außer DEFAULT in Spalte »%s« einfügen" -#: rewrite/rewriteHandler.c:898 rewrite/rewriteHandler.c:964 +#: rewrite/rewriteHandler.c:904 rewrite/rewriteHandler.c:970 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Spalte »%s« ist eine Identitätsspalte, die als GENERATED ALWAYS definiert ist." -#: rewrite/rewriteHandler.c:900 +#: rewrite/rewriteHandler.c:906 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Verwenden Sie OVERRIDING SYSTEM VALUE, um diese Einschränkung außer Kraft zu setzen." -#: rewrite/rewriteHandler.c:962 rewrite/rewriteHandler.c:970 +#: rewrite/rewriteHandler.c:968 rewrite/rewriteHandler.c:976 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "Spalte »%s« kann nur auf DEFAULT aktualisiert werden" -#: rewrite/rewriteHandler.c:1117 rewrite/rewriteHandler.c:1135 +#: rewrite/rewriteHandler.c:1111 rewrite/rewriteHandler.c:1129 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "mehrere Zuweisungen zur selben Spalte »%s«" -#: rewrite/rewriteHandler.c:1749 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:1733 rewrite/rewriteHandler.c:3158 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "Zugriff auf Nicht-System-Sicht »%s« ist beschränkt" -#: rewrite/rewriteHandler.c:2128 rewrite/rewriteHandler.c:4064 +#: rewrite/rewriteHandler.c:2131 rewrite/rewriteHandler.c:4097 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Regeln für Relation »%s«" -#: rewrite/rewriteHandler.c:2213 +#: rewrite/rewriteHandler.c:2236 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Policys für Relation »%s«" -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2566 msgid "Junk view columns are not updatable." msgstr "Junk-Sichtspalten sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2538 +#: rewrite/rewriteHandler.c:2571 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Sichtspalten, die nicht Spalten ihrer Basisrelation sind, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2541 +#: rewrite/rewriteHandler.c:2574 msgid "View columns that refer to system columns are not updatable." msgstr "Sichtspalten, die auf Systemspalten verweisen, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2577 msgid "View columns that return whole-row references are not updatable." msgstr "Sichtspalten, die Verweise auf ganze Zeilen zurückgeben, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2638 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Sichten, die DISTINCT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2641 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Sichten, die GROUP BY enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2644 msgid "Views containing HAVING are not automatically updatable." msgstr "Sichten, die HAVING enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2614 +#: rewrite/rewriteHandler.c:2647 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Sichten, die UNION, INTERSECT oder EXCEPT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2617 +#: rewrite/rewriteHandler.c:2650 msgid "Views containing WITH are not automatically updatable." msgstr "Sichten, die WITH enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2620 +#: rewrite/rewriteHandler.c:2653 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Sichten, die LIMIT oder OFFSET enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2665 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Sichten, die Aggregatfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2635 +#: rewrite/rewriteHandler.c:2668 msgid "Views that return window functions are not automatically updatable." msgstr "Sichten, die Fensterfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2638 +#: rewrite/rewriteHandler.c:2671 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Sichten, die Funktionen mit Ergebnismenge zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2645 rewrite/rewriteHandler.c:2649 -#: rewrite/rewriteHandler.c:2657 +#: rewrite/rewriteHandler.c:2678 rewrite/rewriteHandler.c:2682 +#: rewrite/rewriteHandler.c:2690 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Sichten, die nicht aus einer einzigen Tabelle oder Sicht lesen, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2660 +#: rewrite/rewriteHandler.c:2693 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Sichten, die TABLESAMPLE enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2684 +#: rewrite/rewriteHandler.c:2717 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Sichten, die keine aktualisierbaren Spalten haben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:3185 +#: rewrite/rewriteHandler.c:3218 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "kann nicht in Spalte »%s« von Sicht »%s« einfügen" -#: rewrite/rewriteHandler.c:3193 +#: rewrite/rewriteHandler.c:3226 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kann Spalte »%s« von Sicht »%s« nicht aktualisieren" -#: rewrite/rewriteHandler.c:3691 +#: rewrite/rewriteHandler.c:3724 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-NOTIFY-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3702 +#: rewrite/rewriteHandler.c:3735 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-NOTHING-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3716 +#: rewrite/rewriteHandler.c:3749 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit Bedingung werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3720 +#: rewrite/rewriteHandler.c:3753 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "DO-ALSO-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3725 +#: rewrite/rewriteHandler.c:3758 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit mehreren Anweisungen werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3992 rewrite/rewriteHandler.c:4000 -#: rewrite/rewriteHandler.c:4008 +#: rewrite/rewriteHandler.c:4025 rewrite/rewriteHandler.c:4033 +#: rewrite/rewriteHandler.c:4041 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Sichten mit DO-INSTEAD-Regeln mit Bedingung sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:4113 +#: rewrite/rewriteHandler.c:4146 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "INSERT RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4115 +#: rewrite/rewriteHandler.c:4148 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON INSERT DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4120 +#: rewrite/rewriteHandler.c:4153 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "UPDATE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4122 +#: rewrite/rewriteHandler.c:4155 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON UPDATE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4127 +#: rewrite/rewriteHandler.c:4160 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "DELETE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4129 +#: rewrite/rewriteHandler.c:4162 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON DELETE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4147 +#: rewrite/rewriteHandler.c:4180 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT mit ON-CONFLICT-Klausel kann nicht mit Tabelle verwendet werden, die INSERT- oder UPDATE-Regeln hat" -#: rewrite/rewriteHandler.c:4204 +#: rewrite/rewriteHandler.c:4237 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH kann nicht in einer Anfrage verwendet werden, die durch Regeln in mehrere Anfragen umgeschrieben wird" -#: rewrite/rewriteManip.c:1075 +#: rewrite/rewriteManip.c:1076 #, c-format msgid "conditional utility statements are not implemented" msgstr "Utility-Anweisungen mit Bedingung sind nicht implementiert" -#: rewrite/rewriteManip.c:1422 +#: rewrite/rewriteManip.c:1423 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF mit einer Sicht ist nicht implementiert" -#: rewrite/rewriteManip.c:1757 +#: rewrite/rewriteManip.c:1759 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "NEW-Variablen in ON UPDATE-Regeln können nicht auf Spalten verweisen, die Teil einer Mehrfachzuweisung in dem UPDATE-Befehl sind" @@ -21926,7 +21936,7 @@ msgstr "konnte Größe von temporärer Datei »%s« von BufFile »%s« nicht bes msgid "could not delete fileset \"%s\": %m" msgstr "konnte Fileset »%s« nicht löschen: %m" -#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1041 +#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1043 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "kann Datei »%s« nicht kürzen: %m" @@ -22646,22 +22656,22 @@ msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m" msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "konnte Block %u in Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes geschrieben" -#: storage/smgr/md.c:1012 +#: storage/smgr/md.c:1014 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: es sind jetzt nur %u Blöcke" -#: storage/smgr/md.c:1067 +#: storage/smgr/md.c:1069 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: %m" -#: storage/smgr/md.c:1494 +#: storage/smgr/md.c:1506 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): vorhergehendes Segment hat nur %u Blöcke" -#: storage/smgr/md.c:1508 +#: storage/smgr/md.c:1520 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): %m" @@ -23030,12 +23040,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:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "Cursor kann nur vorwärts scannen" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, 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." @@ -23340,27 +23350,27 @@ msgstr "ungültige Statistikart: »%s«" msgid "could not open temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1450 +#: utils/activity/pgstat.c:1458 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" -#: utils/activity/pgstat.c:1459 +#: utils/activity/pgstat.c:1467 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" -#: utils/activity/pgstat.c:1467 +#: utils/activity/pgstat.c:1475 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" -#: utils/activity/pgstat.c:1516 +#: utils/activity/pgstat.c:1524 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1678 +#: utils/activity/pgstat.c:1686 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "verfälschte Statistikdatei »%s«" @@ -25785,7 +25795,7 @@ msgstr "Wenn Sie regexp_replace() mit einem Startparameter verwenden wollten, wa #: 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:6633 utils/misc/guc.c:6667 +#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ungültiger Wert für Parameter »%s«: %d" @@ -25823,8 +25833,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:10097 -#: utils/adt/ruleutils.c:10310 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10103 +#: utils/adt/ruleutils.c:10316 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -26977,183 +26987,178 @@ msgstr "Spaltenalias fehlt" msgid "could not determine row description for function returning record" msgstr "konnte Zeilenbeschreibung für Funktion, die »record« zurückgibt, nicht ermitteln" -#: utils/init/miscinit.c:346 +#: utils/init/miscinit.c:347 #, c-format msgid "data directory \"%s\" does not exist" msgstr "Datenverzeichnis »%s« existiert nicht" -#: utils/init/miscinit.c:351 +#: utils/init/miscinit.c:352 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: utils/init/miscinit.c:359 +#: utils/init/miscinit.c:360 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "angegebenes Datenverzeichnis »%s« ist kein Verzeichnis" -#: utils/init/miscinit.c:375 +#: utils/init/miscinit.c:376 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "Datenverzeichnis »%s« hat falschen Eigentümer" -#: utils/init/miscinit.c:377 +#: utils/init/miscinit.c:378 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Der Server muss von dem Benutzer gestartet werden, dem das Datenverzeichnis gehört." -#: utils/init/miscinit.c:395 +#: utils/init/miscinit.c:396 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "Datenverzeichnis »%s« hat ungültige Zugriffsrechte" -#: utils/init/miscinit.c:397 +#: utils/init/miscinit.c:398 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Rechte sollten u=rwx (0700) oder u=rwx,g=rx (0750) sein." -#: utils/init/miscinit.c:455 +#: utils/init/miscinit.c:456 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: utils/init/miscinit.c:692 utils/misc/guc.c:3563 +#: utils/init/miscinit.c:726 utils/misc/guc.c:3563 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "kann Parameter »%s« nicht in einer sicherheitsbeschränkten Operation setzen" -#: utils/init/miscinit.c:764 +#: utils/init/miscinit.c:809 #, c-format msgid "role with OID %u does not exist" msgstr "Rolle mit OID %u existiert nicht" -#: utils/init/miscinit.c:794 +#: utils/init/miscinit.c:854 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "Rolle »%s« hat keine Berechtigung zum Einloggen" -#: utils/init/miscinit.c:812 +#: utils/init/miscinit.c:875 #, c-format msgid "too many connections for role \"%s\"" msgstr "zu viele Verbindungen von Rolle »%s«" -#: utils/init/miscinit.c:919 -#, c-format -msgid "permission denied to set session authorization" -msgstr "keine Berechtigung, um Sitzungsautorisierung zu setzen" - -#: utils/init/miscinit.c:1002 +#: utils/init/miscinit.c:1046 #, c-format msgid "invalid role OID: %u" msgstr "ungültige Rollen-OID: %u" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1193 #, c-format msgid "database system is shut down" msgstr "Datenbanksystem ist heruntergefahren" -#: utils/init/miscinit.c:1236 +#: utils/init/miscinit.c:1280 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht erstellen: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1294 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht öffnen: %m" -#: utils/init/miscinit.c:1257 +#: utils/init/miscinit.c:1301 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht lesen: %m" -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1310 #, c-format msgid "lock file \"%s\" is empty" msgstr "Sperrdatei »%s« ist leer" -#: utils/init/miscinit.c:1267 +#: utils/init/miscinit.c:1311 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Entweder startet gerade ein anderer Server oder die Sperrdatei ist von einen Absturz übrig geblieben." -#: utils/init/miscinit.c:1311 +#: utils/init/miscinit.c:1355 #, c-format msgid "lock file \"%s\" already exists" msgstr "Sperrdatei »%s« existiert bereits" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1359 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postgres-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1317 +#: utils/init/miscinit.c:1361 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postmaster-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1320 +#: utils/init/miscinit.c:1364 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postgres-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1322 +#: utils/init/miscinit.c:1366 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postmaster-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1373 +#: utils/init/miscinit.c:1417 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "konnte alte Sperrdatei »%s« nicht löschen: %m" -#: utils/init/miscinit.c:1375 +#: utils/init/miscinit.c:1419 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Die Datei ist anscheinend aus Versehen übrig geblieben, konnte aber nicht gelöscht werden. Bitte entfernen Sie die Datei von Hand und versuchen Sie es erneut." -#: utils/init/miscinit.c:1412 utils/init/miscinit.c:1426 -#: utils/init/miscinit.c:1437 +#: utils/init/miscinit.c:1456 utils/init/miscinit.c:1470 +#: utils/init/miscinit.c:1481 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht schreiben: %m" -#: utils/init/miscinit.c:1548 utils/init/miscinit.c:1690 utils/misc/guc.c:5603 +#: utils/init/miscinit.c:1592 utils/init/miscinit.c:1734 utils/misc/guc.c:5644 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" -#: utils/init/miscinit.c:1678 +#: utils/init/miscinit.c:1722 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "konnte Datei »%s« nicht öffnen: %m; setze trotzdem fort" -#: utils/init/miscinit.c:1703 +#: utils/init/miscinit.c:1747 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "Sperrdatei »%s« enthält falsche PID: %ld statt %ld" -#: utils/init/miscinit.c:1742 utils/init/miscinit.c:1758 +#: utils/init/miscinit.c:1786 utils/init/miscinit.c:1802 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "»%s« ist kein gültiges Datenverzeichnis" -#: utils/init/miscinit.c:1744 +#: utils/init/miscinit.c:1788 #, c-format msgid "File \"%s\" is missing." msgstr "Die Datei »%s« fehlt." -#: utils/init/miscinit.c:1760 +#: utils/init/miscinit.c:1804 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Die Datei »%s« enthält keine gültigen Daten." -#: utils/init/miscinit.c:1762 +#: utils/init/miscinit.c:1806 #, c-format msgid "You might need to initdb." msgstr "Sie müssen möglicherweise initdb ausführen." -#: utils/init/miscinit.c:1770 +#: utils/init/miscinit.c:1814 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Das Datenverzeichnis wurde von PostgreSQL Version %s initialisiert, welche nicht mit dieser Version %s kompatibel ist." @@ -27230,97 +27235,97 @@ msgstr "keine Berechtigung für Datenbank »%s«" msgid "User does not have CONNECT privilege." msgstr "Benutzer hat das CONNECT-Privileg nicht." -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "zu viele Verbindungen für Datenbank »%s«" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "Datenbank-Locale ist inkompatibel mit Betriebssystem" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_COLLATE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Erzeugen Sie die Datenbank neu mit einer anderen Locale oder installieren Sie die fehlende Locale." -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_CTYPE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:478 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "Version von Sortierfolge für Datenbank »%s« stimmt nicht überein" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:480 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "Die Datenbank wurde mit Sortierfolgenversion %s erzeugt, aber das Betriebssystem hat Version %s." -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:483 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle Objekte in dieser Datenbank, die die Standardsortierfolge verwenden, neu und führen Sie ALTER DATABASE %s REFRESH COLLATION VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:894 #, c-format msgid "no roles are defined in this database system" msgstr "in diesem Datenbanksystem sind keine Rollen definiert" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:895 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Sie sollten sofort CREATE USER \"%s\" SUPERUSER; ausführen." -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:931 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "nur Superuser können im Binary-Upgrade-Modus verbinden" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:951 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "die verbleibenden Verbindungen sind für Rollen mit dem %s-Attribut reserviert" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:957 #, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "die verbleibenden Verbindungen sind für Rollen mit den Privilegien der Rolle »%s« reserviert" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:969 #, c-format msgid "permission denied to start WAL sender" msgstr "keine Berechtigung, um WAL-Sender zu starten" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:970 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "Nur Rollen mit dem %s-Attribut können einen WAL-Sender-Prozess starten." -#: utils/init/postinit.c:1086 +#: utils/init/postinit.c:1088 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Sie wurde anscheinend gerade gelöscht oder umbenannt." -#: utils/init/postinit.c:1090 +#: utils/init/postinit.c:1092 #, c-format msgid "database %u does not exist" msgstr "Datenbank %u existiert nicht" -#: utils/init/postinit.c:1099 +#: utils/init/postinit.c:1101 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "mit ungültiger Datenbank »%s« kann nicht verbunden werden" -#: utils/init/postinit.c:1159 +#: utils/init/postinit.c:1161 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Das Datenbankunterverzeichnis »%s« fehlt." @@ -27417,8 +27422,8 @@ msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "unbekannter Konfigurationsparameter »%s« in Datei »%s« Zeile %d" #: utils/misc/guc.c:461 utils/misc/guc.c:3417 utils/misc/guc.c:3661 -#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3981 -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3984 +#: utils/misc/guc.c:4125 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "Parameter »%s« kann nicht geändert werden, ohne den Server neu zu starten" @@ -27542,7 +27547,7 @@ msgstr "%g%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%g . msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "Parameter »%s« kann nicht während einer parallelen Operation gesetzt werden" -#: utils/misc/guc.c:3394 utils/misc/guc.c:4545 +#: utils/misc/guc.c:3394 utils/misc/guc.c:4586 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "Parameter »%s« kann nicht geändert werden" @@ -27552,8 +27557,8 @@ msgstr "Parameter »%s« kann nicht geändert werden" 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:4521 -#: utils/misc/guc.c:6569 +#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 +#: utils/misc/guc.c:6604 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" @@ -27578,62 +27583,62 @@ msgstr "Parameter »%s« kann nicht zurückgesetzt werden" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "Parameter »%s« kann nicht lokal in Funktionen gesetzt werden" -#: utils/misc/guc.c:4227 utils/misc/guc.c:4274 utils/misc/guc.c:5288 +#: utils/misc/guc.c:4268 utils/misc/guc.c:4315 utils/misc/guc.c:5329 #, c-format msgid "permission denied to examine \"%s\"" msgstr "keine Berechtigung, um »%s« zu inspizieren" -#: utils/misc/guc.c:4228 utils/misc/guc.c:4275 utils/misc/guc.c:5289 +#: utils/misc/guc.c:4269 utils/misc/guc.c:4316 utils/misc/guc.c:5330 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können diesen Parameter inspizieren." -#: utils/misc/guc.c:4511 +#: utils/misc/guc.c:4552 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "keine Berechtigung um ALTER SYSTEM RESET ALL auszuführen" -#: utils/misc/guc.c:4577 +#: utils/misc/guc.c:4618 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "Parameterwert für ALTER SYSTEM darf keine Newline enthalten" -#: utils/misc/guc.c:4623 +#: utils/misc/guc.c:4664 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "konnte Inhalt der Datei »%s« nicht parsen" -#: utils/misc/guc.c:4805 +#: utils/misc/guc.c:4846 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "Versuch, den Parameter »%s« zu redefinieren" -#: utils/misc/guc.c:5144 +#: utils/misc/guc.c:5185 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "ungültiger Konfigurationsparametername »%s«, wird entfernt" -#: utils/misc/guc.c:5146 +#: utils/misc/guc.c:5187 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "»%s« ist jetzt ein reservierter Präfix." -#: utils/misc/guc.c:6023 +#: utils/misc/guc.c:6058 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "beim Setzen von Parameter »%s« auf »%s«" -#: utils/misc/guc.c:6192 +#: utils/misc/guc.c:6227 #, c-format msgid "parameter \"%s\" could not be set" msgstr "Parameter »%s« kann nicht gesetzt werden" -#: utils/misc/guc.c:6282 +#: utils/misc/guc.c:6317 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:6701 +#: utils/misc/guc.c:6736 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" @@ -28211,8 +28216,8 @@ msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS wird nicht mehr unterstützt; kann nur auf falsch gesetzt werden." #: utils/misc/guc_tables.c:1633 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "Startet einen Subprozess, um die Stderr-Ausgabe und/oder CSV-Logs in Logdateien auszugeben." +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "Startet einen Subprozess, um stderr, csvlog und/oder jsonlog in Logdateien auszugeben." #: utils/misc/guc_tables.c:1642 msgid "Truncate existing log files of same name during log rotation." diff --git a/src/backend/po/es.po b/src/backend/po/es.po index b82abdc5d43..cad42854bae 100644 --- a/src/backend/po/es.po +++ b/src/backend/po/es.po @@ -63,7 +63,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL server 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-09 05:59+0000\n" +"POT-Creation-Date: 2024-12-02 21:59+0000\n" "PO-Revision-Date: 2024-11-09 09:32+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" @@ -222,8 +222,8 @@ msgstr "" #: 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:1537 utils/init/miscinit.c:1671 -#: utils/init/miscinit.c:1748 utils/misc/guc.c:4615 utils/misc/guc.c:4665 +#: utils/init/miscinit.c:1584 utils/init/miscinit.c:1718 +#: utils/init/miscinit.c:1795 utils/misc/guc.c:4656 utils/misc/guc.c:4706 #, c-format msgid "could not open file \"%s\": %m" msgstr "no se pudo abrir el archivo «%s»: %m" @@ -250,7 +250,7 @@ msgstr "no se pudo escribir el archivo «%s»: %m" #: 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:1135 storage/smgr/md.c:1180 -#: storage/sync/sync.c:451 utils/misc/guc.c:4385 +#: storage/sync/sync.c:451 utils/misc/guc.c:4426 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" @@ -279,7 +279,7 @@ msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" #: 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:4363 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 +#: 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 @@ -498,8 +498,8 @@ msgstr "consejo: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 #: postmaster/postmaster.c:2211 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4562 utils/misc/guc.c:6744 -#: utils/misc/guc.c:6785 +#: utils/misc/guc.c:3226 utils/misc/guc.c:4603 utils/misc/guc.c:6779 +#: utils/misc/guc.c:6820 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valor no válido para el parámetro «%s»: «%s»" @@ -935,7 +935,7 @@ msgstr "RESET no debe incluir valores de parámetros" msgid "unrecognized parameter namespace \"%s\"" msgstr "espacio de nombre de parámetro «%s» no reconocido" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1302 commands/variable.c:1210 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "las tablas declaradas WITH OIDS no están soportadas" @@ -1057,7 +1057,7 @@ msgstr "los índices GIN antiguos no soportan recorridos del índice completo ni msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Para corregir esto, ejecute REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 +#: access/gin/ginutil.c:146 executor/execExpr.c:2177 #: utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 #: utils/adt/rowtypes.c:984 #, c-format @@ -1145,7 +1145,7 @@ msgstr "no se pudo determinar qué ordenamiento usar para el hashing de cadenas" #: 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:2015 commands/tablecmds.c:17711 commands/view.c:86 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17711 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 @@ -1278,9 +1278,9 @@ msgstr "no se pudo truncar el archivo «%s» a %u: %m" #: replication/logical/origin.c:615 replication/logical/origin.c:657 #: replication/logical/origin.c:676 replication/logical/snapbuild.c:1776 #: replication/slot.c:1839 storage/file/buffile.c:545 -#: storage/file/copydir.c:197 utils/init/miscinit.c:1612 -#: utils/init/miscinit.c:1623 utils/init/miscinit.c:1631 utils/misc/guc.c:4346 -#: utils/misc/guc.c:4377 utils/misc/guc.c:5513 utils/misc/guc.c:5531 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1659 +#: utils/init/miscinit.c:1670 utils/init/miscinit.c:1678 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" @@ -1522,7 +1522,7 @@ msgid "cannot access index \"%s\" while it is being reindexed" msgstr "no se puede acceder el índice «%s» mientras está siendo reindexado" #: access/index/indexam.c:208 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2843 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 #: commands/tablecmds.c:17406 commands/tablecmds.c:19249 #, c-format msgid "\"%s\" is not an index" @@ -1777,36 +1777,36 @@ msgstr "no se puede truncar hasta el MultiXact %u porque no existe en disco, omi msgid "invalid MultiXactId: %u" msgstr "el MultiXactId no es válido: %u" -#: access/transam/parallel.c:742 access/transam/parallel.c:861 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "el ayudante paralelo no pudo iniciar" -#: access/transam/parallel.c:743 access/transam/parallel.c:862 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Puede haber más detalles disponibles en el log del servidor." -#: access/transam/parallel.c:923 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster terminó durante una transacción paralela" -#: access/transam/parallel.c:1110 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "se ha perdido la conexión al ayudante paralelo" -#: access/transam/parallel.c:1176 access/transam/parallel.c:1178 +#: access/transam/parallel.c:1182 access/transam/parallel.c:1184 msgid "parallel worker" msgstr "ayudante paralelo" -#: access/transam/parallel.c:1332 replication/logical/applyparallelworker.c:893 +#: access/transam/parallel.c:1338 replication/logical/applyparallelworker.c:893 #, c-format msgid "could not map dynamic shared memory segment" msgstr "no se pudo mapear el segmento de memoria compartida dinámica" -#: access/transam/parallel.c:1337 replication/logical/applyparallelworker.c:899 +#: access/transam/parallel.c:1343 replication/logical/applyparallelworker.c:899 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "número mágico no válido en segmento de memoria compartida dinámica" @@ -2338,7 +2338,7 @@ msgstr "no se pudo generar un token de autorización secreto" #: 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 -#: utils/init/miscinit.c:1769 +#: utils/init/miscinit.c:1816 #, c-format msgid "database files are incompatible with server" msgstr "los archivos de base de datos son incompatibles con el servidor" @@ -3722,7 +3722,7 @@ msgstr "no se pudo crear el directorio «%s»: %m" msgid "directory \"%s\" exists but is not empty" msgstr "el directorio «%s» existe pero no está vacío" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1181 #, c-format msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" @@ -4493,9 +4493,9 @@ msgstr "no se puede eliminar %s porque otros objetos dependen de él" #: 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:6638 -#: utils/misc/guc.c:6672 utils/misc/guc.c:6706 utils/misc/guc.c:6749 -#: utils/misc/guc.c:6791 +#: 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" msgstr "%s" @@ -4683,14 +4683,14 @@ msgstr "Esto causaría que la columna generada dependa de su propio valor." msgid "generation expression is not immutable" msgstr "la expresión de generación no es inmutable" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1298 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1304 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "la columna «%s» es de tipo %s pero la expresión default es de tipo %s" #: catalog/heap.c:2814 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:1303 +#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1309 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Necesitará reescribir la expresión o aplicarle una conversión de tipo." @@ -4796,12 +4796,12 @@ msgstr "DROP INDEX CONCURRENTLY debe ser la primera acción en una transacción" msgid "cannot reindex temporary tables of other sessions" msgstr "no se puede hacer reindex de tablas temporales de otras sesiones" -#: catalog/index.c:3685 commands/indexcmds.c:3607 +#: catalog/index.c:3685 commands/indexcmds.c:3614 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "no es posible reindexar un índice no válido en tabla TOAST" -#: catalog/index.c:3701 commands/indexcmds.c:3487 commands/indexcmds.c:3631 +#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -6120,7 +6120,7 @@ msgstr "Falla al crear un tipo de multirango para el tipo «%s»." msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Puede especificar manualmente un nombre para el tipo de multirango usando el atributo «multirange_type_name»." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:518 storage/buffer/bufmgr.c:1145 #, c-format msgid "invalid page in block %u of relation %s" msgstr "la página no es válida en el bloque %u de la relación %s" @@ -6314,7 +6314,7 @@ msgstr "Debe ser superusuario para crear un método de acceso." msgid "access method \"%s\" already exists" msgstr "el método de acceso «%s» ya existe" -#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 +#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:846 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6629,8 +6629,8 @@ msgstr "no se encontraron locales de sistema utilizables" #: commands/dbcommands.c:1944 commands/dbcommands.c:2142 #: commands/dbcommands.c:2382 commands/dbcommands.c:2475 #: commands/dbcommands.c:2588 commands/dbcommands.c:3091 -#: utils/init/postinit.c:1021 utils/init/postinit.c:1085 -#: utils/init/postinit.c:1157 +#: utils/init/postinit.c:1038 utils/init/postinit.c:1102 +#: utils/init/postinit.c:1174 #, c-format msgid "database \"%s\" does not exist" msgstr "no existe la base de datos «%s»" @@ -6901,7 +6901,7 @@ msgstr "la columna «%s» es una columna generada" msgid "Generated columns cannot be used in COPY." msgstr "Las columnas generadas no pueden usarse en COPY." -#: commands/copy.c:842 commands/indexcmds.c:1886 commands/statscmds.c:242 +#: commands/copy.c:842 commands/indexcmds.c:1893 commands/statscmds.c:242 #: commands/tablecmds.c:2419 commands/tablecmds.c:3141 #: commands/tablecmds.c:3655 parser/parse_relation.c:3698 #: parser/parse_relation.c:3708 parser/parse_relation.c:3726 @@ -7247,7 +7247,6 @@ msgstr "las reglas DO INSTEAD condicionales no están soportadas para COPY" #: commands/copyto.c:485 #, c-format -#| msgid "DO ALSO rules are not supported for the COPY" msgid "DO ALSO rules are not supported for COPY" msgstr "las reglas DO ALSO no están soportadas para COPY" @@ -7358,7 +7357,7 @@ msgid "cannot use invalid database \"%s\" as template" msgstr "no se puede usar la base de datos «%s» no válida como plantilla" #: commands/dbcommands.c:988 commands/dbcommands.c:2393 -#: utils/init/postinit.c:1100 +#: utils/init/postinit.c:1117 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Use DROP DATABASE para eliminar una base de datos no válida." @@ -8717,298 +8716,298 @@ msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "no se pueden pasar más de %d argumento a un procedimiento" msgstr[1] "no se pueden pasar más de %d argumentos a un procedimiento" -#: commands/indexcmds.c:640 +#: commands/indexcmds.c:647 #, c-format msgid "must specify at least one column" msgstr "debe especificar al menos una columna" -#: commands/indexcmds.c:644 +#: commands/indexcmds.c:651 #, c-format msgid "cannot use more than %d columns in an index" msgstr "no se puede usar más de %d columnas en un índice" -#: commands/indexcmds.c:687 +#: commands/indexcmds.c:694 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "no se puede crear índice en la relación «%s»" -#: commands/indexcmds.c:713 +#: commands/indexcmds.c:720 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "no se puede crear un índice en la tabla particionada «%s» concurrentemente" -#: commands/indexcmds.c:718 +#: commands/indexcmds.c:725 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "no se pueden create restricciones de exclusión en la tabla particionada «%s»" -#: commands/indexcmds.c:728 +#: commands/indexcmds.c:735 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "no se pueden crear índices en tablas temporales de otras sesiones" -#: commands/indexcmds.c:766 commands/tablecmds.c:802 commands/tablespace.c:1184 +#: commands/indexcmds.c:773 commands/tablecmds.c:802 commands/tablespace.c:1184 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "no se puede especificar el tablespace por omisión para las relaciones particionadas" -#: commands/indexcmds.c:798 commands/tablecmds.c:833 commands/tablecmds.c:3435 +#: commands/indexcmds.c:805 commands/tablecmds.c:833 commands/tablecmds.c:3435 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "sólo relaciones compartidas pueden ser puestas en el tablespace pg_global" -#: commands/indexcmds.c:831 +#: commands/indexcmds.c:838 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "sustituyendo el método de acceso obsoleto «rtree» por «gist»" -#: commands/indexcmds.c:852 +#: commands/indexcmds.c:859 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "el método de acceso «%s» no soporta índices únicos" -#: commands/indexcmds.c:857 +#: commands/indexcmds.c:864 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "el método de acceso «%s» no soporta columnas incluidas" -#: commands/indexcmds.c:862 +#: commands/indexcmds.c:869 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "el método de acceso «%s» no soporta índices multicolumna" -#: commands/indexcmds.c:867 +#: commands/indexcmds.c:874 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "el método de acceso «%s» no soporta restricciones de exclusión" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1001 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "no se puede hacer coincidir la llave de partición a un índice usando el método de acceso «%s»" -#: commands/indexcmds.c:1004 +#: commands/indexcmds.c:1011 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "restricción %s no soportada con definición de llave de particionamiento" -#: commands/indexcmds.c:1006 +#: commands/indexcmds.c:1013 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "No se pueden usar restricciones %s cuando las llaves de particionamiento incluyen expresiones." -#: commands/indexcmds.c:1048 +#: commands/indexcmds.c:1055 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "las restricciones unique en tablas particionadas deben incluir todas las columnas de particionamiento" -#: commands/indexcmds.c:1049 +#: commands/indexcmds.c:1056 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "La restricción %s en la tabla «%s» no incluye la columna «%s» que es parte de la llave de particionamiento." -#: commands/indexcmds.c:1068 commands/indexcmds.c:1087 +#: commands/indexcmds.c:1075 commands/indexcmds.c:1094 #, c-format msgid "index creation on system columns is not supported" msgstr "la creación de índices en columnas de sistema no está soportada" -#: commands/indexcmds.c:1316 tcop/utility.c:1526 +#: commands/indexcmds.c:1323 tcop/utility.c:1526 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "no se puede crear un índice único en la tabla particionada «%s»" -#: commands/indexcmds.c:1318 tcop/utility.c:1528 +#: commands/indexcmds.c:1325 tcop/utility.c:1528 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La tabla «%s» contiene particiones que son tablas foráneas." -#: commands/indexcmds.c:1803 +#: commands/indexcmds.c:1810 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "las funciones utilizadas en predicados de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1881 parser/parse_utilcmd.c:2557 +#: commands/indexcmds.c:1888 parser/parse_utilcmd.c:2557 #: parser/parse_utilcmd.c:2692 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "no existe la columna «%s» en la llave" -#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:1845 +#: commands/indexcmds.c:1912 parser/parse_utilcmd.c:1845 #, c-format msgid "expressions are not supported in included columns" msgstr "las expresiones no están soportadas en columnas incluidas" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1953 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "las funciones utilizadas en expresiones de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:1968 #, c-format msgid "including column does not support a collation" msgstr "la columna incluida no permite un ordenamiento (collation)" -#: commands/indexcmds.c:1965 +#: commands/indexcmds.c:1972 #, c-format msgid "including column does not support an operator class" msgstr "la columna incluida no permite una clase de operadores" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1976 #, c-format msgid "including column does not support ASC/DESC options" msgstr "la columna incluida no permite las opciones ASC/DESC" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1980 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "la columna incluida no permite las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:2014 +#: commands/indexcmds.c:2021 #, c-format msgid "could not determine which collation to use for index expression" msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de índice" -#: commands/indexcmds.c:2022 commands/tablecmds.c:17718 commands/typecmds.c:807 +#: 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 #: utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "los ordenamientos (collation) no están soportados por el tipo %s" -#: commands/indexcmds.c:2087 +#: commands/indexcmds.c:2094 #, c-format msgid "operator %s is not commutative" msgstr "el operador %s no es conmutativo" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2096 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Sólo operadores conmutativos pueden ser usados en restricciones de exclusión." -#: commands/indexcmds.c:2115 +#: commands/indexcmds.c:2122 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "el operador %s no es un miembro de la familia de operadores «%s»" -#: commands/indexcmds.c:2118 +#: commands/indexcmds.c:2125 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "El operador de exclusión debe estar relacionado con la clase de operadores del índice para la restricción." -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2160 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "el método de acceso «%s» no soporta las opciones ASC/DESC" -#: commands/indexcmds.c:2158 +#: commands/indexcmds.c:2165 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "el método de acceso «%s» no soporta las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:2204 commands/tablecmds.c:17743 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17743 #: commands/tablecmds.c:17749 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "el tipo de dato %s no tiene una clase de operadores por omisión para el método de acceso «%s»" -#: commands/indexcmds.c:2206 +#: commands/indexcmds.c:2213 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Debe especificar una clase de operadores para el índice, o definir una clase de operadores por omisión para el tipo de datos." -#: commands/indexcmds.c:2235 commands/indexcmds.c:2243 +#: commands/indexcmds.c:2242 commands/indexcmds.c:2250 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "no existe la clase de operadores «%s» para el método de acceso «%s»" -#: commands/indexcmds.c:2257 commands/typecmds.c:2289 +#: commands/indexcmds.c:2264 commands/typecmds.c:2289 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la clase de operadores «%s» no acepta el tipo de datos %s" -#: commands/indexcmds.c:2347 +#: commands/indexcmds.c:2354 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "hay múltiples clases de operadores por omisión para el tipo de datos %s" -#: commands/indexcmds.c:2675 +#: commands/indexcmds.c:2682 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "opción de REINDEX «%s» no reconocida" -#: commands/indexcmds.c:2899 +#: commands/indexcmds.c:2906 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "la tabla «%s» no tiene índices que puedan ser reindexados concurrentemente" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2920 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "la tabla «%s» no tiene índices para reindexar" -#: commands/indexcmds.c:2958 commands/indexcmds.c:3468 -#: commands/indexcmds.c:3596 +#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 +#: commands/indexcmds.c:3603 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "no se pueden reindexar catálogos de sistema concurrentemente" -#: commands/indexcmds.c:2981 +#: commands/indexcmds.c:2988 #, c-format msgid "can only reindex the currently open database" msgstr "sólo se puede reindexar la base de datos actualmente abierta" -#: commands/indexcmds.c:3075 +#: commands/indexcmds.c:3082 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "no se puede reindexar un catálogo de sistema concurrentemente, omitiéndolos todos" -#: commands/indexcmds.c:3108 +#: commands/indexcmds.c:3115 #, c-format msgid "cannot move system relations, skipping all" msgstr "no se puede mover las relaciones de sistema, omitiendo todas" -#: commands/indexcmds.c:3154 +#: commands/indexcmds.c:3161 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "al reindexar tabla particionada «%s.%s»" -#: commands/indexcmds.c:3157 +#: commands/indexcmds.c:3164 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "al reindexar índice particionado «%s.%s»" -#: commands/indexcmds.c:3348 commands/indexcmds.c:4204 +#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la tabla «%s.%s» fue reindexada" -#: commands/indexcmds.c:3500 commands/indexcmds.c:3552 +#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "no se puede reindexar el índice no válido «%s.%s» concurrentemente, omitiendo" -#: commands/indexcmds.c:3506 +#: commands/indexcmds.c:3513 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "no se puede reindexar el índice de restricción de exclusión «%s.%s» concurrentemente, omitiendo" -#: commands/indexcmds.c:3661 +#: commands/indexcmds.c:3668 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "no se puede reindexar este tipo de relación concurrentemente" -#: commands/indexcmds.c:3682 +#: commands/indexcmds.c:3689 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "no se puede mover relación no compartida al tablespace «%s»" -#: commands/indexcmds.c:4185 commands/indexcmds.c:4197 +#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "el índice «%s.%s» fue reindexado" -#: commands/indexcmds.c:4187 commands/indexcmds.c:4206 +#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 #, c-format msgid "%s." msgstr "%s." @@ -9424,7 +9423,7 @@ msgstr "debe ser superusuario para crear un lenguaje procedural personalizado" #: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 #: postmaster/postmaster.c:1306 storage/file/fd.c:3911 -#: utils/init/miscinit.c:1822 +#: utils/init/miscinit.c:1869 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "la sintaxis de lista no es válida para el parámetro «%s»" @@ -10956,13 +10955,12 @@ msgstr "no se puede cambiar el tipo de una columna de una tabla tipada" #: commands/tablecmds.c:12445 #, c-format -#| msgid "cannot alter type of a column used by a generated column" msgid "cannot specify USING when altering type of generated column" msgstr "no se puede especificar USING al alterar el tipo de una columna generada" #: commands/tablecmds.c:12446 commands/tablecmds.c:17561 #: commands/tablecmds.c:17651 commands/trigger.c:663 -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:972 +#: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "La columna «%s» es una columna generada." @@ -12485,11 +12483,11 @@ msgstr "Sólo los roles con el atributo %s y la opción %s en los roles de desti msgid "cannot use special role specifier in DROP ROLE" msgstr "no se puede usar un especificador especial de rol en DROP ROLE" -#: commands/user.c:1136 commands/user.c:1358 commands/variable.c:836 -#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 +#: 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/regproc.c:1551 utils/init/miscinit.c:756 +#: utils/adt/regproc.c:1551 utils/init/miscinit.c:798 #, c-format msgid "role \"%s\" does not exist" msgstr "no existe el rol «%s»" @@ -12948,32 +12946,42 @@ msgstr "No se puede cambiar «client_encoding» ahora." msgid "cannot change client_encoding during a parallel operation" msgstr "no se puede cambiar «client_encoding» durante una operación paralela" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "se denegará el permiso para definir autorización de sesión «%s»" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "se ha denegado el permiso para definir autorización de sesión «%s»" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "se denegará el permiso para definir el rol «%s»" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "se ha denegado el permiso para definir el rol «%s»" -#: commands/variable.c:1153 +#: commands/variable.c:1196 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour no está soportado en este servidor" -#: commands/variable.c:1181 +#: commands/variable.c:1224 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." -#: commands/variable.c:1194 +#: commands/variable.c:1237 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." -#: commands/variable.c:1207 +#: commands/variable.c:1250 #, c-format msgid "SSL is not supported by this build" msgstr "SSL no está soportado en este servidor" @@ -13064,19 +13072,19 @@ msgstr "el cursor «%s» no está posicionado en una fila" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "el cursor «%s» no es un recorrido simplemente actualizable de la tabla «%s»" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2510 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "el tipo del parámetro %d (%s) no coincide aquel con que fue preparado el plan (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2522 #, c-format msgid "no value found for parameter %d" msgstr "no se encontró un valor para parámetro %d" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 -#: executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 -#: executor/execExprInterp.c:4350 executor/nodeModifyTable.c:205 +#: 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 #, c-format @@ -13093,7 +13101,7 @@ msgstr "La consulta tiene demasiadas columnas." msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "La consulta entrega un valor para una columna eliminada en la posición %d." -#: executor/execExpr.c:651 executor/execExprInterp.c:4252 +#: executor/execExpr.c:651 executor/execExprInterp.c:4264 #: executor/nodeModifyTable.c:217 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." @@ -13104,17 +13112,17 @@ msgstr "La tabla tiene tipo %s en posición ordinal %d, pero la consulta esperab msgid "window function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de ventana deslizante" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1626 #, c-format msgid "target type is not an array" msgstr "el tipo de destino no es un array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1966 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "la columna de ROW() es de tipo %s en lugar de ser de tipo %s" -#: executor/execExpr.c:2576 executor/execSRF.c:719 parser/parse_func.c:138 +#: executor/execExpr.c:2584 executor/execSRF.c:719 parser/parse_func.c:138 #: parser/parse_func.c:655 parser/parse_func.c:1032 #, c-format msgid "cannot pass more than %d argument to a function" @@ -13122,39 +13130,39 @@ msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "no se pueden pasar más de %d argumento a una función" msgstr[1] "no se pueden pasar más de %d argumentos a una función" -#: executor/execExpr.c:2603 executor/execSRF.c:739 executor/functions.c:1068 +#: executor/execExpr.c:2611 executor/execSRF.c:739 executor/functions.c:1068 #: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: executor/execExpr.c:3009 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3017 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "no se puede poner subíndices al tipo %s porque no soporta subíndices" -#: executor/execExpr.c:3137 executor/execExpr.c:3159 +#: executor/execExpr.c:3145 executor/execExpr.c:3167 #, c-format msgid "type %s does not support subscripted assignment" msgstr "el tipo %s no soporta asignación subindexada" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:1974 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "El atributo %d de tipo %s ha sido eliminado" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:1980 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "el atributo %d del tipo %s tiene tipo erróneo" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 -#: executor/execExprInterp.c:3150 +#: executor/execExprInterp.c:1982 executor/execExprInterp.c:3116 +#: executor/execExprInterp.c:3162 #, c-format msgid "Table has type %s, but query expects %s." msgstr "La tabla tiene tipo %s, pero la consulta esperaba %s." -#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 +#: executor/execExprInterp.c:2062 utils/adt/expandedrecord.c:99 #: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 #: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 #: utils/fmgr/funcapi.c:569 @@ -13162,22 +13170,22 @@ msgstr "La tabla tiene tipo %s, pero la consulta esperaba %s." msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" -#: executor/execExprInterp.c:2588 +#: executor/execExprInterp.c:2600 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF no está soportado para este tipo de tabla" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2813 #, c-format msgid "cannot merge incompatible arrays" msgstr "no se puede mezclar arrays incompatibles" -#: executor/execExprInterp.c:2802 +#: executor/execExprInterp.c:2814 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "El array con tipo de elemento %s no puede ser incluido en una sentencia ARRAY con tipo de elemento %s." -#: executor/execExprInterp.c:2823 utils/adt/arrayfuncs.c:266 +#: 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 @@ -13186,12 +13194,12 @@ msgstr "El array con tipo de elemento %s no puede ser incluido en una sentencia msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "el número de dimensiones del array (%d) excede el máximo permitido (%d)" -#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 +#: executor/execExprInterp.c:2855 executor/execExprInterp.c:2890 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "los arrays multidimensionales deben tener expresiones de arrays con dimensiones coincidentes" -#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 +#: executor/execExprInterp.c:2867 utils/adt/array_expanded.c:274 #: utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 #: utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 #: utils/adt/arrayfuncs.c:2654 utils/adt/arrayfuncs.c:2670 @@ -13204,29 +13212,29 @@ msgstr "los arrays multidimensionales deben tener expresiones de arrays con dime msgid "array size exceeds the maximum allowed (%d)" msgstr "el tamaño del array excede el máximo permitido (%d)" -#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:3115 executor/execExprInterp.c:3161 #, c-format msgid "attribute %d has wrong type" msgstr "el atributo %d tiene tipo erróneo" -#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3747 utils/adt/domains.c:155 #, c-format msgid "domain %s does not allow null values" msgstr "el dominio %s no permite valores null" -#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3762 utils/adt/domains.c:193 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "el valor para el dominio %s viola la restricción «check» «%s»" -#: executor/execExprInterp.c:4235 +#: executor/execExprInterp.c:4247 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "La fila de la tabla contiene %d atributo, pero la consulta esperaba %d." msgstr[1] "La fila de la tabla contiene %d atributos, pero la consulta esperaba %d." -#: executor/execExprInterp.c:4351 executor/execSRF.c:978 +#: executor/execExprInterp.c:4363 executor/execSRF.c:978 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Discordancia de almacenamiento físico en atributo eliminado en la posición %d." @@ -13276,38 +13284,38 @@ msgstr "no se puede cambiar la secuencia «%s»" msgid "cannot change TOAST relation \"%s\"" msgstr "no se puede cambiar la relación TOAST «%s»" -#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3092 -#: rewrite/rewriteHandler.c:3990 +#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3147 +#: rewrite/rewriteHandler.c:4045 #, c-format msgid "cannot insert into view \"%s\"" msgstr "no se puede insertar en la vista «%s»" -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3095 -#: rewrite/rewriteHandler.c:3993 +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3150 +#: rewrite/rewriteHandler.c:4048 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Para posibilitar las inserciones en la vista, provea un disparador INSTEAD OF INSERT o una regla incodicional ON INSERT DO INSTEAD." -#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3100 -#: rewrite/rewriteHandler.c:3998 +#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3155 +#: rewrite/rewriteHandler.c:4053 #, c-format msgid "cannot update view \"%s\"" msgstr "no se puede actualizar la vista «%s»" -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3103 -#: rewrite/rewriteHandler.c:4001 +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3158 +#: rewrite/rewriteHandler.c:4056 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Para posibilitar las actualizaciones en la vista, provea un disparador INSTEAD OF UPDATE o una regla incondicional ON UPDATE DO INSTEAD." -#: executor/execMain.c:1085 rewrite/rewriteHandler.c:3108 -#: rewrite/rewriteHandler.c:4006 +#: executor/execMain.c:1085 rewrite/rewriteHandler.c:3163 +#: rewrite/rewriteHandler.c:4061 #, c-format msgid "cannot delete from view \"%s\"" msgstr "no se puede eliminar de la vista «%s»" -#: executor/execMain.c:1087 rewrite/rewriteHandler.c:3111 -#: rewrite/rewriteHandler.c:4009 +#: executor/execMain.c:1087 rewrite/rewriteHandler.c:3166 +#: rewrite/rewriteHandler.c:4064 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Para posibilitar las eliminaciones en la vista, provea un disparador INSTEAD OF DELETE o una regla incondicional ON DELETE DO INSTEAD." @@ -15947,7 +15955,7 @@ msgid "could not implement GROUP BY" msgstr "no se pudo implementar GROUP BY" #: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4037 -#: optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1053 +#: optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Algunos de los tipos sólo soportan hashing, mientras que otros sólo soportan ordenamiento." @@ -15988,7 +15996,7 @@ msgid "All column datatypes must be hashable." msgstr "Todos los tipos de dato de las columnas deben ser tipos de los que se puedan hacer un hash." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1051 #, c-format msgid "could not implement %s" msgstr "no se pudo implementar %s" @@ -18162,7 +18170,6 @@ msgstr "no se puede crear una tabla particionada como hija de herencia" #: parser/parse_utilcmd.c:475 #, c-format -#| msgid "cannot change logged status of table \"%s\" because it is temporary" msgid "cannot set logged status of a temporary sequence" msgstr "no se puede cambiar el estado «logged» de una secuencia temporal" @@ -18339,7 +18346,7 @@ msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELE msgstr "las reglas con condiciones WHERE sólo pueden tener acciones SELECT, INSERT, UPDATE o DELETE" #: parser/parse_utilcmd.c:3174 parser/parse_utilcmd.c:3275 -#: rewrite/rewriteHandler.c:540 rewrite/rewriteManip.c:1087 +#: rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1087 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "las sentencias UNION/INTERSECT/EXCEPT condicionales no están implementadas" @@ -18657,12 +18664,12 @@ msgstr "las huge pages no están soportadas en esta plataforma" msgid "huge pages not supported with the current shared_memory_type setting" msgstr "las huge pages no están soportadas con la configuración actual de shared_memory_type" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1358 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1405 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "el bloque de memoria compartida preexistente (clave %lu, ID %lu) aún está en uso" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1360 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1407 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Termine cualquier proceso de servidor asociado al directorio de datos «%s»." @@ -19079,7 +19086,7 @@ msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: no pudo escribir en el archivo externo de PID «%s»: %s\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1408 utils/init/postinit.c:221 +#: postmaster/postmaster.c:1408 utils/init/postinit.c:222 #, c-format msgid "could not load %s" msgstr "no se pudo cargar %s" @@ -21039,205 +21046,205 @@ msgstr "no existe la regla «%s» para la relación «%s»" msgid "renaming an ON SELECT rule is not allowed" msgstr "no se permite cambiar el nombre de una regla ON SELECT" -#: rewrite/rewriteHandler.c:584 +#: rewrite/rewriteHandler.c:590 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "el nombre de consulta WITH «%s» aparece tanto en una acción de regla y en la consulta que está siendo reescrita" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:617 #, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "las acciones de regla INSERT ... SELECT no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:664 +#: rewrite/rewriteHandler.c:670 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "no se puede usar RETURNING en múltiples reglas" -#: rewrite/rewriteHandler.c:896 rewrite/rewriteHandler.c:935 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:941 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "no se puede insertar un valor no-predeterminado en la columna «%s»" -#: rewrite/rewriteHandler.c:898 rewrite/rewriteHandler.c:964 +#: rewrite/rewriteHandler.c:904 rewrite/rewriteHandler.c:970 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "La columna \"%s\" es una columna de identidad definida como GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:900 +#: rewrite/rewriteHandler.c:906 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Use OVERRIDING SYSTEM VALUE para controlar manualmente." -#: rewrite/rewriteHandler.c:962 rewrite/rewriteHandler.c:970 +#: rewrite/rewriteHandler.c:968 rewrite/rewriteHandler.c:976 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la columna «%s» sólo puede actualizarse a DEFAULT" -#: rewrite/rewriteHandler.c:1117 rewrite/rewriteHandler.c:1135 +#: rewrite/rewriteHandler.c:1123 rewrite/rewriteHandler.c:1141 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "hay múltiples asignaciones a la misma columna «%s»" -#: rewrite/rewriteHandler.c:1749 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:1755 rewrite/rewriteHandler.c:3180 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "el acceso a la vista «%s» que no son de sistema está restringido" -#: rewrite/rewriteHandler.c:2128 rewrite/rewriteHandler.c:4064 +#: rewrite/rewriteHandler.c:2153 rewrite/rewriteHandler.c:4119 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "se detectó recursión infinita en las reglas de la relación «%s»" -#: rewrite/rewriteHandler.c:2213 +#: rewrite/rewriteHandler.c:2258 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "se detectó recursión infinita en la política para la relación «%s»" -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2588 msgid "Junk view columns are not updatable." msgstr "Las columnas «basura» de vistas no son actualizables." -#: rewrite/rewriteHandler.c:2538 +#: rewrite/rewriteHandler.c:2593 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Las columnas de vistas que no son columnas de su relación base no son actualizables." -#: rewrite/rewriteHandler.c:2541 +#: rewrite/rewriteHandler.c:2596 msgid "View columns that refer to system columns are not updatable." msgstr "Las columnas de vistas que se refieren a columnas de sistema no son actualizables." -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2599 msgid "View columns that return whole-row references are not updatable." msgstr "Las columnas de vistas que retornan referencias a la fila completa no son actualizables." # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2660 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Las vistas que contienen DISTINCT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2663 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Las vistas que contienen GROUP BY no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2666 msgid "Views containing HAVING are not automatically updatable." msgstr "Las vistas que contienen HAVING no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2614 +#: rewrite/rewriteHandler.c:2669 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Las vistas que contienen UNION, INTERSECT o EXCEPT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2617 +#: rewrite/rewriteHandler.c:2672 msgid "Views containing WITH are not automatically updatable." msgstr "Las vistas que contienen WITH no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2620 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Las vistas que contienen LIMIT u OFFSET no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2687 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Las vistas que retornan funciones de agregación no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2635 +#: rewrite/rewriteHandler.c:2690 msgid "Views that return window functions are not automatically updatable." msgstr "Las vistas que retornan funciones ventana no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2638 +#: rewrite/rewriteHandler.c:2693 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Las vistas que retornan funciones-que-retornan-conjuntos no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2645 rewrite/rewriteHandler.c:2649 -#: rewrite/rewriteHandler.c:2657 +#: rewrite/rewriteHandler.c:2700 rewrite/rewriteHandler.c:2704 +#: rewrite/rewriteHandler.c:2712 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Las vistas que no extraen desde una única tabla o vista no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2660 +#: rewrite/rewriteHandler.c:2715 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Las vistas que contienen TABLESAMPLE no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2684 +#: rewrite/rewriteHandler.c:2739 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Las vistas que no tienen columnas actualizables no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:3185 +#: rewrite/rewriteHandler.c:3240 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "no se puede insertar en la columna «%s» de la vista «%s»" -#: rewrite/rewriteHandler.c:3193 +#: rewrite/rewriteHandler.c:3248 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "no se puede actualizar la columna «%s» vista «%s»" -#: rewrite/rewriteHandler.c:3691 +#: rewrite/rewriteHandler.c:3746 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD NOTIFY no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3702 +#: rewrite/rewriteHandler.c:3757 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD NOTHING no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3716 +#: rewrite/rewriteHandler.c:3771 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD condicionales no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3720 +#: rewrite/rewriteHandler.c:3775 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO ALSO no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3725 +#: rewrite/rewriteHandler.c:3780 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD de múltiples sentencias no están soportadas para sentencias que modifiquen datos en WITH" # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:3992 rewrite/rewriteHandler.c:4000 -#: rewrite/rewriteHandler.c:4008 +#: rewrite/rewriteHandler.c:4047 rewrite/rewriteHandler.c:4055 +#: rewrite/rewriteHandler.c:4063 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Las vistas con reglas DO INSTEAD condicionales no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:4113 +#: rewrite/rewriteHandler.c:4168 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "no se puede hacer INSERT RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4115 +#: rewrite/rewriteHandler.c:4170 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON INSERT DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:4120 +#: rewrite/rewriteHandler.c:4175 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "no se puede hacer UPDATE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4122 +#: rewrite/rewriteHandler.c:4177 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON UPDATE DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:4127 +#: rewrite/rewriteHandler.c:4182 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "no se puede hacer DELETE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4129 +#: rewrite/rewriteHandler.c:4184 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON DELETE DO INSTEAD con una clásula RETURNING." -#: rewrite/rewriteHandler.c:4147 +#: rewrite/rewriteHandler.c:4202 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT con una cláusula ON CONFLICT no puede usarse con una tabla que tiene reglas INSERT o UPDATE" -#: rewrite/rewriteHandler.c:4204 +#: rewrite/rewriteHandler.c:4259 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH no puede ser usado en una consulta que está siendo convertida en múltiples consultas a través de reglas" @@ -24997,7 +25004,6 @@ msgstr "el valor de percentil %g no está entre 0 y 1" #: utils/adt/pg_locale.c:290 utils/adt/pg_locale.c:322 #, c-format -#| msgid "replication slot name \"%s\" contains invalid character" msgid "locale name \"%s\" contains non-ASCII characters" msgstr "el nombre de configuración regional «%s» contiene caracteres no ASCII" @@ -25271,7 +25277,7 @@ msgstr "Si su intención era usar regexp_replace() con un parámetro de inicio, #: 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:6633 utils/misc/guc.c:6667 +#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "valor no válido para el parámetro «%s»: %d" @@ -25319,8 +25325,8 @@ msgstr "falta un argumento" msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Use NONE para denotar el argumento faltante de un operador unario." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10097 -#: utils/adt/ruleutils.c:10310 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10103 +#: utils/adt/ruleutils.c:10316 #, c-format msgid "too many arguments" msgstr "demasiados argumentos" @@ -26478,350 +26484,345 @@ msgstr "no se entregó alias de columna" msgid "could not determine row description for function returning record" msgstr "no se pudo encontrar descripción de registro de función que retorna record" -#: utils/init/miscinit.c:346 +#: utils/init/miscinit.c:347 #, c-format msgid "data directory \"%s\" does not exist" msgstr "no existe el directorio de datos «%s»" -#: utils/init/miscinit.c:351 +#: utils/init/miscinit.c:352 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: utils/init/miscinit.c:359 +#: utils/init/miscinit.c:360 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "el directorio de datos especificado «%s» no es un directorio" -#: utils/init/miscinit.c:375 +#: utils/init/miscinit.c:376 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "el directorio de datos «%s» tiene dueño equivocado" -#: utils/init/miscinit.c:377 +#: utils/init/miscinit.c:378 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "El servidor debe ser iniciado por el usuario dueño del directorio de datos." -#: utils/init/miscinit.c:395 +#: utils/init/miscinit.c:396 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "el directorio de datos «%s» tiene permisos no válidos" -#: utils/init/miscinit.c:397 +#: utils/init/miscinit.c:398 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Los permisos deberían ser u=rwx (0700) o u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:455 +#: utils/init/miscinit.c:456 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: utils/init/miscinit.c:692 utils/misc/guc.c:3563 +#: utils/init/miscinit.c:726 utils/misc/guc.c:3563 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "no se puede definir el parámetro «%s» dentro de una operación restringida por seguridad" -#: utils/init/miscinit.c:764 +#: utils/init/miscinit.c:810 #, c-format msgid "role with OID %u does not exist" msgstr "no existe el rol con OID %u" -#: utils/init/miscinit.c:794 +#: utils/init/miscinit.c:860 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "al rol «%s» no se le permite conectarse" -#: utils/init/miscinit.c:812 +#: utils/init/miscinit.c:878 #, c-format msgid "too many connections for role \"%s\"" msgstr "demasiadas conexiones para el rol «%s»" -#: utils/init/miscinit.c:919 -#, c-format -msgid "permission denied to set session authorization" -msgstr "se ha denegado el permiso para cambiar el usuario actual" - -#: utils/init/miscinit.c:1002 +#: utils/init/miscinit.c:1049 #, c-format msgid "invalid role OID: %u" msgstr "el OID de rol no es válido: %u" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1196 #, c-format msgid "database system is shut down" msgstr "el sistema de bases de datos está apagado" -#: utils/init/miscinit.c:1236 +#: utils/init/miscinit.c:1283 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "no se pudo crear el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1297 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "no se pudo abrir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1257 +#: utils/init/miscinit.c:1304 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "no se pudo leer el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1313 #, c-format msgid "lock file \"%s\" is empty" msgstr "el archivo de bloqueo «%s» está vacío" -#: utils/init/miscinit.c:1267 +#: utils/init/miscinit.c:1314 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Otro proceso servidor está iniciándose, o el archivo de bloqueo es remanente de una caída durante un inicio anterior." -#: utils/init/miscinit.c:1311 +#: utils/init/miscinit.c:1358 #, c-format msgid "lock file \"%s\" already exists" msgstr "el archivo de bloqueo «%s» ya existe" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1362 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "¿Hay otro postgres (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1317 +#: utils/init/miscinit.c:1364 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "¿Hay otro postmaster (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1320 +#: utils/init/miscinit.c:1367 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postgres (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1322 +#: utils/init/miscinit.c:1369 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postmaster (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1373 +#: utils/init/miscinit.c:1420 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "no se pudo eliminar el archivo de bloqueo antiguo «%s»: %m" -#: utils/init/miscinit.c:1375 +#: utils/init/miscinit.c:1422 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "El archivo parece accidentalmente abandonado, pero no pudo ser eliminado. Por favor elimine el archivo manualmente e intente nuevamente." -#: utils/init/miscinit.c:1412 utils/init/miscinit.c:1426 -#: utils/init/miscinit.c:1437 +#: utils/init/miscinit.c:1459 utils/init/miscinit.c:1473 +#: utils/init/miscinit.c:1484 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "no se pudo escribir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1548 utils/init/miscinit.c:1690 utils/misc/guc.c:5603 +#: utils/init/miscinit.c:1595 utils/init/miscinit.c:1737 utils/misc/guc.c:5644 #, c-format msgid "could not read from file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: utils/init/miscinit.c:1678 +#: utils/init/miscinit.c:1725 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "no se pudo abrir el archivo «%s»: %m; continuando de todas formas" -#: utils/init/miscinit.c:1703 +#: utils/init/miscinit.c:1750 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "el archivo de bloqueo «%s» tiene un PID erróneo: %ld en lugar de %ld" -#: utils/init/miscinit.c:1742 utils/init/miscinit.c:1758 +#: utils/init/miscinit.c:1789 utils/init/miscinit.c:1805 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "«%s» no es un directorio de datos válido" -#: utils/init/miscinit.c:1744 +#: utils/init/miscinit.c:1791 #, c-format msgid "File \"%s\" is missing." msgstr "Falta el archivo «%s»." -#: utils/init/miscinit.c:1760 +#: utils/init/miscinit.c:1807 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "El archivo «%s» no contiene datos válidos." -#: utils/init/miscinit.c:1762 +#: utils/init/miscinit.c:1809 #, c-format msgid "You might need to initdb." msgstr "Puede ser necesario ejecutar initdb." -#: utils/init/miscinit.c:1770 +#: utils/init/miscinit.c:1817 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "El directorio de datos fue inicializado por PostgreSQL versión %s, que no es compatible con esta versión %s." -#: utils/init/postinit.c:259 +#: utils/init/postinit.c:260 #, c-format msgid "replication connection authorized: user=%s" msgstr "conexión de replicación autorizada: usuario=%s" -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:263 #, c-format msgid "connection authorized: user=%s" msgstr "conexión autorizada: usuario=%s" -#: utils/init/postinit.c:265 +#: utils/init/postinit.c:266 #, c-format msgid " database=%s" msgstr " base_de_datos=%s" -#: utils/init/postinit.c:268 +#: utils/init/postinit.c:269 #, c-format msgid " application_name=%s" msgstr " nombre_de_aplicación=%s" -#: utils/init/postinit.c:273 +#: utils/init/postinit.c:274 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL habilitado (protocolo=%s, cifrado=%s, bits=%d)" -#: utils/init/postinit.c:285 +#: utils/init/postinit.c:286 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" msgstr " GSS (autenticado=%s, cifrado=%s, delegado_credenciales=%s, principal=%s)" -#: utils/init/postinit.c:286 utils/init/postinit.c:287 -#: utils/init/postinit.c:288 utils/init/postinit.c:293 -#: utils/init/postinit.c:294 utils/init/postinit.c:295 +#: utils/init/postinit.c:287 utils/init/postinit.c:288 +#: utils/init/postinit.c:289 utils/init/postinit.c:294 +#: utils/init/postinit.c:295 utils/init/postinit.c:296 msgid "no" msgstr "no" -#: utils/init/postinit.c:286 utils/init/postinit.c:287 -#: utils/init/postinit.c:288 utils/init/postinit.c:293 -#: utils/init/postinit.c:294 utils/init/postinit.c:295 +#: utils/init/postinit.c:287 utils/init/postinit.c:288 +#: utils/init/postinit.c:289 utils/init/postinit.c:294 +#: utils/init/postinit.c:295 utils/init/postinit.c:296 msgid "yes" msgstr "sí" -#: utils/init/postinit.c:292 +#: utils/init/postinit.c:293 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" msgstr " GSS (autenticado=%s, cifrado=%s, delegado_credentiales=%s)" -#: utils/init/postinit.c:333 +#: utils/init/postinit.c:334 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "la base de datos «%s» ha desaparecido de pg_database" -#: utils/init/postinit.c:335 +#: utils/init/postinit.c:336 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Base de datos con OID %u ahora parece pertenecer a «%s»." -#: utils/init/postinit.c:355 +#: utils/init/postinit.c:356 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "la base de datos «%s» no acepta conexiones" -#: utils/init/postinit.c:368 +#: utils/init/postinit.c:369 #, c-format msgid "permission denied for database \"%s\"" msgstr "permiso denegado a la base de datos «%s»" -#: utils/init/postinit.c:369 +#: utils/init/postinit.c:370 #, c-format msgid "User does not have CONNECT privilege." msgstr "Usuario no tiene privilegios de conexión." -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:387 #, c-format msgid "too many connections for database \"%s\"" msgstr "demasiadas conexiones para la base de datos «%s»" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:411 utils/init/postinit.c:418 #, c-format msgid "database locale is incompatible with operating system" msgstr "la configuración regional es incompatible con el sistema operativo" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:412 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "La base de datos fue inicializada con LC_COLLATE «%s», el cual no es reconocido por setlocale()." -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:414 utils/init/postinit.c:421 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Recree la base de datos con otra configuración regional, o instale la configuración regional faltante." -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:419 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "La base de datos fue inicializada con LC_CTYPE «%s», el cual no es reconocido por setlocale()." -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:476 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "la base de datos «%s» tiene una discordancia de versión de ordenamiento (“collation”)" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:478 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "La base de datos fue creada usando la versión de ordenamiento %s, pero el sistema operativo provee la versión %s." -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:481 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Reconstruya todos los objetos en esta base de datos que usen el ordenamiento por omisión y ejecute ALTER DATABASE %s REFRESH COLLATION VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:892 #, c-format msgid "no roles are defined in this database system" msgstr "no hay roles definidos en esta base de datos" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:893 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Debería ejecutar imediatamente CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:945 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "debe ser superusuario para conectarse en modo de actualización binaria" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:966 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "las conexiones restantes están reservadas a roles con el atributo %s" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:972 #, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "las conexiones restantes están reservadas a roles con privilegios del rol «%s»" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:984 #, c-format msgid "permission denied to start WAL sender" msgstr "se ha denegado el permiso para iniciar WAL sender" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:985 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "Sólo roles con el atributo %s pueden iniciar un proceso WAL sender." -#: utils/init/postinit.c:1086 +#: utils/init/postinit.c:1103 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Parece haber sido eliminada o renombrada." -#: utils/init/postinit.c:1090 +#: utils/init/postinit.c:1107 #, c-format msgid "database %u does not exist" msgstr "no existe la base de datos %u" -#: utils/init/postinit.c:1099 +#: utils/init/postinit.c:1116 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "no se puede conectar a la base de datos no válida «%s»" -#: utils/init/postinit.c:1159 +#: utils/init/postinit.c:1176 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Falta el subdirectorio de base de datos «%s»." @@ -26918,8 +26919,8 @@ msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "parámetro de configuración «%s» no reconocido en el archivo «%s» línea %d" #: utils/misc/guc.c:461 utils/misc/guc.c:3417 utils/misc/guc.c:3661 -#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3981 -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3984 +#: utils/misc/guc.c:4125 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "el parámetro «%s» no se puede cambiar sin reiniciar el servidor" @@ -27036,11 +27037,10 @@ msgstr "%g%s%s está fuera del rango aceptable para el parámetro «%s» (%g .. #: utils/misc/guc.c:3378 #, c-format -#| msgid "cannot abort during a parallel operation" msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "no se puede definir el parámetro «%s» durante una operación paralela" -#: utils/misc/guc.c:3394 utils/misc/guc.c:4545 +#: utils/misc/guc.c:3394 utils/misc/guc.c:4586 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "no se puede cambiar el parámetro «%s»" @@ -27050,8 +27050,8 @@ msgstr "no se puede cambiar el parámetro «%s»" msgid "parameter \"%s\" cannot be changed now" msgstr "el parámetro «%s» no se puede cambiar en este momento" -#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4521 -#: utils/misc/guc.c:6569 +#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 +#: utils/misc/guc.c:6604 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "se ha denegado el permiso para cambiar la opción «%s»" @@ -27076,62 +27076,62 @@ msgstr "el parámetro «%s» no puede ser reseteado" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "el parámetro «%s» no se puede cambiar localmente en funciones" -#: utils/misc/guc.c:4227 utils/misc/guc.c:4274 utils/misc/guc.c:5288 +#: utils/misc/guc.c:4268 utils/misc/guc.c:4315 utils/misc/guc.c:5329 #, c-format msgid "permission denied to examine \"%s\"" msgstr "se ha denegado el permiso a examinar «%s»" -#: utils/misc/guc.c:4228 utils/misc/guc.c:4275 utils/misc/guc.c:5289 +#: utils/misc/guc.c:4269 utils/misc/guc.c:4316 utils/misc/guc.c:5330 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "Sólo roles con privilegios del rol «%s» pueden examinar este parámetro." -#: utils/misc/guc.c:4511 +#: utils/misc/guc.c:4552 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "permiso denegado a ejecutar ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:4577 +#: utils/misc/guc.c:4618 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "los valores de parámetros para ALTER SYSTEM no deben contener saltos de línea" -#: utils/misc/guc.c:4623 +#: utils/misc/guc.c:4664 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "no se pudo interpretar el contenido del archivo «%s»" -#: utils/misc/guc.c:4805 +#: utils/misc/guc.c:4846 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "intento de cambiar la opción «%s»" -#: utils/misc/guc.c:5144 +#: utils/misc/guc.c:5185 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "nombre de parámetro de configuración «%s» no válido, eliminándolo" -#: utils/misc/guc.c:5146 +#: utils/misc/guc.c:5187 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "«%s» es ahora un prefijo reservado." -#: utils/misc/guc.c:6023 +#: utils/misc/guc.c:6058 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "al establecer el parámetro «%s» a «%s»" -#: utils/misc/guc.c:6192 +#: utils/misc/guc.c:6227 #, c-format msgid "parameter \"%s\" could not be set" msgstr "no se pudo cambiar el parámetro «%s»" -#: utils/misc/guc.c:6282 +#: utils/misc/guc.c:6317 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "no se pudo interpretar el valor de para el parámetro «%s»" -#: utils/misc/guc.c:6701 +#: utils/misc/guc.c:6736 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valor no válido para el parámetro «%s»: %g" @@ -29954,6 +29954,3 @@ msgstr "uso no estandar de escape en un literal de cadena" #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Use la sintaxis de escape para cadenas, por ej. E'\\r\\n'." - -#~ msgid "Sets relation kinds of non-system relation to restrict use" -#~ msgstr "Define tipos de relación que están restringidos para relaciones que no son de sistema." diff --git a/src/backend/po/fr.po b/src/backend/po/fr.po index c5fc279ae1e..2f8d705717f 100644 --- a/src/backend/po/fr.po +++ b/src/backend/po/fr.po @@ -1316,7 +1316,7 @@ msgstr "La clé « %s » existe déjà." #: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." -msgstr "Ceci peut être dû à une expression d'index immutable." +msgstr "Ceci peut être dû à une expression d'index non immutable." #: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2326 #, c-format diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index 472e3358c3f..5ab7d716b7b 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: 2024-11-11 10:14+0900\n" -"PO-Revision-Date: 2024-11-11 11:55+0900\n" +"POT-Creation-Date: 2025-02-03 10:37+0900\n" +"PO-Revision-Date: 2025-02-03 14:01+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -118,27 +118,27 @@ 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:4213 access/transam/xlogrecovery.c:4316 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:1537 utils/init/miscinit.c:1671 utils/init/miscinit.c:1748 utils/misc/guc.c:4615 utils/misc/guc.c:4665 +#: 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 #, c-format msgid "could not open file \"%s\": %m" 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 backup/basebackup_server.c:175 backup/basebackup_server.c:268 postmaster/postmaster.c:5573 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 utils/cache/relmapper.c:948 +#: ../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 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 utils/cache/relmapper.c:948 #, c-format 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:1135 storage/smgr/md.c:1180 storage/sync/sync.c:451 utils/misc/guc.c:4385 +#: 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 #, 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:269 ../common/stringinfo.c:305 ../port/path.c:751 ../port/path.c:789 ../port/path.c:806 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:2537 postmaster/postmaster.c:4130 postmaster/postmaster.c:5498 postmaster/postmaster.c:5869 replication/libpqwalreceiver/libpqwalreceiver.c:361 replication/logical/logical.c:209 replication/walsender.c:686 storage/buffer/localbuf.c:601 +#: ../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:4363 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/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 #, c-format msgid "out of memory" @@ -176,12 +176,12 @@ msgstr "実行すべき\"%s\"がありませんでした" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../common/exec.c:412 libpq/pqcomm.c:724 storage/ipc/latch.c:1134 storage/ipc/latch.c:1314 storage/ipc/latch.c:1547 storage/ipc/latch.c:1709 storage/ipc/latch.c:1835 +#: ../common/exec.c:412 libpq/pqcomm.c:724 storage/ipc/latch.c:1134 storage/ipc/latch.c:1314 storage/ipc/latch.c:1554 storage/ipc/latch.c:1716 storage/ipc/latch.c:1842 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 ../port/path.c:808 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 utils/misc/ps_status.c:230 utils/misc/ps_status.c:238 +#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:868 ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 utils/misc/ps_status.c:230 utils/misc/ps_status.c:238 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" @@ -197,7 +197,7 @@ msgstr "nullポインタは複製できません(内部エラー)\n" msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %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:1564 storage/file/fd.c:2880 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 +#: ../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 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" @@ -323,7 +323,7 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " -#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 postmaster/postmaster.c:2211 utils/misc/guc.c:3120 utils/misc/guc.c:3156 utils/misc/guc.c:3226 utils/misc/guc.c:4562 utils/misc/guc.c:6744 utils/misc/guc.c:6785 +#: ../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 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"の値が不正です: \"%s\"" @@ -394,15 +394,15 @@ msgstr "ファイル\"%s\"を削除できませんでした: %m" msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除できませんでした: %m" -#: ../common/scram-common.c:282 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "saltのエンコードに失敗しました" -#: ../common/scram-common.c:298 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "nonceのエンコードに失敗しました" -#: ../common/scram-common.c:315 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "サーバーキーのエンコードに失敗しました" @@ -519,7 +519,7 @@ msgstr "再試行を30秒間続けます。" msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムに干渉するアンチウィルス、バックアップといったソフトウェアが存在する可能性があります。" -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format msgid "could not get current working directory: %s\n" msgstr "現在の作業ディレクトリを取得できませんでした: %s\n" @@ -722,7 +722,7 @@ msgstr "RESETにはパラメータの値を含めてはいけません" msgid "unrecognized parameter namespace \"%s\"" msgstr "認識できないパラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1302 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSと定義されたテーブルはサポートされません" @@ -842,7 +842,7 @@ msgstr "古いGINインデックスはインデックス全体のスキャンや msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "これを修復するには REINDEX INDEX \"%s\" をおこなってください。" -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 utils/adt/rowtypes.c:984 +#: access/gin/ginutil.c:146 executor/execExpr.c:2177 utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 utils/adt/rowtypes.c:984 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s型の比較関数が見つかりません" @@ -917,7 +917,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:671 catalog/heap.c:677 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:2015 commands/tablecmds.c:17711 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: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 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 +968,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:2048 +#: access/heap/heapam.c:2049 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカーではタプルの挿入はできません" -#: access/heap/heapam.c:2567 +#: access/heap/heapam.c:2568 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処理中はタプルの削除はできません" -#: access/heap/heapam.c:2614 +#: access/heap/heapam.c:2615 #, c-format msgid "attempted to delete invisible tuple" msgstr "不可視のタプルを削除しようとしました" -#: access/heap/heapam.c:3062 access/heap/heapam.c:6294 access/index/genam.c:819 +#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処理中はタプルの更新はできません" -#: access/heap/heapam.c:3194 +#: access/heap/heapam.c:3239 #, c-format msgid "attempted to update invisible tuple" msgstr "不可視のタプルを更新しようとしました" -#: access/heap/heapam.c:4705 access/heap/heapam.c:4743 access/heap/heapam.c:5008 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"の行ロックを取得できませんでした" -#: access/heap/heapam.c:6107 commands/trigger.c:3347 executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 +#: access/heap/heapam.c:6152 commands/trigger.c:3347 executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "更新対象のタプルはすでに現在のコマンドによって発行された操作によって変更されています" @@ -1018,7 +1018,7 @@ msgstr "行が大きすぎます: サイズは%zu、上限は%zu" msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "ファイル\"%1$s\"に書き込めませんでした、%3$dバイト中%2$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/xlogfuncs.c:702 backup/basebackup_server.c:151 backup/basebackup_server.c:244 commands/dbcommands.c:495 postmaster/postmaster.c:4557 postmaster/postmaster.c:5560 replication/logical/origin.c:603 replication/slot.c:1804 +#: 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/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 replication/logical/origin.c:603 replication/slot.c:1804 #: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 #, c-format msgid "could not create file \"%s\": %m" @@ -1029,8 +1029,8 @@ 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:4567 postmaster/postmaster.c:4577 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1776 replication/slot.c:1839 -#: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1612 utils/init/miscinit.c:1623 utils/init/miscinit.c:1631 utils/misc/guc.c:4346 utils/misc/guc.c:4377 utils/misc/guc.c:5513 utils/misc/guc.c:5531 utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 +#: 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 +#: 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" msgstr "ファイル\"%s\"を書き出せませんでした: %m" @@ -1272,7 +1272,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:2843 commands/tablecmds.c:272 commands/tablecmds.c:296 commands/tablecmds.c:17406 commands/tablecmds.c:19249 +#: 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 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" @@ -1376,7 +1376,7 @@ msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではあり msgid "%s cannot be empty." msgstr "%sは空にはできません。" -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4808 +#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s が長過ぎます(最大%d文字)。" @@ -1518,36 +1518,36 @@ msgstr "マルチトランザクション%uがディスク上に存在しない msgid "invalid MultiXactId: %u" msgstr "不正なMultiXactId: %u" -#: access/transam/parallel.c:742 access/transam/parallel.c:861 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "パラレルワーカーの初期化に失敗しました" -#: access/transam/parallel.c:743 access/transam/parallel.c:862 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "詳細な情報がサーバーログにあるかもしれません。" -#: access/transam/parallel.c:923 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "並列処理中にpostmasterが終了しました" -#: access/transam/parallel.c:1110 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "パラレルワーカーへの接続を失いました" -#: access/transam/parallel.c:1176 access/transam/parallel.c:1178 +#: access/transam/parallel.c:1182 access/transam/parallel.c:1184 msgid "parallel worker" msgstr "パラレルワーカー" -#: access/transam/parallel.c:1332 replication/logical/applyparallelworker.c:893 +#: access/transam/parallel.c:1338 replication/logical/applyparallelworker.c:893 #, c-format msgid "could not map dynamic shared memory segment" msgstr "動的共有メモリセグメントをマップできませんでした" -#: access/transam/parallel.c:1337 replication/logical/applyparallelworker.c:899 +#: access/transam/parallel.c:1343 replication/logical/applyparallelworker.c:899 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントのマジックナンバーが不正です" @@ -2058,7 +2058,7 @@ msgstr "なかったディレクトリ\"%s\"の作成に失敗しました: %m" 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 utils/init/miscinit.c:1769 +#: 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 utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "データベースファイルがサーバーと互換性がありません" @@ -3037,7 +3037,7 @@ msgstr "リカバリ完了位置で一時停止しています" msgid "Execute pg_wal_replay_resume() to promote." msgstr "再開するには pg_wal_replay_resume() を実行してください" -#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4628 +#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4629 #, c-format msgid "recovery has paused" msgstr "リカバリは一時停止中です" @@ -3062,117 +3062,117 @@ msgstr "WALセグメント%s、LSN %X/%X、オフセット%uを読み取れま msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "WALセグメント%1$s、LSN %2$X/%3$X、オフセット%4$uを読み取れませんでした: %6$zu 中 %5$d の読み込み" -#: access/transam/xlogrecovery.c:4010 +#: access/transam/xlogrecovery.c:4011 #, c-format msgid "invalid checkpoint location" msgstr "不正なチェックポイント位置" -#: access/transam/xlogrecovery.c:4020 +#: access/transam/xlogrecovery.c:4021 #, c-format msgid "invalid checkpoint record" msgstr "チェックポイントレコードが不正です" -#: access/transam/xlogrecovery.c:4026 +#: access/transam/xlogrecovery.c:4027 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" -#: access/transam/xlogrecovery.c:4034 +#: access/transam/xlogrecovery.c:4035 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "チェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlogrecovery.c:4040 +#: access/transam/xlogrecovery.c:4041 #, c-format msgid "invalid length of checkpoint record" msgstr "チェックポイントレコード長が不正です" -#: access/transam/xlogrecovery.c:4094 +#: access/transam/xlogrecovery.c:4095 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" -#: access/transam/xlogrecovery.c:4108 +#: access/transam/xlogrecovery.c:4109 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "新しいタイムライン%uは現在のデータベースシステムのタイムライン%uから現在のリカバリポイント%X/%Xより前に分岐しています" -#: access/transam/xlogrecovery.c:4127 +#: access/transam/xlogrecovery.c:4128 #, c-format msgid "new target timeline is %u" msgstr "新しい目標タイムラインは%uです" -#: access/transam/xlogrecovery.c:4330 +#: access/transam/xlogrecovery.c:4331 #, c-format msgid "WAL receiver process shutdown requested" msgstr "wal receiverプロセスのシャットダウンが要求されました" -#: access/transam/xlogrecovery.c:4390 +#: access/transam/xlogrecovery.c:4391 #, c-format msgid "received promote request" msgstr "昇格要求を受信しました" -#: access/transam/xlogrecovery.c:4619 +#: access/transam/xlogrecovery.c:4620 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、ホットスタンバイを使用できません" -#: access/transam/xlogrecovery.c:4620 access/transam/xlogrecovery.c:4647 access/transam/xlogrecovery.c:4677 +#: access/transam/xlogrecovery.c:4621 access/transam/xlogrecovery.c:4648 access/transam/xlogrecovery.c:4678 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d はプライマリサーバーの設定値より小さいです、プライマリサーバーではこの値は%dでした。" -#: access/transam/xlogrecovery.c:4629 +#: access/transam/xlogrecovery.c:4630 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "リカバリの一時停止を解除すると、サーバーはシャットダウンします。" -#: access/transam/xlogrecovery.c:4630 +#: access/transam/xlogrecovery.c:4631 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "その後、必要な設定変更を行った後にサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4642 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、昇格できません" -#: access/transam/xlogrecovery.c:4651 +#: access/transam/xlogrecovery.c:4652 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行ったのち、サーバーを再起動してください。" -#: access/transam/xlogrecovery.c:4675 +#: access/transam/xlogrecovery.c:4676 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "不十分なパラメータ設定値のためリカバリが停止しました" -#: access/transam/xlogrecovery.c:4681 +#: access/transam/xlogrecovery.c:4682 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4723 +#: access/transam/xlogrecovery.c:4724 #, c-format msgid "multiple recovery targets specified" msgstr "複数のリカバリ目標が指定されています" -#: access/transam/xlogrecovery.c:4724 +#: access/transam/xlogrecovery.c:4725 #, c-format msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." msgstr " recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid はこの中の1つまで設定可能です。" -#: access/transam/xlogrecovery.c:4735 +#: access/transam/xlogrecovery.c:4736 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"のみが指定可能です。" -#: access/transam/xlogrecovery.c:4887 utils/adt/timestamp.c:186 utils/adt/timestamp.c:439 +#: access/transam/xlogrecovery.c:4888 utils/adt/timestamp.c:186 utils/adt/timestamp.c:439 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestampが範囲外です: \"%s\"" -#: access/transam/xlogrecovery.c:4932 +#: access/transam/xlogrecovery.c:4933 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timelineが妥当な数値ではありません。" @@ -3202,7 +3202,7 @@ msgstr "失敗したアーカイブコマンドは次のとおりです: %s" msgid "archive command was terminated by exception 0x%X" msgstr "アーカイブコマンドが例外0x%Xで終了しました" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3678 +#: archive/shell_archive.c:107 postmaster/postmaster.c:3679 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" @@ -3409,7 +3409,7 @@ msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1166 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" @@ -4145,8 +4145,8 @@ 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: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 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:6638 -#: utils/misc/guc.c:6672 utils/misc/guc.c:6706 utils/misc/guc.c:6749 utils/misc/guc.c:6791 +#: 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 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" msgstr "%s" @@ -4324,12 +4324,12 @@ msgstr "これは生成列を自身の値に依存させることにつながり msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1298 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1292 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"の型は%sですが、デフォルト式の型は%sです" -#: catalog/heap.c:2814 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:1303 +#: catalog/heap.c:2814 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 "式を書き換えるかキャストする必要があります。" @@ -4434,12 +4434,12 @@ msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作 msgid "cannot reindex temporary tables of other sessions" msgstr "他のセッションの一時テーブルはインデクス再構築できません" -#: catalog/index.c:3685 commands/indexcmds.c:3607 +#: catalog/index.c:3685 commands/indexcmds.c:3614 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルの無効なインデックスの再作成はできません" -#: catalog/index.c:3701 commands/indexcmds.c:3487 commands/indexcmds.c:3631 commands/tablecmds.c:3428 +#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" msgstr "システムリレーション\"%s\"を移動できません" @@ -4454,7 +4454,7 @@ msgstr "インデックス\"%s\"のインデックス再構築が完了しまし msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "TOASTテーブルの無効なインデックス \"%s.%s\"の再作成はできません、スキップします " -#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 commands/trigger.c:5738 +#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 commands/trigger.c:5736 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "データベース間の参照は実装されていません: \"%s.%s.%s\"" @@ -4740,74 +4740,74 @@ msgid "unrecognized object type \"%s\"" msgstr "認識されないオブジェクトタイプ\"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2966 #, c-format msgid "column %s of %s" msgstr "%2$s の列 %1$s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2981 #, c-format msgid "function %s" msgstr "関数%s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2994 #, c-format msgid "type %s" msgstr "型%s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:3031 #, c-format msgid "cast from %s to %s" msgstr "%sから%sへの型変換" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3064 #, c-format msgid "collation %s" msgstr "照合順序%s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3095 #, c-format msgid "constraint %s on %s" msgstr "%2$sに対する制約%1$s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s" msgstr "制約%s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3133 #, c-format msgid "conversion %s" msgstr "変換%s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3155 #, c-format msgid "default value for %s" msgstr "%s のデフォルト値" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3166 #, c-format msgid "language %s" msgstr "言語%s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3174 #, c-format msgid "large object %u" msgstr "ラージオブジェクト%u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3187 #, c-format msgid "operator %s" msgstr "演算子%s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3224 #, c-format msgid "operator class %s for access method %s" msgstr "アクセスメソッド%2$s用の演算子クラス%1$s" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3252 #, c-format msgid "access method %s" msgstr "アクセスメソッド%s" @@ -4816,7 +4816,7 @@ msgstr "アクセスメソッド%s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%4$sの演算子%1$d (%2$s, %3$s): %5$s" @@ -4825,236 +4825,236 @@ msgstr "%4$sの演算子%1$d (%2$s, %3$s): %5$s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3372 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "%4$s の関数 %1$d (%2$s, %3$s): %5$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3426 #, c-format msgid "rule %s on %s" msgstr "%2$s のルール %1$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3472 #, c-format msgid "trigger %s on %s" msgstr "%2$s のトリガ %1$s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3492 #, c-format msgid "schema %s" msgstr "スキーマ%s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3520 #, c-format msgid "statistics object %s" msgstr "統計オブジェクト%s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3551 #, c-format msgid "text search parser %s" msgstr "テキスト検索パーサ%s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3582 #, c-format msgid "text search dictionary %s" msgstr "テキスト検索辞書%s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3613 #, c-format msgid "text search template %s" msgstr "テキスト検索テンプレート%s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3644 #, c-format msgid "text search configuration %s" msgstr "テキスト検索設定%s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3657 #, c-format msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3694 catalog/objectaddress.c:5546 #, c-format msgid "membership of role %s in role %s" msgstr "ロール%sのロール%sへの所属" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3715 #, c-format msgid "database %s" msgstr "データベース%s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3731 #, c-format msgid "tablespace %s" msgstr "テーブル空間%s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3742 #, c-format msgid "foreign-data wrapper %s" msgstr "外部データラッパー%s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3752 #, c-format msgid "server %s" msgstr "サーバー%s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3785 #, c-format msgid "user mapping for %s on server %s" msgstr "サーバー%2$s上のユーザーマッピング%1$s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3837 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいリレーションのデフォルト権限" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3841 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "新しいリレーションに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3847 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいシーケンスのデフォルト権限" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3851 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "新しいシーケンスに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3857 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい関数のデフォルト権限" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3861 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "新しい関数に関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3867 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい型のデフォルト権限" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3871 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "新しい型に関するデフォルトの権限は、ロール%sに属します" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3877 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "ロール%sに属する新しいスキーマ上のデフォルト権限" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3884 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s に属するデフォルト権限" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3888 #, c-format msgid "default privileges belonging to role %s" msgstr "デフォルトの権限はロール%sに属します。" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3910 #, c-format msgid "extension %s" msgstr "機能拡張%s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3927 #, c-format msgid "event trigger %s" msgstr "イベントトリガ%s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3951 #, c-format msgid "parameter %s" msgstr "パラメータ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3994 #, c-format msgid "policy %s on %s" msgstr "%2$s のポリシ %1$s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:4008 #, c-format msgid "publication %s" msgstr "パブリケーション%s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:4021 #, c-format msgid "publication of schema %s in publication %s" msgstr "パブリケーション%2$sでのスキーマ%1$sの発行" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4052 #, c-format msgid "publication of %s in publication %s" msgstr "パブリケーション %2$s での %1$s の発行" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4065 #, c-format msgid "subscription %s" msgstr "サブスクリプション%s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4086 #, c-format msgid "transform for %s language %s" msgstr "言語%2$sの%1$s型に対する変換" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4157 #, c-format msgid "table %s" msgstr "テーブル%s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4162 #, c-format msgid "index %s" msgstr "インデックス%s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4166 #, c-format msgid "sequence %s" msgstr "シーケンス%s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4170 #, c-format msgid "toast table %s" msgstr "TOASTテーブル%s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4174 #, c-format msgid "view %s" msgstr "ビュー%s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4178 #, c-format msgid "materialized view %s" msgstr "実体化ビュー%s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4182 #, c-format msgid "composite type %s" msgstr "複合型%s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4186 #, c-format msgid "foreign table %s" msgstr "外部テーブル%s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4191 #, c-format msgid "relation %s" msgstr "リレーション%s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4232 #, c-format msgid "operator family %s for access method %s" msgstr "アクセスメソッド%2$sの演算子族%1$s" @@ -5095,7 +5095,7 @@ msgstr "遷移関数がSTRICTかつ遷移用の型が入力型とバイナリ互 msgid "return type of inverse transition function %s is not %s" msgstr "逆遷移関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3008 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約の前進と反転の遷移関数のSTRICT属性は一致している必要があります" @@ -5723,7 +5723,7 @@ msgstr "\"%s\"の複範囲型の作成中に失敗しました。" msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "\"multirange_type_name\"属性で複範囲型の型名を手動で指定することができます。" -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:530 storage/buffer/bufmgr.c:1145 #, c-format msgid "invalid page in block %u of relation %s" msgstr "リレーション%2$sのブロック%1$uに不正なページ" @@ -5818,82 +5818,82 @@ msgstr "パラメータ\"parallel\"はSAVE、RESTRICTEDまたはUNSAFEのいず msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE でなくてはなりません" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:87 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" msgstr "イベントトリガ\"%s\"はすでに存在します" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"はすでに存在します" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "サーバー\"%s\"はすでに存在します" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:96 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "言語\"%s\"はすでに存在します" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:99 commands/publicationcmds.c:771 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:101 commands/subscriptioncmds.c:657 +#: commands/alter.c:102 commands/subscriptioncmds.c:657 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" -#: commands/alter.c:124 +#: commands/alter.c:125 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "変換\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/alter.c:128 +#: commands/alter.c:129 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "統計情報オブジェクト\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/alter.c:132 +#: commands/alter.c:133 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索パーサ\"%s\"はすでにスキーマ\"%s\"存在します" -#: commands/alter.c:136 +#: commands/alter.c:137 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索辞書\"%s\"はすでにスキーマ\"%s\"存在します" -#: commands/alter.c:140 +#: commands/alter.c:141 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索テンプレート\"%s\"はすでにスキーマ\"%s\"存在します" -#: commands/alter.c:144 +#: commands/alter.c:145 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索設定\"%s\"はすでにスキーマ\"%s\"存在します" -#: commands/alter.c:217 +#: commands/alter.c:218 #, c-format msgid "must be superuser to rename %s" msgstr "%sの名前を変更するにはスーパーユーザーである必要があります" -#: commands/alter.c:259 commands/subscriptioncmds.c:636 commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 commands/subscriptioncmds.c:1837 +#: commands/alter.c:260 commands/subscriptioncmds.c:636 commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 commands/subscriptioncmds.c:1837 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=falseはスーパーユーザーのみ可能です" -#: commands/alter.c:260 commands/subscriptioncmds.c:637 commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 commands/subscriptioncmds.c:1838 +#: commands/alter.c:261 commands/subscriptioncmds.c:637 commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 commands/subscriptioncmds.c:1838 #, c-format msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." msgstr "password_requiredオプションがfalseに設定されたサブスクリプションはスーパーユーザのみ作成と変更が可能です。" -#: commands/alter.c:775 +#: commands/alter.c:776 #, c-format msgid "must be superuser to set schema of %s" msgstr "%sのスキーマを設定するにはスーパーユーザーである必要があります" @@ -5913,7 +5913,7 @@ msgstr "アクセスメソッドを作成するにはスーパーユーザーで msgid "access method \"%s\" already exists" msgstr "アクセスメソッド\"%s\"は存在しません" -#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:846 commands/opclasscmds.c:376 commands/opclasscmds.c:834 #, c-format msgid "access method \"%s\" does not exist" msgstr "アクセスメソッド\"%s\"は存在しません" @@ -6102,7 +6102,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:7952 replication/pgoutput/pgoutput.c:309 replication/pgoutput/pgoutput.c:332 replication/pgoutput/pgoutput.c:346 replication/pgoutput/pgoutput.c:356 replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 replication/pgoutput/pgoutput.c:386 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:7952 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 #, c-format msgid "conflicting or redundant options" msgstr "競合するオプション、あるいは余計なオプションがあります" @@ -6211,7 +6211,7 @@ msgstr "コマンド\"%s\"を実行できませんでした: %m" msgid "no usable system locales were found" msgstr "使用できるシステムロケールが見つかりません" -#: commands/comment.c:61 commands/dbcommands.c:1614 commands/dbcommands.c:1832 commands/dbcommands.c:1944 commands/dbcommands.c:2142 commands/dbcommands.c:2382 commands/dbcommands.c:2475 commands/dbcommands.c:2588 commands/dbcommands.c:3091 utils/init/postinit.c:1021 utils/init/postinit.c:1085 utils/init/postinit.c:1157 +#: commands/comment.c:61 commands/dbcommands.c:1614 commands/dbcommands.c:1832 commands/dbcommands.c:1944 commands/dbcommands.c:2142 commands/dbcommands.c:2382 commands/dbcommands.c:2475 commands/dbcommands.c:2588 commands/dbcommands.c:3091 utils/init/postinit.c:1023 utils/init/postinit.c:1087 utils/init/postinit.c:1159 #, c-format msgid "database \"%s\" does not exist" msgstr "データベース\"%s\"は存在しません" @@ -6481,7 +6481,7 @@ msgstr "列\"%s\"は生成カラムです" msgid "Generated columns cannot be used in COPY." msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:842 commands/indexcmds.c:1886 commands/statscmds.c:242 commands/tablecmds.c:2419 commands/tablecmds.c:3141 commands/tablecmds.c:3655 parser/parse_relation.c:3698 parser/parse_relation.c:3708 parser/parse_relation.c:3726 parser/parse_relation.c:3733 parser/parse_relation.c:3747 utils/adt/tsvector_op.c:2855 +#: commands/copy.c:842 commands/indexcmds.c:1893 commands/statscmds.c:242 commands/tablecmds.c:2419 commands/tablecmds.c:3141 commands/tablecmds.c:3655 parser/parse_relation.c:3698 parser/parse_relation.c:3708 parser/parse_relation.c:3726 parser/parse_relation.c:3733 parser/parse_relation.c:3747 utils/adt/tsvector_op.c:2855 #, c-format msgid "column \"%s\" does not exist" msgstr "列\"%s\"は存在しません" @@ -6926,7 +6926,7 @@ msgstr "テンプレートデータベース\"%s\"は存在しません" msgid "cannot use invalid database \"%s\" as template" msgstr "無効なデータベース\"%s\"はテンプレートとして使用できません" -#: commands/dbcommands.c:988 commands/dbcommands.c:2393 utils/init/postinit.c:1100 +#: commands/dbcommands.c:988 commands/dbcommands.c:2393 utils/init/postinit.c:1102 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "DROP DATABASEを使用して無効なデータベースを削除してください。" @@ -8267,292 +8267,292 @@ msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "プロシージャには %d 個以上の引数を渡すことはできません" -#: commands/indexcmds.c:640 +#: commands/indexcmds.c:647 #, c-format msgid "must specify at least one column" msgstr "少なくとも1つの列を指定しなければなりません" -#: commands/indexcmds.c:644 +#: commands/indexcmds.c:651 #, c-format msgid "cannot use more than %d columns in an index" msgstr "インデックスには%dを超える列を使用できません" -#: commands/indexcmds.c:687 +#: commands/indexcmds.c:694 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "リレーション\"%s\"のインデックスを作成できません" -#: commands/indexcmds.c:713 +#: commands/indexcmds.c:720 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/indexcmds.c:718 +#: commands/indexcmds.c:725 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"には排他制約を作成できません" -#: commands/indexcmds.c:728 +#: commands/indexcmds.c:735 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対するインデックスを作成できません" -#: commands/indexcmds.c:766 commands/tablecmds.c:802 commands/tablespace.c:1184 +#: commands/indexcmds.c:773 commands/tablecmds.c:802 commands/tablespace.c:1184 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "パーティション親リレーションにはデフォルトテーブル空間は指定できません" -#: commands/indexcmds.c:798 commands/tablecmds.c:833 commands/tablecmds.c:3435 +#: commands/indexcmds.c:805 commands/tablecmds.c:833 commands/tablecmds.c:3435 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "共有リレーションのみをpg_globalテーブル空間に格納することができます" -#: commands/indexcmds.c:831 +#: commands/indexcmds.c:838 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "古いメソッド\"rtree\"をアクセスメソッド\"gist\"に置換しています" -#: commands/indexcmds.c:852 +#: commands/indexcmds.c:859 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "アクセスメソッド\"%s\"では一意性インデックスをサポートしていません" -#: commands/indexcmds.c:857 +#: commands/indexcmds.c:864 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "アクセスメソッド\"%s\"では包含列をサポートしていません" -#: commands/indexcmds.c:862 +#: commands/indexcmds.c:869 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "アクセスメソッド\"%s\"は複数列インデックスをサポートしません" -#: commands/indexcmds.c:867 +#: commands/indexcmds.c:874 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "アクセスメソッド\"%s\"は排除制約をサポートしていません" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1001 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "パーティションキーはアクセスメソッド\"%s\"を使っているインデックスには適合させられません" -#: commands/indexcmds.c:1004 +#: commands/indexcmds.c:1011 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "パーティションキー定義では %s 制約はサポートしていません" -#: commands/indexcmds.c:1006 +#: commands/indexcmds.c:1013 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約はパーティションキーが式を含む場合は使用できません" -#: commands/indexcmds.c:1048 +#: commands/indexcmds.c:1055 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "パーティション親テーブル上のユニーク制約はすべてのパーティショニング列を含まなければなりません" -#: commands/indexcmds.c:1049 +#: commands/indexcmds.c:1056 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "テーブル\"%2$s\"上の%1$s制約にパーティションキーの一部である列\"%3$s\"が含まれていません。" -#: commands/indexcmds.c:1068 commands/indexcmds.c:1087 +#: commands/indexcmds.c:1075 commands/indexcmds.c:1094 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列へのインデックス作成はサポートされていません" -#: commands/indexcmds.c:1316 tcop/utility.c:1526 +#: commands/indexcmds.c:1323 tcop/utility.c:1526 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"にはユニークインデックスを構築できません" -#: commands/indexcmds.c:1318 tcop/utility.c:1528 +#: commands/indexcmds.c:1325 tcop/utility.c:1528 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "テーブル\"%s\"は外部テーブルを子テーブルとして含んでいます" -#: commands/indexcmds.c:1803 +#: commands/indexcmds.c:1810 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1881 parser/parse_utilcmd.c:2557 parser/parse_utilcmd.c:2692 +#: commands/indexcmds.c:1888 parser/parse_utilcmd.c:2557 parser/parse_utilcmd.c:2692 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーとして指名された列\"%s\"は存在しません" -#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:1845 +#: commands/indexcmds.c:1912 parser/parse_utilcmd.c:1845 #, c-format msgid "expressions are not supported in included columns" msgstr "包含列では式はサポートされません" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1953 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "式インデックスの関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:1968 #, c-format msgid "including column does not support a collation" msgstr "包含列は照合順序をサポートしません" -#: commands/indexcmds.c:1965 +#: commands/indexcmds.c:1972 #, c-format msgid "including column does not support an operator class" msgstr "包含列は演算子クラスをサポートしません" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1976 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包含列は ASC/DESC オプションをサポートしません" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1980 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません" -#: commands/indexcmds.c:2014 +#: commands/indexcmds.c:2021 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:2022 commands/tablecmds.c:17718 commands/typecmds.c:807 parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3801 utils/adt/misc.c:586 +#: 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 utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされません" -#: commands/indexcmds.c:2087 +#: commands/indexcmds.c:2094 #, c-format msgid "operator %s is not commutative" msgstr "演算子 %s は可換ではありません" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2096 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "排除制約で使えるのは可換演算子だけです" -#: commands/indexcmds.c:2115 +#: commands/indexcmds.c:2122 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "演算子%sは演算子族\"%s\"のメンバーではありません" -#: commands/indexcmds.c:2118 +#: commands/indexcmds.c:2125 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "この排除に使用する演算子はこの制約に使用するインデックス演算子に関連付けられている必要があります。" -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2160 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポートしません" -#: commands/indexcmds.c:2158 +#: commands/indexcmds.c:2165 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:2204 commands/tablecmds.c:17743 commands/tablecmds.c:17749 commands/typecmds.c:2301 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17743 commands/tablecmds.c:17749 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" -#: commands/indexcmds.c:2206 +#: commands/indexcmds.c:2213 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "このインデックスの演算子クラスを指定するか、あるいはこのデータ型のデフォルト演算子クラスを定義しなければなりません。" -#: commands/indexcmds.c:2235 commands/indexcmds.c:2243 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2242 commands/indexcmds.c:2250 commands/opclasscmds.c:206 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子クラス\"%1$s\"は存在しません" -#: commands/indexcmds.c:2257 commands/typecmds.c:2289 +#: commands/indexcmds.c:2264 commands/typecmds.c:2289 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算子クラス\"%s\"はデータ型%sを受け付けません" -#: commands/indexcmds.c:2347 +#: commands/indexcmds.c:2354 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sには複数のデフォルトの演算子クラスがあります" -#: commands/indexcmds.c:2675 +#: commands/indexcmds.c:2682 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "認識できないREINDEXのオプション \"%s\"" -#: commands/indexcmds.c:2899 +#: commands/indexcmds.c:2906 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"には並行インデックス再作成が可能なインデックスがありません" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2920 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"には再構築すべきインデックスはありません" -#: commands/indexcmds.c:2958 commands/indexcmds.c:3468 commands/indexcmds.c:3596 +#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 commands/indexcmds.c:3603 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログではインデックスの並行再構築はできません" -#: commands/indexcmds.c:2981 +#: commands/indexcmds.c:2988 #, c-format msgid "can only reindex the currently open database" msgstr "現在オープンしているデータベースのみをインデックス再構築することができます" -#: commands/indexcmds.c:3075 +#: commands/indexcmds.c:3082 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: commands/indexcmds.c:3108 +#: commands/indexcmds.c:3115 #, c-format msgid "cannot move system relations, skipping all" msgstr "システムリレーションは移動できません、すべてスキップします" -#: commands/indexcmds.c:3154 +#: commands/indexcmds.c:3161 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3157 +#: commands/indexcmds.c:3164 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3348 commands/indexcmds.c:4204 +#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" -#: commands/indexcmds.c:3500 commands/indexcmds.c:3552 +#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "無効なインデックス \"%s.%s\"の並行再構築はできません、スキップします " -#: commands/indexcmds.c:3506 +#: commands/indexcmds.c:3513 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"を並行再構築することはできません、スキップします " -#: commands/indexcmds.c:3661 +#: commands/indexcmds.c:3668 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "このタイプのリレーションでインデックス並列再構築はできません" -#: commands/indexcmds.c:3682 +#: commands/indexcmds.c:3689 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:4185 commands/indexcmds.c:4197 +#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/indexcmds.c:4187 commands/indexcmds.c:4206 +#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 #, c-format msgid "%s." msgstr "%s。" @@ -8592,222 +8592,222 @@ msgstr "実体化ビュー\"%s\"に対する新しいデータにはNULL列を msgid "Row: %s" msgstr "行: %s" -#: commands/opclasscmds.c:124 +#: commands/opclasscmds.c:125 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子族\"%1$s\"は存在しません" -#: commands/opclasscmds.c:267 +#: commands/opclasscmds.c:268 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"はすでに存在します" -#: commands/opclasscmds.c:416 +#: commands/opclasscmds.c:417 #, c-format msgid "must be superuser to create an operator class" msgstr "演算子クラスを作成するにはスーパーユーザーである必要があります" -#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 commands/opclasscmds.c:1056 +#: commands/opclasscmds.c:494 commands/opclasscmds.c:911 commands/opclasscmds.c:1057 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "演算子番号%dが不正です。1から%dまででなければなりません" -#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 commands/opclasscmds.c:1072 +#: commands/opclasscmds.c:539 commands/opclasscmds.c:961 commands/opclasscmds.c:1073 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "演算子番号%dが不正です、1と%dの間でなければなりません" -#: commands/opclasscmds.c:567 +#: commands/opclasscmds.c:568 #, c-format msgid "storage type specified more than once" msgstr "格納型が複数指定されました" -#: commands/opclasscmds.c:594 +#: commands/opclasscmds.c:595 #, c-format msgid "storage type cannot be different from data type for access method \"%s\"" msgstr "アクセスメソッド\"%s\"用のデータ型と異なる格納型を使用できません" -#: commands/opclasscmds.c:610 +#: commands/opclasscmds.c:611 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"はすでに存在します" -#: commands/opclasscmds.c:638 +#: commands/opclasscmds.c:639 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "演算子クラス\"%s\"を型%sのデフォルトにすることができませんでした" -#: commands/opclasscmds.c:641 +#: commands/opclasscmds.c:642 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "演算子クラス\"%s\"はすでにデフォルトです。" -#: commands/opclasscmds.c:801 +#: commands/opclasscmds.c:802 #, c-format msgid "must be superuser to create an operator family" msgstr "演算子族を作成するにはスーパーユーザーである必要があります" -#: commands/opclasscmds.c:861 +#: commands/opclasscmds.c:862 #, c-format msgid "must be superuser to alter an operator family" msgstr "演算子族を更新するにはスーパーユーザーである必要があります" -#: commands/opclasscmds.c:919 +#: commands/opclasscmds.c:920 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "ALTER OPERATOR FAMILYでは演算子の引数型の指定が必要です" -#: commands/opclasscmds.c:994 +#: commands/opclasscmds.c:995 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "ALTER OPERATOR FAMILYではSTORAGEを指定できません" -#: commands/opclasscmds.c:1128 +#: commands/opclasscmds.c:1129 #, c-format msgid "one or two argument types must be specified" msgstr "1または2つの引数型が指定する必要があります" -#: commands/opclasscmds.c:1154 +#: commands/opclasscmds.c:1155 #, c-format msgid "index operators must be binary" msgstr "インデックス演算子は二項演算子でなければなりません" -#: commands/opclasscmds.c:1173 +#: commands/opclasscmds.c:1174 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "アクセスメソッド\"%s\"は並べ替え演算子をサポートしていません" -#: commands/opclasscmds.c:1184 +#: commands/opclasscmds.c:1185 #, c-format msgid "index search operators must return boolean" msgstr "インデックス検索演算子はブール型を返す必要があります" -#: commands/opclasscmds.c:1224 +#: commands/opclasscmds.c:1225 #, c-format msgid "associated data types for operator class options parsing functions must match opclass input type" msgstr "演算子クラスのパース関数に対応するデータ型は演算子クラスの入力型と一致している必要があります" -#: commands/opclasscmds.c:1231 +#: commands/opclasscmds.c:1232 #, c-format msgid "left and right associated data types for operator class options parsing functions must match" msgstr "演算子クラスオプションのパース関数の左右辺の対応するデータ型は一致している必要があります" -#: commands/opclasscmds.c:1239 +#: commands/opclasscmds.c:1240 #, c-format msgid "invalid operator class options parsing function" msgstr "不正な演算子クラスオプションのパース関数" -#: commands/opclasscmds.c:1240 +#: commands/opclasscmds.c:1241 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "演算子クラスオプションのパース関数の正しいシグネチャは %s です。" -#: commands/opclasscmds.c:1259 +#: commands/opclasscmds.c:1260 #, c-format msgid "btree comparison functions must have two arguments" msgstr "btree比較関数は2つの引数を取る必要があります" -#: commands/opclasscmds.c:1263 +#: commands/opclasscmds.c:1264 #, c-format msgid "btree comparison functions must return integer" msgstr "btree比較関数は整数を返さなければなりません" -#: commands/opclasscmds.c:1280 +#: commands/opclasscmds.c:1281 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "btreeソートサポート関数は\"internal\"型を取らなければなりません" -#: commands/opclasscmds.c:1284 +#: commands/opclasscmds.c:1285 #, c-format msgid "btree sort support functions must return void" msgstr "btreeソートサポート関数はvoidを返さなければなりません" -#: commands/opclasscmds.c:1295 +#: commands/opclasscmds.c:1296 #, c-format msgid "btree in_range functions must have five arguments" msgstr "btree in_range 関数は5つの引数を取る必要があります" -#: commands/opclasscmds.c:1299 +#: commands/opclasscmds.c:1300 #, c-format msgid "btree in_range functions must return boolean" msgstr "btree in_range 関数はブール型を返す必要があります" -#: commands/opclasscmds.c:1315 +#: commands/opclasscmds.c:1316 #, c-format msgid "btree equal image functions must have one argument" msgstr "btreeの equal image 関数は1つの引数を取る必要があります" -#: commands/opclasscmds.c:1319 +#: commands/opclasscmds.c:1320 #, c-format msgid "btree equal image functions must return boolean" msgstr "btreeの euqal image 関数はブール型を返す必要があります" -#: commands/opclasscmds.c:1332 +#: commands/opclasscmds.c:1333 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "btreeの equal image 関数は同じ型の引数を取る必要があります" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1343 #, c-format msgid "hash function 1 must have one argument" msgstr "ハッシュ関数1は引数を1つ取る必要があります" -#: commands/opclasscmds.c:1346 +#: commands/opclasscmds.c:1347 #, c-format msgid "hash function 1 must return integer" msgstr "ハッシュ関数1は整数を返す必要があります" -#: commands/opclasscmds.c:1353 +#: commands/opclasscmds.c:1354 #, c-format msgid "hash function 2 must have two arguments" msgstr "ハッシュ関数2は2つの引数を取る必要があります" -#: commands/opclasscmds.c:1357 +#: commands/opclasscmds.c:1358 #, c-format msgid "hash function 2 must return bigint" msgstr "ハッシュ関数2は bigint を返す必要があります" -#: commands/opclasscmds.c:1382 +#: commands/opclasscmds.c:1383 #, c-format msgid "associated data types must be specified for index support function" msgstr "インデックスサポート関数に対して関連データ型を指定する必要があります" -#: commands/opclasscmds.c:1407 +#: commands/opclasscmds.c:1408 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "(%2$s,%3$s)に対応する演算子番号%1$dが複数あります" -#: commands/opclasscmds.c:1414 +#: commands/opclasscmds.c:1415 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "(%2$s,%3$s)用の演算子番号%1$dが複数あります" -#: commands/opclasscmds.c:1460 +#: commands/opclasscmds.c:1461 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "演算子%d(%s,%s)はすでに演算子族\"%s\"に存在します" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1590 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "関数%d(%s,%s)はすでに演算子族\"%s\"内に存在します" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1745 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "演算子%d(%s,%s)は演算子族\"%s\"内にありません" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1785 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "関数%d(%s,%s)は演算子族\"%s\"内に存在しません" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1816 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子クラス\"%1$s\"はスキーマ\"%3$s\"内にすでに存在します" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1839 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子族\"%1$s\"はスキーマ\"%3$s\"内にすでに存在します" @@ -8957,7 +8957,7 @@ msgstr "準備された文\"%s\"は存在しません" msgid "must be superuser to create custom procedural language" msgstr "手続き言語を生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 postmaster/postmaster.c:1306 storage/file/fd.c:3911 utils/init/miscinit.c:1822 +#: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 postmaster/postmaster.c:1306 storage/file/fd.c:3911 utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "パラメータ\"%s\"のリスト構文が不正です" @@ -9397,7 +9397,7 @@ msgstr "統計情報オブジェクト\"%s.%s\"は存在しません、スキッ msgid "unrecognized subscription parameter: \"%s\"" msgstr "認識できないサブスクリプションパラメータ: \"%s\"" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:395 +#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:402 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "識別できないoriginの値: \"%s\"" @@ -9562,7 +9562,7 @@ msgstr[0] "作成中のサブスクリプションは他のサブスクリプシ msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "発行元テーブルからコピーされた初期データが異なる基点からのものでないことを確認してください。" -#: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:893 replication/pgoutput/pgoutput.c:1112 +#: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:893 replication/pgoutput/pgoutput.c:1138 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "テーブル\"%s.%s\"に対して、異なるパブリケーションで異なる列リストを使用することはできません" @@ -9659,7 +9659,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:19292 parser/parse_utilcmd.c:2289 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19318 parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" @@ -9816,7 +9816,7 @@ msgstr "複数の継承される列\"%s\"の定義をマージしています" msgid "inherited column \"%s\" has a type conflict" msgstr "継承される列\"%s\"の型が競合しています" -#: commands/tablecmds.c:2613 commands/tablecmds.c:2642 commands/tablecmds.c:2661 commands/tablecmds.c:2933 commands/tablecmds.c:2969 commands/tablecmds.c:2985 parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 parser/parse_param.c:223 +#: commands/tablecmds.c:2613 commands/tablecmds.c:2642 commands/tablecmds.c:2661 commands/tablecmds.c:2933 commands/tablecmds.c:2969 commands/tablecmds.c:2985 parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 parser/parse_param.c:223 #, c-format msgid "%s versus %s" msgstr "%s対%s" @@ -10459,7 +10459,7 @@ msgstr "型付けされたテーブルの列の型を変更できません" msgid "cannot specify USING when altering type of generated column" msgstr "生成列の型変更の際にはUSINGを指定することはできません" -#: commands/tablecmds.c:12446 commands/tablecmds.c:17561 commands/tablecmds.c:17651 commands/trigger.c:663 rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:972 +#: commands/tablecmds.c:12446 commands/tablecmds.c:17561 commands/tablecmds.c:17651 commands/trigger.c:663 rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" @@ -10980,52 +10980,52 @@ msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENT msgid "partition \"%s\" was removed concurrently" msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:19326 commands/tablecmds.c:19346 commands/tablecmds.c:19367 commands/tablecmds.c:19386 commands/tablecmds.c:19428 +#: commands/tablecmds.c:19352 commands/tablecmds.c:19372 commands/tablecmds.c:19393 commands/tablecmds.c:19412 commands/tablecmds.c:19454 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:19329 +#: commands/tablecmds.c:19355 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:19349 +#: commands/tablecmds.c:19375 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:19370 +#: commands/tablecmds.c:19396 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:19389 +#: commands/tablecmds.c:19415 #, 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:19431 +#: commands/tablecmds.c:19457 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:19667 +#: commands/tablecmds.c:19693 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:19674 +#: commands/tablecmds.c:19700 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効な圧縮方式\"%s\"" -#: commands/tablecmds.c:19700 +#: commands/tablecmds.c:19726 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:19710 +#: commands/tablecmds.c:19736 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" @@ -11405,17 +11405,17 @@ msgstr "更新が同時に行われたためアクセスの直列化ができま msgid "could not serialize access due to concurrent delete" msgstr "削除が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:4608 +#: commands/trigger.c:4606 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "セキュリティー制限操作中は、遅延トリガーは発火させられません" -#: commands/trigger.c:5789 +#: commands/trigger.c:5787 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "制約\"%s\"は遅延可能ではありません" -#: commands/trigger.c:5812 +#: commands/trigger.c:5810 #, c-format msgid "constraint \"%s\" does not exist" msgstr "制約\"%s\"は存在しません" @@ -11926,8 +11926,8 @@ msgstr "他のロールのパスワードを変更するには、現在のユー #: commands/user.c:826 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "ロール\"%2$s\"に対する%1$sオプションを持つロールのみがメンバを追加することができます。" +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "ロール\"%2$s\"に対する%1$sオプションを持つロールのみがメンバの追加および削除をすることができます。" #: commands/user.c:871 #, c-format @@ -11959,7 +11959,7 @@ msgstr "%s属性および削除対象ロールに対する%sオプションを msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE で特殊ロールの識別子は使えません" -#: commands/user.c:1136 commands/user.c:1358 commands/variable.c:836 commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 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/regproc.c:1551 utils/init/miscinit.c:756 +#: 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/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" msgstr "ロール\"%s\"は存在しません" @@ -12416,32 +12416,42 @@ msgstr "現在は\"client_encoding\"を変更できません。" msgid "cannot change client_encoding during a parallel operation" msgstr "並列処理中は\"client_encoding\"を変更できません" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "セッション権限を\"%s\"に設定しようとしていますが、これは許可されません" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "セッション権限を\"%s\"に設定することは許可されていません" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "ロール\"%s\"を設定する権限がありません" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "ロール\"%s\"を設定する権限がありません" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "このビルドでは bonjour はサポートされていません" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() をもたないプラットフォームではeffective_io_concurrencyは0に設定する必要があります。" -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() をもたないプラットフォームではmaintenance_io_concurrencyは0に設定する必要があります。" -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "このインストレーションではSSLはサポートされていません" @@ -12531,17 +12541,17 @@ msgstr "カーソル\"%s\"は行上に位置していません" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"はテーブル\"%s\"を単純な更新可能スキャンではありません" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2510 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "パラメータの型%d(%s)が実行計画(%s)を準備する時点と一致しません" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2522 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 executor/execExprInterp.c:4350 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:205 executor/nodeModifyTable.c:216 executor/nodeModifyTable.c:233 executor/nodeModifyTable.c:241 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" @@ -12556,7 +12566,7 @@ msgstr "問い合わせの列が多すぎます" msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:651 executor/execExprInterp.c:4252 executor/nodeModifyTable.c:217 +#: executor/execExpr.c:651 executor/execExprInterp.c:4264 executor/nodeModifyTable.c:217 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" @@ -12566,110 +12576,110 @@ msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせ msgid "window function calls cannot be nested" msgstr "ウィンドウ関数の呼び出しを入れ子にすることはできません" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1626 #, c-format msgid "target type is not an array" msgstr "対象型は配列ではありません" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1966 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()列の型が%2$sではなく%1$sです" -#: executor/execExpr.c:2576 executor/execSRF.c:719 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1032 +#: executor/execExpr.c:2584 executor/execSRF.c:719 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1032 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "関数に%dを超える引数を渡せません" -#: executor/execExpr.c:2603 executor/execSRF.c:739 executor/functions.c:1068 utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#: executor/execExpr.c:2611 executor/execSRF.c:739 executor/functions.c:1068 utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "このコンテキストで集合値の関数は集合を受け付けられません" -#: executor/execExpr.c:3009 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3017 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "添字をサポートしないため、型%sには添字をつけられません" -#: executor/execExpr.c:3137 executor/execExpr.c:3159 +#: executor/execExpr.c:3145 executor/execExpr.c:3167 #, c-format msgid "type %s does not support subscripted assignment" msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:1974 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:1980 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 executor/execExprInterp.c:3150 +#: executor/execExprInterp.c:1982 executor/execExprInterp.c:3116 executor/execExprInterp.c:3162 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルの型は%sですが、問い合わせでは%sを想定しています。" -#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 utils/fmgr/funcapi.c:569 +#: executor/execExprInterp.c:2062 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "型%sは複合型ではありません" -#: executor/execExprInterp.c:2588 +#: executor/execExprInterp.c:2600 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2813 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:2802 +#: executor/execExprInterp.c:2814 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "要素型%sの配列を要素型%sのARRAY式に含められません" -#: executor/execExprInterp.c:2823 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/arraysubs.c:488 +#: 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/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "配列の次数(%d)が上限(%d)を超えています" -#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 +#: executor/execExprInterp.c:2855 executor/execExprInterp.c:2890 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 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 +#: executor/execExprInterp.c:2867 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 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/arrayutils.c:107 utils/adt/arrayutils.c:114 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "配列の次数が上限(%d)を超えています" -#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:3115 executor/execExprInterp.c:3161 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3747 utils/adt/domains.c:155 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sはnull値を許しません" -#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3762 utils/adt/domains.c:193 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sの値が検査制約\"%s\"に違反しています" -#: executor/execExprInterp.c:4235 +#: executor/execExprInterp.c:4247 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "テーブル行には%d属性ありますが、問い合わせでは%dを想定しています。" -#: executor/execExprInterp.c:4351 executor/execSRF.c:978 +#: executor/execExprInterp.c:4363 executor/execSRF.c:978 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "序数位置%dの削除された属性における物理格納形式が一致しません。" @@ -12709,167 +12719,167 @@ msgstr "キー %s が既存のキー %s と競合しています" msgid "Key conflicts with existing key." msgstr "キーが既存のキーと衝突しています" -#: executor/execMain.c:1045 +#: executor/execMain.c:1037 #, c-format msgid "cannot change sequence \"%s\"" msgstr "シーケンス\"%s\"を変更できません" -#: executor/execMain.c:1051 +#: executor/execMain.c:1043 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOASTリレーション\"%s\"を変更できません" -#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3092 rewrite/rewriteHandler.c:3990 +#: executor/execMain.c:1061 rewrite/rewriteHandler.c:3125 rewrite/rewriteHandler.c:4023 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3095 rewrite/rewriteHandler.c:3993 +#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3128 rewrite/rewriteHandler.c:4026 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "ビューへの挿入を可能にするために、INSTEAD OF INSERTトリガまたは無条件のON INSERT DO INSTEADルールを作成してください。" -#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3100 rewrite/rewriteHandler.c:3998 +#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3133 rewrite/rewriteHandler.c:4031 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3103 rewrite/rewriteHandler.c:4001 +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3136 rewrite/rewriteHandler.c:4034 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "ビューへの更新を可能にするために、INSTEAD OF UPDATEトリガまたは無条件のON UPDATE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1085 rewrite/rewriteHandler.c:3108 rewrite/rewriteHandler.c:4006 +#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3141 rewrite/rewriteHandler.c:4039 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: executor/execMain.c:1087 rewrite/rewriteHandler.c:3111 rewrite/rewriteHandler.c:4009 +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3144 rewrite/rewriteHandler.c:4042 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "ビューからの削除を可能にするために、INSTEAD OF DELETEトリガまたは無条件のON DELETE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1098 +#: executor/execMain.c:1090 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "実体化ビュー\"%s\"を変更できません" -#: executor/execMain.c:1110 +#: executor/execMain.c:1102 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "外部テーブル\"%s\"への挿入ができません" -#: executor/execMain.c:1116 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "外部テーブル\"%s\"は挿入を許しません" -#: executor/execMain.c:1123 +#: executor/execMain.c:1115 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "外部テーブル \"%s\"の更新ができません" -#: executor/execMain.c:1129 +#: executor/execMain.c:1121 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "外部テーブル\"%s\"は更新を許しません" -#: executor/execMain.c:1136 +#: executor/execMain.c:1128 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "外部テーブル\"%s\"からの削除ができません" -#: executor/execMain.c:1142 +#: executor/execMain.c:1134 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "外部テーブル\"%s\"は削除を許しません" -#: executor/execMain.c:1153 +#: executor/execMain.c:1145 #, c-format msgid "cannot change relation \"%s\"" msgstr "リレーション\"%s\"を変更できません" -#: executor/execMain.c:1180 +#: executor/execMain.c:1172 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "シーケンス\"%s\"では行のロックはできません" -#: executor/execMain.c:1187 +#: executor/execMain.c:1179 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "TOAST リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1194 +#: executor/execMain.c:1186 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1202 +#: executor/execMain.c:1194 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "実体化ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1211 executor/execMain.c:2716 executor/nodeLockRows.c:135 +#: executor/execMain.c:1203 executor/execMain.c:2711 executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "外部テーブル\"%s\"では行のロックはできません" -#: executor/execMain.c:1217 +#: executor/execMain.c:1209 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1930 +#: executor/execMain.c:1925 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "リレーション\"%s\"の新しい行はパーティション制約に違反しています" -#: executor/execMain.c:1932 executor/execMain.c:2016 executor/execMain.c:2067 executor/execMain.c:2177 +#: executor/execMain.c:1927 executor/execMain.c:2011 executor/execMain.c:2062 executor/execMain.c:2172 #, c-format msgid "Failing row contains %s." msgstr "失敗した行は%sを含みます" -#: executor/execMain.c:2013 +#: executor/execMain.c:2008 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "リレーション\"%2$s\"の列\"%1$s\"のNULL値が非NULL制約に違反しています" -#: executor/execMain.c:2065 +#: executor/execMain.c:2060 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "リレーション\"%s\"の新しい行は検査制約\"%s\"に違反しています" -#: executor/execMain.c:2175 +#: executor/execMain.c:2170 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "新しい行はビュー\"%s\"のチェックオプションに違反しています" -#: executor/execMain.c:2185 +#: executor/execMain.c:2180 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "新しい行はテーブル\"%2$s\"行レベルセキュリティポリシ\"%1$s\"に違反しています" -#: executor/execMain.c:2190 +#: executor/execMain.c:2185 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシに違反しています" -#: executor/execMain.c:2198 +#: executor/execMain.c:2193 #, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "ターゲットの行はテーブル\"%s\"の行レベルセキュリティポリシ\"%s\"(USING式)に違反しています" -#: executor/execMain.c:2203 +#: executor/execMain.c:2198 #, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "ターゲットの行はテーブル\"%s\"の行レベルセキュリティポリシ(USING式)に違反しています" -#: executor/execMain.c:2210 +#: executor/execMain.c:2205 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "新しい行はテーブル\"%1$s\"の行レベルセキュリティポリシ\"%2$s\"(USING式)に違反しています" -#: executor/execMain.c:2215 +#: executor/execMain.c:2210 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシ(USING式)に違反しています" @@ -13082,7 +13092,7 @@ msgstr "最後のステートメントが返す列が少なすぎます。" msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2992 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" @@ -13253,7 +13263,7 @@ msgstr "フレームの終了オフセットは NULL であってはなりませ msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2908 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" @@ -15485,12 +15495,12 @@ msgstr "メッセージ内の文字列が不正です" msgid "invalid message format" msgstr "メッセージの書式が不正です" -#: main/main.c:235 +#: main/main.c:237 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartupが失敗しました: %d\n" -#: main/main.c:329 +#: main/main.c:331 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -15499,7 +15509,7 @@ msgstr "" "%sはPostgreSQLサーバーです\n" "\n" -#: main/main.c:330 +#: main/main.c:332 #, c-format msgid "" "Usage:\n" @@ -15510,107 +15520,107 @@ msgstr "" " %s [オプション]...\n" "\n" -#: main/main.c:331 +#: main/main.c:333 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: main/main.c:332 +#: main/main.c:334 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS 共有バッファの数\n" -#: main/main.c:333 +#: main/main.c:335 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE 実行時パラメータの設定\n" -#: main/main.c:334 +#: main/main.c:336 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME 実行時パラメータの値を表示し、終了\n" -#: main/main.c:335 +#: main/main.c:337 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 デバッグレベル\n" -#: main/main.c:336 +#: main/main.c:338 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR データベースディレクトリ\n" -#: main/main.c:337 +#: main/main.c:339 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e ヨーロッパ式の日付フォーマットでの入力(DMY)\n" -#: main/main.c:338 +#: main/main.c:340 #, c-format msgid " -F turn fsync off\n" msgstr " -F fsyncを無効にする\n" -#: main/main.c:339 +#: main/main.c:341 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME 接続を待ち受けるホスト名またはIPアドレス\n" -#: main/main.c:340 +#: main/main.c:342 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i TCP/IP接続を有効にする (非推奨)\n" -#: main/main.c:341 +#: main/main.c:343 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY Unixドメインソケットの場所\n" -#: main/main.c:343 +#: main/main.c:345 #, c-format msgid " -l enable SSL connections\n" msgstr " -l SSL接続を有効にする\n" -#: main/main.c:345 +#: main/main.c:347 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT 許容する最大接続数\n" -#: main/main.c:346 +#: main/main.c:348 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 接続を待ち受けるポート番号\n" -#: main/main.c:347 +#: main/main.c:349 #, c-format msgid " -s show statistics after each query\n" msgstr " -s 各問い合わせの後に統計情報を表示\n" -#: main/main.c:348 +#: main/main.c:350 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM ソート用のメモリ量 (KB単位)\n" -#: main/main.c:349 +#: main/main.c:351 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示し、終了\n" -#: main/main.c:350 +#: main/main.c:352 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE 実行時パラメータを設定\n" -#: main/main.c:351 +#: main/main.c:353 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config 設定パラメータの説明を出力し、終了\n" -#: main/main.c:352 +#: main/main.c:354 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示し、終了\n" -#: main/main.c:354 +#: main/main.c:356 #, c-format msgid "" "\n" @@ -15619,39 +15629,39 @@ msgstr "" "\n" "開発者向けオプション:\n" -#: main/main.c:355 +#: main/main.c:357 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h いくつかのプランタイプを禁止\n" -#: main/main.c:356 +#: main/main.c:358 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O システムテーブル構造の変更を許可\n" -#: main/main.c:357 +#: main/main.c:359 #, c-format msgid " -P disable system indexes\n" msgstr " -P システムインデックスを無効にする\n" -#: main/main.c:358 +#: main/main.c:360 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex 各問い合わせの後に時間情報を表示\n" -#: main/main.c:359 +#: main/main.c:361 #, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr "" " -T ひとつのバックエンドプロセスが異常停止した時に全ての\n" " バックエンドプロセスにSIGABRTを送信\n" -#: main/main.c:360 +#: main/main.c:362 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM デバッガをアタッチできるようにNUM秒待機\n" -#: main/main.c:362 +#: main/main.c:364 #, c-format msgid "" "\n" @@ -15660,39 +15670,39 @@ msgstr "" "\n" "シングルユーザーモード用のオプション:\n" -#: main/main.c:363 +#: main/main.c:365 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" " --single シングルユーザーモードを選択(最初の引数でなければ\n" " なりません)\n" -#: main/main.c:364 +#: main/main.c:366 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME データベース名 (デフォルトはユーザー名)\n" -#: main/main.c:365 +#: main/main.c:367 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 デバッグレベルを上書き\n" -#: main/main.c:366 +#: main/main.c:368 #, c-format msgid " -E echo statement before execution\n" msgstr " -E 実行前に文を表示\n" -#: main/main.c:367 +#: main/main.c:369 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j 対話式問い合わせの区切りとして改行を使用しない\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:370 main/main.c:376 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILENAME 標準出力と標準エラー出力を指定したファイルに出力\n" -#: main/main.c:370 +#: main/main.c:372 #, c-format msgid "" "\n" @@ -15701,22 +15711,22 @@ msgstr "" "\n" "初期起動用のオプション:\n" -#: main/main.c:371 +#: main/main.c:373 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot 初期起動モードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:372 +#: main/main.c:374 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check チェックモードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:373 +#: main/main.c:375 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME データベース名 (初期起動モードでは必須の引数)\n" -#: main/main.c:376 +#: main/main.c:378 #, c-format msgid "" "\n" @@ -15732,12 +15742,12 @@ msgstr "" "\n" "不具合は<%s>まで報告してください。\n" -#: main/main.c:380 +#: main/main.c:382 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: main/main.c:391 +#: main/main.c:393 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15750,12 +15760,12 @@ msgstr "" "する必要があります。適切なサーバーの起動方法に関する詳細はドキュメントを\n" "参照してください\n" -#: main/main.c:408 +#: main/main.c:410 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: 実ユーザーIDと実効ユーザーIDは一致しなければなりません\n" -#: main/main.c:415 +#: main/main.c:417 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15789,7 +15799,7 @@ msgstr "リレーション\"%s\"は複合型を持っていません" msgid "unrecognized JSON encoding: %s" msgstr "不明なJSON符号化方式: \"%s\"" -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:669 +#: 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 utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "データ型%sの配列型がありませんでした" @@ -15831,7 +15841,7 @@ msgstr "UNION/INTERSECT/EXCEPTでは%sを使用できません" 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:1053 +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4037 optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "一部のデータ型がハッシュのみをサポートする一方で、別の型はソートのみをサポートしています。" @@ -15872,7 +15882,7 @@ msgid "All column datatypes must be hashable." msgstr "すべての列のデータ型はハッシュ可能でなければなりません。" #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1051 #, c-format msgid "could not implement %s" msgstr "%sを実行できませんでした" @@ -16754,113 +16764,113 @@ msgid "argument of %s must not return a set" msgstr "%sの引数は集合を返してはなりません" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%sの型%sと%sを一致させることができません" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "引数の型%sと%sは合致させられません" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%sで型%sから%sへ変換できませんでした" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "\"%s\"と宣言された引数が全て同じでありません" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:600 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%sと宣言された引数が配列ではなく%s型です" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:614 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%sと宣言された引数が範囲型ではなく型%sです" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "%sと宣言された引数が複範囲型ではなく型%sです" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\"型の引数の要素型を決定できません" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "%sと宣言された引数と%sと宣言された引数とで整合性がありません" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "入力型が%sであったため多様型が特定できませんでした" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayと照合されたは配列型です: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "anyenumと照合された型は列挙型ではありません: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "anycompatible系の引数を共通の型にキャストできません" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "入力型が%2$sであるため多様型%1$sが特定できませんでした" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange型%sはanycompatiblerange型%sと合致しません" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirange型%sはanycompatible型%sと合致しません" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "anycompatiblenonarrayに対応する型が配列型です: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "%s型の返却値にはanyrangeまたはanymultirange型の入力が最低でも一つ必要です。" -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "%s型の返却値には少なくとも一つのanycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "%s型の返却値には少なくとも一つのanyelement、anyarray、anynonarray、anyenum、anyrange またはanymultirange型の入力が必要です。" -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "%s型の返却値には少なくとも一つのanycompatible、anycompatiblearray、anycompatiblenonarray、anycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "internal型の返却値には少なくとも1つのinternal型の入力が必要です。" @@ -18192,7 +18202,7 @@ msgstr "ルールのWHERE条件に他のリレーションへの参照を持た msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "ルールのWHERE条件はSELECT、INSERT、UPDATE、DELETE動作のみを持つことができます" -#: parser/parse_utilcmd.c:3174 parser/parse_utilcmd.c:3275 rewrite/rewriteHandler.c:540 rewrite/rewriteManip.c:1087 +#: parser/parse_utilcmd.c:3174 parser/parse_utilcmd.c:3275 rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1088 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "条件付きのUNION/INTERSECT/EXCEPT文は実装されていません" @@ -18502,12 +18512,12 @@ msgstr "このプラットフォームではヒュージページをサポート msgid "huge pages not supported with the current shared_memory_type setting" msgstr "ヒュージページは現在のshared_memory_typeの設定ではサポートされません" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1358 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1402 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "既存の共有メモリブロック(キー%lu、ID %lu)がまだ使用中です" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1360 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1404 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "データディレクトリ \"%s\". に対応する古いサーバープロセスをすべて終了させてください。" @@ -18670,32 +18680,32 @@ msgstr "自動VACUUMワーカーの起動に時間がかかりすぎています msgid "could not fork autovacuum worker process: %m" msgstr "自動VACUUMワーカープロセスをforkできませんでした: %m" -#: postmaster/autovacuum.c:2353 +#: postmaster/autovacuum.c:2355 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立した一時テーブル\"%s.%s.%s\"を削除します" -#: postmaster/autovacuum.c:2589 +#: postmaster/autovacuum.c:2591 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動VACUUM" -#: postmaster/autovacuum.c:2592 +#: postmaster/autovacuum.c:2594 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE" -#: postmaster/autovacuum.c:2786 +#: postmaster/autovacuum.c:2788 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"の作業エントリを処理しています" -#: postmaster/autovacuum.c:3400 +#: postmaster/autovacuum.c:3402 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定のため自動VACUUMが起動できません" -#: postmaster/autovacuum.c:3401 +#: postmaster/autovacuum.c:3403 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効にしてください。" @@ -18923,32 +18933,32 @@ msgstr "%s: 外部PIDファイル\"%s\"に書き出せませんでした: %s\n" msgid "could not load %s" msgstr "%s\"をロードできませんでした" -#: postmaster/postmaster.c:1434 +#: postmaster/postmaster.c:1436 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動値処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1435 +#: postmaster/postmaster.c:1437 postmaster/postmaster.c:5062 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用可能なロケールに設定してください。" -#: postmaster/postmaster.c:1536 +#: postmaster/postmaster.c:1538 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: 自身の実行ファイルのパスが特定できません" -#: postmaster/postmaster.c:1543 +#: postmaster/postmaster.c:1545 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1566 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1568 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "これは、PostgreSQLのインストールが不完全であるかまたは、ファイル\"%s\"が本来の場所からなくなってしまったことを示しています。" -#: postmaster/postmaster.c:1593 +#: postmaster/postmaster.c:1595 #, c-format msgid "" "%s: could not find the database system\n" @@ -18960,456 +18970,456 @@ msgstr "" "ファイル\"%s\"をオープンできませんでした: %s\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1890 +#: postmaster/postmaster.c:1892 #, c-format msgid "issuing %s to recalcitrant children" msgstr "手に負えない子プロセスに%sを送出します" -#: postmaster/postmaster.c:1912 +#: postmaster/postmaster.c:1914 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:1987 postmaster/postmaster.c:2015 +#: postmaster/postmaster.c:1989 postmaster/postmaster.c:2017 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2032 +#: postmaster/postmaster.c:2001 postmaster/postmaster.c:2034 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: postmaster/postmaster.c:2061 +#: postmaster/postmaster.c:2063 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2079 +#: postmaster/postmaster.c:2081 #, c-format msgid "received unencrypted data after SSL request" msgstr "SSL要求の後に非暗号化データを受信しました" -#: postmaster/postmaster.c:2080 postmaster/postmaster.c:2124 +#: postmaster/postmaster.c:2082 postmaster/postmaster.c:2126 #, c-format msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." msgstr "これはクライアントソフトウェアのバグであるか、man-in-the-middle攻撃の証左である可能性があります。" -#: postmaster/postmaster.c:2105 +#: postmaster/postmaster.c:2107 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2123 +#: postmaster/postmaster.c:2125 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" -#: postmaster/postmaster.c:2147 +#: postmaster/postmaster.c:2149 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "フロントエンドプロトコル%u.%uをサポートしていません: サーバーは%u.0から %u.%uまでをサポートします" -#: postmaster/postmaster.c:2214 +#: postmaster/postmaster.c:2216 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "有効な値: \"false\", 0, \"true\", 1, \"database\"。" -#: postmaster/postmaster.c:2255 +#: postmaster/postmaster.c:2257 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: postmaster/postmaster.c:2272 +#: postmaster/postmaster.c:2274 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザー名は存在しません" -#: postmaster/postmaster.c:2336 +#: postmaster/postmaster.c:2338 #, c-format msgid "the database system is starting up" msgstr "データベースシステムは起動処理中です" -#: postmaster/postmaster.c:2342 +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is not yet accepting connections" msgstr "データベースシステムはまだ接続を受け付けていません" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2345 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "リカバリの一貫性はまだ確保されていません。" -#: postmaster/postmaster.c:2347 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is not accepting connections" msgstr "データベースシステムは接続を受け付けていません" -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2350 #, c-format msgid "Hot standby mode is disabled." msgstr "ホットスタンバイモードは無効です。" -#: postmaster/postmaster.c:2353 +#: postmaster/postmaster.c:2355 #, c-format msgid "the database system is shutting down" msgstr "データベースシステムはシャットダウンしています" -#: postmaster/postmaster.c:2358 +#: postmaster/postmaster.c:2360 #, c-format msgid "the database system is in recovery mode" msgstr "データベースシステムはリカバリモードです" -#: postmaster/postmaster.c:2363 storage/ipc/procarray.c:491 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 +#: postmaster/postmaster.c:2365 storage/ipc/procarray.c:491 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 #, c-format msgid "sorry, too many clients already" msgstr "現在クライアント数が多すぎます" -#: postmaster/postmaster.c:2450 +#: postmaster/postmaster.c:2452 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" -#: postmaster/postmaster.c:2462 +#: postmaster/postmaster.c:2464 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" -#: postmaster/postmaster.c:2729 +#: postmaster/postmaster.c:2730 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2753 postmaster/postmaster.c:2757 +#: postmaster/postmaster.c:2754 postmaster/postmaster.c:2758 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2767 +#: postmaster/postmaster.c:2768 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2857 +#: postmaster/postmaster.c:2858 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2898 +#: postmaster/postmaster.c:2899 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2916 +#: postmaster/postmaster.c:2917 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2940 +#: postmaster/postmaster.c:2941 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:3016 +#: postmaster/postmaster.c:3017 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:3034 postmaster/postmaster.c:3070 +#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:3037 +#: postmaster/postmaster.c:3038 #, c-format msgid "aborting startup due to startup process failure" msgstr "起動プロセスの失敗のため起動を中断しています" -#: postmaster/postmaster.c:3110 +#: postmaster/postmaster.c:3111 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:3131 +#: postmaster/postmaster.c:3132 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:3178 +#: postmaster/postmaster.c:3179 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:3194 +#: postmaster/postmaster.c:3195 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:3209 +#: postmaster/postmaster.c:3210 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:3224 +#: postmaster/postmaster.c:3225 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:3242 +#: postmaster/postmaster.c:3243 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:3255 +#: postmaster/postmaster.c:3256 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:3312 +#: postmaster/postmaster.c:3313 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカー\"%s\"" -#: postmaster/postmaster.c:3391 postmaster/postmaster.c:3411 postmaster/postmaster.c:3418 postmaster/postmaster.c:3436 +#: postmaster/postmaster.c:3392 postmaster/postmaster.c:3412 postmaster/postmaster.c:3419 postmaster/postmaster.c:3437 msgid "server process" msgstr "サーバープロセス" -#: postmaster/postmaster.c:3490 +#: postmaster/postmaster.c:3491 #, c-format msgid "terminating any other active server processes" msgstr "他の活動中のサーバープロセスを終了しています" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3665 +#: postmaster/postmaster.c:3666 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)は終了コード%dで終了しました" -#: postmaster/postmaster.c:3667 postmaster/postmaster.c:3679 postmaster/postmaster.c:3689 postmaster/postmaster.c:3700 +#: postmaster/postmaster.c:3668 postmaster/postmaster.c:3680 postmaster/postmaster.c:3690 postmaster/postmaster.c:3701 #, c-format msgid "Failed process was running: %s" msgstr "失敗したプロセスが実行していました: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3676 +#: postmaster/postmaster.c:3677 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d)は例外%Xで終了しました" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3686 +#: postmaster/postmaster.c:3687 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d)はシグナル%dで終了しました: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3698 +#: postmaster/postmaster.c:3699 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3906 +#: postmaster/postmaster.c:3907 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:3932 +#: postmaster/postmaster.c:3933 #, c-format msgid "shutting down due to startup process failure" msgstr "起動プロセスの失敗のためシャットダウンしています" -#: postmaster/postmaster.c:3938 +#: postmaster/postmaster.c:3939 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "restart_after_crashがoffであるためシャットダウンします" -#: postmaster/postmaster.c:3950 +#: postmaster/postmaster.c:3951 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバープロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:4144 postmaster/postmaster.c:5462 postmaster/postmaster.c:5860 +#: postmaster/postmaster.c:4145 postmaster/postmaster.c:5464 postmaster/postmaster.c:5862 #, c-format msgid "could not generate random cancel key" msgstr "ランダムなキャンセルキーを生成できませんでした" -#: postmaster/postmaster.c:4206 +#: postmaster/postmaster.c:4207 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4248 +#: postmaster/postmaster.c:4249 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:4354 +#: postmaster/postmaster.c:4355 #, c-format msgid "connection received: host=%s port=%s" msgstr "接続を受け付けました: ホスト=%s ポート番号=%s" -#: postmaster/postmaster.c:4359 +#: postmaster/postmaster.c:4360 #, c-format msgid "connection received: host=%s" msgstr "接続を受け付けました: ホスト=%s" -#: postmaster/postmaster.c:4596 +#: postmaster/postmaster.c:4597 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "サーバープロセス\"%s\"を実行できませんでした: %m" -#: postmaster/postmaster.c:4654 +#: postmaster/postmaster.c:4655 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "バックエンドパラメータファイルのファイルマッピングを作成できませんでした: エラーコード%lu" -#: postmaster/postmaster.c:4663 +#: postmaster/postmaster.c:4664 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "バックエンドパラメータのメモリをマップできませんでした: エラーコード %lu" -#: postmaster/postmaster.c:4690 +#: postmaster/postmaster.c:4691 #, c-format msgid "subprocess command line too long" msgstr "サブプロセスのコマンドラインが長すぎます" -#: postmaster/postmaster.c:4708 +#: postmaster/postmaster.c:4709 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "CreateProcess() の呼び出しが失敗しました: %m (エラーコード %lu)" -#: postmaster/postmaster.c:4735 +#: postmaster/postmaster.c:4736 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "バックエンドパラメータファイルのビューをアンマップできませんでした: エラーコード %lu" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4740 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "バックエンドパラメータファイルのハンドルをクローズできませんでした: エラーコード%lu" -#: postmaster/postmaster.c:4761 +#: postmaster/postmaster.c:4762 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "共有メモリの確保のリトライ回数が多すぎるため中断します" -#: postmaster/postmaster.c:4762 +#: postmaster/postmaster.c:4763 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "これはASLRまたはアンチウイルスソフトウェアが原因である可能性があります。" -#: postmaster/postmaster.c:4935 +#: postmaster/postmaster.c:4936 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL構成は子プロセスでは読み込めません" -#: postmaster/postmaster.c:5060 +#: postmaster/postmaster.c:5061 #, c-format -msgid "Please report this to <%s>." -msgstr "これを<%s>まで報告してください。" +msgid "postmaster became multithreaded" +msgstr "postmasterがマルチスレッド動作になっています" -#: postmaster/postmaster.c:5128 +#: postmaster/postmaster.c:5130 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:5386 +#: postmaster/postmaster.c:5388 #, c-format msgid "could not fork startup process: %m" msgstr "起動プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5390 +#: postmaster/postmaster.c:5392 #, c-format msgid "could not fork archiver process: %m" msgstr "アーカイバプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5394 +#: postmaster/postmaster.c:5396 #, c-format msgid "could not fork background writer process: %m" msgstr "バックグランドライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5398 +#: postmaster/postmaster.c:5400 #, c-format msgid "could not fork checkpointer process: %m" msgstr "チェックポイント処理プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5402 +#: postmaster/postmaster.c:5404 #, c-format msgid "could not fork WAL writer process: %m" msgstr "WALライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5406 +#: postmaster/postmaster.c:5408 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "WAL 受信プロセスを fork できませんでした: %m" -#: postmaster/postmaster.c:5410 +#: postmaster/postmaster.c:5412 #, c-format msgid "could not fork process: %m" msgstr "プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5611 postmaster/postmaster.c:5638 +#: postmaster/postmaster.c:5613 postmaster/postmaster.c:5640 #, c-format msgid "database connection requirement not indicated during registration" msgstr "登録時にデータベース接続の必要性が示されていません" -#: postmaster/postmaster.c:5622 postmaster/postmaster.c:5649 +#: postmaster/postmaster.c:5624 postmaster/postmaster.c:5651 #, c-format msgid "invalid processing mode in background worker" msgstr "バックグラウンドワーカー内の不正な処理モード" -#: postmaster/postmaster.c:5734 +#: postmaster/postmaster.c:5736 #, c-format msgid "could not fork worker process: %m" msgstr "ワーカープロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5846 +#: postmaster/postmaster.c:5848 #, c-format msgid "no slot available for new worker process" msgstr "新しいワーカープロセスに割り当て可能なスロットがありません" -#: postmaster/postmaster.c:6177 +#: postmaster/postmaster.c:6179 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "バックエンドで使用するためにソケット%dを複製できませんでした: エラーコード %d" -#: postmaster/postmaster.c:6209 +#: postmaster/postmaster.c:6211 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "継承したソケットを作成できませんでした: エラーコード %d\n" -#: postmaster/postmaster.c:6238 +#: postmaster/postmaster.c:6240 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"をオープンできませんでした: %s\n" -#: postmaster/postmaster.c:6245 +#: postmaster/postmaster.c:6247 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"から読み取れませんでした: %s\n" -#: postmaster/postmaster.c:6254 +#: postmaster/postmaster.c:6256 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "ファイル\"%s\"を削除できませんでした: %s\n" -#: postmaster/postmaster.c:6271 +#: postmaster/postmaster.c:6273 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6280 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをアンマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6287 +#: postmaster/postmaster.c:6289 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "バックエンドパラメータ変数のハンドルをクローズできませんでした: エラーコード%lu\n" -#: postmaster/postmaster.c:6446 +#: postmaster/postmaster.c:6448 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:6488 +#: postmaster/postmaster.c:6490 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" @@ -20187,57 +20197,57 @@ msgstr "レプリケーション起点\"%1$s\"のリモートデータ処理中 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\"のリモートからのデータを処理中" -#: replication/pgoutput/pgoutput.c:317 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "invalid proto_version" msgstr "不正なproto_version" -#: replication/pgoutput/pgoutput.c:322 +#: replication/pgoutput/pgoutput.c:329 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\"は範囲外です" -#: replication/pgoutput/pgoutput.c:339 +#: replication/pgoutput/pgoutput.c:346 #, c-format msgid "invalid publication_names syntax" msgstr "publication_namesの構文が不正です" -#: replication/pgoutput/pgoutput.c:440 +#: replication/pgoutput/pgoutput.c:466 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or lower" msgstr "クライアントが proto_version=%d を送信してきましたが、サーバーはバージョン%d以下のプロトコルのみしかサポートしていません" -#: replication/pgoutput/pgoutput.c:446 +#: replication/pgoutput/pgoutput.c:472 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or higher" msgstr "クライアントが proto_version=%d を送信してきましたが、サーバーはバージョン%d以上のプロトコルのみしかサポートしていません" -#: replication/pgoutput/pgoutput.c:452 +#: replication/pgoutput/pgoutput.c:478 #, c-format msgid "publication_names parameter missing" msgstr "publication_namesパラメータが指定されていません" -#: replication/pgoutput/pgoutput.c:466 +#: replication/pgoutput/pgoutput.c:492 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "要求されたproto_version=%dではストリーミングをサポートしていません、%d以上が必要です" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:498 #, c-format msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" msgstr "要求された proto_version=%d は並列ストリーミングをサポートしません、%d以上である必要があります" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:503 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "ストリーミングが要求されましたが、出力プラグインでサポートされていません" -#: replication/pgoutput/pgoutput.c:494 +#: replication/pgoutput/pgoutput.c:520 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "要求されたproto_version=%dは2相コミットをサポートしていません、%d以上が必要です" -#: replication/pgoutput/pgoutput.c:499 +#: replication/pgoutput/pgoutput.c:525 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "2相コミットが要求されました、しかし出力プラグインではサポートされていません" @@ -20553,7 +20563,7 @@ msgstr "WALファイルセグメント%sのオフセット%u、長さ%luの書 msgid "cannot use %s with a logical replication slot" msgstr "%sは論理レプリケーションスロットでは使用できません" -#: replication/walsender.c:623 storage/smgr/md.c:1529 +#: replication/walsender.c:623 storage/smgr/md.c:1541 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "ファイル\"%s\"の終端へシークできませんでした: %m" @@ -20844,216 +20854,216 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません" msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールの名前を変更することはできません" -#: rewrite/rewriteHandler.c:584 +#: rewrite/rewriteHandler.c:590 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH の問い合わせ名\"%s\"が、ルールのアクションと書き換えられようとしている問い合わせの両方に現れています" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:617 #, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "INSERT ... SELECTルールのアクションはWITHにデータ更新文を持つ問い合わせに対してはサポートされません" -#: rewrite/rewriteHandler.c:664 +#: rewrite/rewriteHandler.c:670 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールではRETURNINGリストを持つことはできません" -#: rewrite/rewriteHandler.c:896 rewrite/rewriteHandler.c:935 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:941 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "列\"%s\"への非デフォルト値の挿入はできません" -#: rewrite/rewriteHandler.c:898 rewrite/rewriteHandler.c:964 +#: rewrite/rewriteHandler.c:904 rewrite/rewriteHandler.c:970 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "列\"%s\"は GENERATED ALWAYS として定義されています。" -#: rewrite/rewriteHandler.c:900 +#: rewrite/rewriteHandler.c:906 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定することで挿入を強制できます。" -#: rewrite/rewriteHandler.c:962 rewrite/rewriteHandler.c:970 +#: rewrite/rewriteHandler.c:968 rewrite/rewriteHandler.c:976 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "列\"%s\"はDEFAULTにのみ更新可能です" -#: rewrite/rewriteHandler.c:1117 rewrite/rewriteHandler.c:1135 +#: rewrite/rewriteHandler.c:1111 rewrite/rewriteHandler.c:1129 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:1749 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:1733 rewrite/rewriteHandler.c:3158 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "非システムのビュー\"%s\"へのアクセスは制限されています" -#: rewrite/rewriteHandler.c:2128 rewrite/rewriteHandler.c:4064 +#: rewrite/rewriteHandler.c:2131 rewrite/rewriteHandler.c:4097 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2213 +#: rewrite/rewriteHandler.c:2236 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2566 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2538 +#: rewrite/rewriteHandler.c:2571 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2541 +#: rewrite/rewriteHandler.c:2574 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2577 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2638 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2641 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2644 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2614 +#: rewrite/rewriteHandler.c:2647 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2617 +#: rewrite/rewriteHandler.c:2650 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2620 +#: rewrite/rewriteHandler.c:2653 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2665 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2635 +#: rewrite/rewriteHandler.c:2668 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2638 +#: rewrite/rewriteHandler.c:2671 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2645 rewrite/rewriteHandler.c:2649 rewrite/rewriteHandler.c:2657 +#: rewrite/rewriteHandler.c:2678 rewrite/rewriteHandler.c:2682 rewrite/rewriteHandler.c:2690 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "単一のテーブルまたはビューからselectしていないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2660 +#: rewrite/rewriteHandler.c:2693 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2684 +#: rewrite/rewriteHandler.c:2717 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3185 +#: rewrite/rewriteHandler.c:3218 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3193 +#: rewrite/rewriteHandler.c:3226 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3691 +#: rewrite/rewriteHandler.c:3724 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTIFYルールはWITH内のデータ更新文に対してはサポートされません" -#: rewrite/rewriteHandler.c:3702 +#: rewrite/rewriteHandler.c:3735 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO INSTEAD NOTHING ルールはサポートされません" -#: rewrite/rewriteHandler.c:3716 +#: rewrite/rewriteHandler.c:3749 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は、条件付き DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3720 +#: rewrite/rewriteHandler.c:3753 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO ALSO ルールはサポートされません" -#: rewrite/rewriteHandler.c:3725 +#: rewrite/rewriteHandler.c:3758 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合はマルチステートメントの DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3992 rewrite/rewriteHandler.c:4000 rewrite/rewriteHandler.c:4008 +#: rewrite/rewriteHandler.c:4025 rewrite/rewriteHandler.c:4033 rewrite/rewriteHandler.c:4041 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:4113 +#: rewrite/rewriteHandler.c:4146 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4115 +#: rewrite/rewriteHandler.c:4148 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON INSERT DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:4120 +#: rewrite/rewriteHandler.c:4153 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4122 +#: rewrite/rewriteHandler.c:4155 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON UPDATE DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:4127 +#: rewrite/rewriteHandler.c:4160 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4129 +#: rewrite/rewriteHandler.c:4162 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNING句を持つ無条件のON DELETE DO INSTEADルールが必要です。" -#: rewrite/rewriteHandler.c:4147 +#: rewrite/rewriteHandler.c:4180 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "ON CONFLICT句を伴うINSERTは、INSERTまたはUPDATEルールを持つテーブルでは使えません" -#: rewrite/rewriteHandler.c:4204 +#: rewrite/rewriteHandler.c:4237 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数問い合わせに対するルールにより書き換えられた問い合わせでは WITH を使用できません" -#: rewrite/rewriteManip.c:1075 +#: rewrite/rewriteManip.c:1076 #, c-format msgid "conditional utility statements are not implemented" msgstr "条件付きのユーティリティ文は実装されていません" -#: rewrite/rewriteManip.c:1422 +#: rewrite/rewriteManip.c:1423 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "ビューに対するWHERE CURRENT OFは実装されていません" -#: rewrite/rewriteManip.c:1757 +#: rewrite/rewriteManip.c:1759 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "ON UPDATE ルールのNEW変数は、対象のUPDATEコマンドでの複数列代入の一部となる列を参照することはできません" @@ -21298,7 +21308,7 @@ msgstr "BufFile \"%s\"の一時ファイル\"%s\"のサイズの確認に失敗 msgid "could not delete fileset \"%s\": %m" msgstr "ファイルセット\"%s\"を削除できませんでした: %m" -#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1041 +#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1043 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "ファイル\"%s\"の切り詰め処理ができませんでした: %m" @@ -21992,22 +22002,22 @@ msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "ファイル\"%2$s\"のブロック%1$uを書き込めませんでした: %4$dバイト中%3$dバイト分のみ書き込みました" -#: storage/smgr/md.c:1012 +#: storage/smgr/md.c:1014 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "ファイル\"%s\"を%uブロックに切り詰められませんでした: 現在は%uブロックのみとなりました" -#: storage/smgr/md.c:1067 +#: storage/smgr/md.c:1069 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "ファイル\"%s\"を%uブロックに切り詰められませんでした: %m" -#: storage/smgr/md.c:1494 +#: storage/smgr/md.c:1506 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "ファイル\"%s\"(対象ブロック%u)をオープンできませんでした: 直前のセグメントは%uブロックだけでした" -#: storage/smgr/md.c:1508 +#: storage/smgr/md.c:1520 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "ファイル \"%s\"(対象ブロック %u)をオープンできませんでした: %m" @@ -22378,12 +22388,12 @@ msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザー=% msgid "bind message has %d result formats but query has %d columns" msgstr "バインドメッセージは%dの結果書式がありましたが、問い合わせは%d列でした" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "カーゾルは前方へのスキャンしかできません" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "後方スキャンを有効にするためにはSCROLLオプションを付けて宣言してください。" @@ -22684,27 +22694,27 @@ msgstr "不正な統計情報種別: \"%s\"" msgid "could not open temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1450 +#: utils/activity/pgstat.c:1458 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" -#: utils/activity/pgstat.c:1459 +#: utils/activity/pgstat.c:1467 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" -#: utils/activity/pgstat.c:1467 +#: utils/activity/pgstat.c:1475 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: utils/activity/pgstat.c:1516 +#: utils/activity/pgstat.c:1524 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1678 +#: utils/activity/pgstat.c:1686 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "統計情報ファイル\"%s\"が破損しています" @@ -24959,7 +24969,7 @@ 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:6633 utils/misc/guc.c:6667 +#: 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 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "パラメータ\"%s\"の値が無効です: %d" @@ -24995,7 +25005,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:10097 utils/adt/ruleutils.c:10310 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10103 utils/adt/ruleutils.c:10316 #, c-format msgid "too many arguments" msgstr "引数が多すぎます" @@ -26128,182 +26138,177 @@ msgstr "列の別名が提供されていませんでした" msgid "could not determine row description for function returning record" msgstr "レコードを返す関数についての行定義を特定できませんでした" -#: utils/init/miscinit.c:346 +#: utils/init/miscinit.c:347 #, c-format msgid "data directory \"%s\" does not exist" msgstr "データディレクトリ\"%s\"は存在しません" -#: utils/init/miscinit.c:351 +#: utils/init/miscinit.c:352 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: utils/init/miscinit.c:359 +#: utils/init/miscinit.c:360 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "指定されたデータディレクトリ\"%s\"はディレクトリではありません" -#: utils/init/miscinit.c:375 +#: utils/init/miscinit.c:376 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "データディレクトリ\"%s\"の所有者情報が間違っています" -#: utils/init/miscinit.c:377 +#: utils/init/miscinit.c:378 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "データディレクトリを所有するユーザーがサーバーを起動しなければなりません。" -#: utils/init/miscinit.c:395 +#: utils/init/miscinit.c:396 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "データディレクトリ\"%s\"の権限設定が不正です" -#: utils/init/miscinit.c:397 +#: utils/init/miscinit.c:398 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "権限は u=rwx(0700) または u=rwx,g=rx (0750) でなければなりません。" -#: utils/init/miscinit.c:455 +#: utils/init/miscinit.c:456 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: utils/init/miscinit.c:692 utils/misc/guc.c:3563 +#: utils/init/miscinit.c:726 utils/misc/guc.c:3563 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "セキュリティー制限操作内でパラメーター\"%s\"を設定できません" -#: utils/init/miscinit.c:764 +#: utils/init/miscinit.c:809 #, c-format msgid "role with OID %u does not exist" msgstr "OID が %u であるロールは存在しません" -#: utils/init/miscinit.c:794 +#: utils/init/miscinit.c:854 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "ロール\"%s\"はログインが許可されません" -#: utils/init/miscinit.c:812 +#: utils/init/miscinit.c:875 #, c-format msgid "too many connections for role \"%s\"" msgstr "ロール\"%s\"からの接続が多すぎます" -#: utils/init/miscinit.c:919 -#, c-format -msgid "permission denied to set session authorization" -msgstr "set session authorization用の権限がありません" - -#: utils/init/miscinit.c:1002 +#: utils/init/miscinit.c:1046 #, c-format msgid "invalid role OID: %u" msgstr "不正なロールID: %u" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1193 #, c-format msgid "database system is shut down" msgstr "データベースシステムはシャットダウンしました" -#: utils/init/miscinit.c:1236 +#: utils/init/miscinit.c:1280 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を作成できませんでした: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1294 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: utils/init/miscinit.c:1257 +#: utils/init/miscinit.c:1301 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を読み取れませんでした: %m" -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1310 #, c-format msgid "lock file \"%s\" is empty" msgstr "ロックファイル\"%s\"が空です" -#: utils/init/miscinit.c:1267 +#: utils/init/miscinit.c:1311 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "他のサーバーが稼働しているか、前回のサーバー起動失敗のためロックファイルが残っているかのいずれかです" -#: utils/init/miscinit.c:1311 +#: utils/init/miscinit.c:1355 #, c-format msgid "lock file \"%s\" already exists" msgstr "ロックファイル\"%s\"はすでに存在します" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1359 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "他のpostgres(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1317 +#: utils/init/miscinit.c:1361 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "他のpostmaster(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1320 +#: utils/init/miscinit.c:1364 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "他のpostgres(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1322 +#: utils/init/miscinit.c:1366 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "他のpostmaster(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1373 +#: utils/init/miscinit.c:1417 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "古いロックファイル\"%s\"を削除できませんでした: %m" -#: utils/init/miscinit.c:1375 +#: utils/init/miscinit.c:1419 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "このファイルは偶然残ってしまったようですが、削除できませんでした。手作業でこれを削除し再実行してください。" -#: utils/init/miscinit.c:1412 utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 +#: utils/init/miscinit.c:1456 utils/init/miscinit.c:1470 utils/init/miscinit.c:1481 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "ロックファイル\"%s\"に書き出せませんでした: %m" -#: utils/init/miscinit.c:1548 utils/init/miscinit.c:1690 utils/misc/guc.c:5603 +#: utils/init/miscinit.c:1592 utils/init/miscinit.c:1734 utils/misc/guc.c:5644 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"から読み取れませんでした: %m" -#: utils/init/miscinit.c:1678 +#: utils/init/miscinit.c:1722 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "ファイル\"%s\"をオープンできませんでした: %m; とりあえず続けます" -#: utils/init/miscinit.c:1703 +#: utils/init/miscinit.c:1747 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "ロックファイル\"%s\"が誤ったPIDをもっています: %ld、正しくは%ld" -#: utils/init/miscinit.c:1742 utils/init/miscinit.c:1758 +#: utils/init/miscinit.c:1786 utils/init/miscinit.c:1802 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\"は有効なデータディレクトリではありません" -#: utils/init/miscinit.c:1744 +#: utils/init/miscinit.c:1788 #, c-format msgid "File \"%s\" is missing." msgstr "ファイル\"%s\"が存在しません" -#: utils/init/miscinit.c:1760 +#: utils/init/miscinit.c:1804 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "ファイル\"%s\"に有効なデータがありません。" -#: utils/init/miscinit.c:1762 +#: utils/init/miscinit.c:1806 #, c-format msgid "You might need to initdb." msgstr "initdbする必要があるかもしれません" -#: utils/init/miscinit.c:1770 +#: utils/init/miscinit.c:1814 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "データディレクトリはPostgreSQLバージョン%sで初期化されましたが、これはバージョン%sとは互換性がありません" @@ -26376,97 +26381,97 @@ msgstr "データベース\"%s\"へのアクセスが拒否されました" msgid "User does not have CONNECT privilege." msgstr "ユーザーはCONNECT権限を持ちません。" -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "データベース\"%s\"への接続が多すぎます" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "データベースのロケールがオペレーティングシステムと互換性がありません" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "データベースは LC_COLLATE \"%s\"で初期化されていますが、setlocale() でこれを認識されません" -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "データベースを別のロケールで再生成するか、または不足しているロケールをインストールしてください" -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "データベースは LC_CTYPE \"%s\"で初期化されていますが、setlocale()でこれを認識されません" -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:478 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "データベース\"%s\"で照合順序バージョンの不一致が起きています" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:480 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "データベースは照合順序バージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:483 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "このデータベース内でデフォルトの照合順序を使用している全てのオブジェクトを再構築して、ALTER DATABASE %s REFRESH COLLATION VERSIONを実行するか、正しいバージョンのライブラリを用いてPostgreSQLをビルドしてください。" -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:894 #, c-format msgid "no roles are defined in this database system" msgstr "データベースシステム内でロールが定義されていません" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:895 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "すぐに CREATE USER \"%s\" SUPERUSER; を実行してください。" -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:931 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "バイナリアップグレードモード中に接続するにはスーパーユーザーである必要があります" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:951 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "残りの接続枠は%s属性を持つロールのために予約されています" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:957 #, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "残りの接続枠は\"%s\"ロールの権限を持つロールのために予約されています" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:969 #, c-format msgid "permission denied to start WAL sender" msgstr "WAL送信プロセスを開始する権限がありません" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:970 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "%s属性を持つロールのみがWAL送信プロセスを開始できます。" -#: utils/init/postinit.c:1086 +#: utils/init/postinit.c:1088 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "削除またはリネームされたばかりのようです。" -#: utils/init/postinit.c:1090 +#: utils/init/postinit.c:1092 #, c-format msgid "database %u does not exist" msgstr "データベース %u は存在しません" -#: utils/init/postinit.c:1099 +#: utils/init/postinit.c:1101 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "無効なデータベース\"%s\"への接続はできません" -#: utils/init/postinit.c:1159 +#: utils/init/postinit.c:1161 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "データベースのサブディレクトリ\"%s\"がありません。" @@ -26559,7 +26564,7 @@ msgstr "このパラメータの有効単位は \"us\"、\"ms\"、\"s\"、\"min\ msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "ファイル\"%2$s\"行%3$dで認識できない設定パラメータ\"%1$s\"" -#: utils/misc/guc.c:461 utils/misc/guc.c:3417 utils/misc/guc.c:3661 utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3981 utils/misc/guc.c:4084 +#: utils/misc/guc.c:461 utils/misc/guc.c:3417 utils/misc/guc.c:3661 utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3984 utils/misc/guc.c:4125 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "パラメータ\"%s\"を変更するにはサーバーの再起動が必要です" @@ -26683,7 +26688,7 @@ msgstr "%g%s%s はパラメータ\"%s\"の有効範囲 (%g .. %g) を超えて msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "パラメータ\"%s\"は並列操作中には設定できません" -#: utils/misc/guc.c:3394 utils/misc/guc.c:4545 +#: utils/misc/guc.c:3394 utils/misc/guc.c:4586 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "パラメータ\"%s\"を変更できません" @@ -26693,7 +26698,7 @@ msgstr "パラメータ\"%s\"を変更できません" msgid "parameter \"%s\" cannot be changed now" msgstr "現在パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4521 utils/misc/guc.c:6569 +#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 utils/misc/guc.c:6604 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "パラメータ\"%s\"を設定する権限がありません" @@ -26718,62 +26723,62 @@ msgstr "パラメータ\"%s\"は設定できません" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "パラメータ\"%s\"は関数内では変更できません" -#: utils/misc/guc.c:4227 utils/misc/guc.c:4274 utils/misc/guc.c:5288 +#: utils/misc/guc.c:4268 utils/misc/guc.c:4315 utils/misc/guc.c:5329 #, c-format msgid "permission denied to examine \"%s\"" msgstr "”%s\"を参照する権限がありません" -#: utils/misc/guc.c:4228 utils/misc/guc.c:4275 utils/misc/guc.c:5289 +#: utils/misc/guc.c:4269 utils/misc/guc.c:4316 utils/misc/guc.c:5330 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "\"%s\"ロールの権限を持つロールのみがこのパラメータを参照することができます。" -#: utils/misc/guc.c:4511 +#: utils/misc/guc.c:4552 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "ALTER SYSTEM RESET ALLを行う権限がありません" -#: utils/misc/guc.c:4577 +#: utils/misc/guc.c:4618 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "ALTER SYSTEMでのパラメータ値は改行を含んではいけません" -#: utils/misc/guc.c:4623 +#: utils/misc/guc.c:4664 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "ファイル\"%s\"の内容をパースできませんでした" -#: utils/misc/guc.c:4805 +#: utils/misc/guc.c:4846 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "パラメータ\"%s\"を再定義しようとしています" -#: utils/misc/guc.c:5144 +#: utils/misc/guc.c:5185 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "設定パラメータ名\"%s\"は不正です、削除します" -#: utils/misc/guc.c:5146 +#: utils/misc/guc.c:5187 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "\"%s\" は予約された接頭辞になりました。" -#: utils/misc/guc.c:6023 +#: utils/misc/guc.c:6058 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "パラメータ\"%s\"の\"%s\"への変更中" -#: utils/misc/guc.c:6192 +#: utils/misc/guc.c:6227 #, c-format msgid "parameter \"%s\" could not be set" msgstr "パラメータ\"%s\"を設定できません" -#: utils/misc/guc.c:6282 +#: utils/misc/guc.c:6317 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "パラメータ\"%s\"の設定をパースできません" -#: utils/misc/guc.c:6701 +#: utils/misc/guc.c:6736 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "パラメータ\"%s\"の値が無効です: %g" @@ -27351,8 +27356,8 @@ msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS は今後サポートされません; false のみに設定可能です。" #: utils/misc/guc_tables.c:1633 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "標準エラー出力、CSVログ、またはその両方をログファイルに捕捉するための子プロセスを開始します。" +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "標準エラー出力、CSVログ、および/またはJSONログをログファイルに記録するための子プロセスを開始します。" #: utils/misc/guc_tables.c:1642 msgid "Truncate existing log files of same name during log rotation." @@ -29005,3 +29010,6 @@ msgstr "読み取り専用のシリアライザブルトランザクションで #, c-format msgid "cannot import a snapshot from a different database" msgstr "異なるデータベースからのスナップショットを読み込むことはできません" + +#~ msgid "Please report this to <%s>." +#~ msgstr "これを<%s>まで報告してください。" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index f747479f905..8317bc75bec 100644 --- a/src/backend/po/ru.po +++ b/src/backend/po/ru.po @@ -4,14 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# Alexander Lakhin , 2012-2025. # Maxim Yablokov , 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-09 07:47+0300\n" -"PO-Revision-Date: 2024-11-02 08:34+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" +"PO-Revision-Date: 2025-02-08 08:50+0200\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -160,8 +160,8 @@ msgstr "" #: 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:4213 -#: access/transam/xlogrecovery.c:4316 access/transam/xlogutils.c:838 +#: 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 @@ -173,8 +173,8 @@ msgstr "" #: 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:1537 utils/init/miscinit.c:1671 -#: utils/init/miscinit.c:1748 utils/misc/guc.c:4615 utils/misc/guc.c:4665 +#: 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" @@ -183,7 +183,7 @@ msgstr "не удалось открыть файл \"%s\": %m" #: access/transam/twophase.c:1751 access/transam/twophase.c:1760 #: access/transam/xlog.c:8791 access/transam/xlogfuncs.c:708 #: backup/basebackup_server.c:175 backup/basebackup_server.c:268 -#: postmaster/postmaster.c:5573 postmaster/syslogger.c:1571 +#: postmaster/postmaster.c:5575 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 #: utils/cache/relmapper.c:948 #, c-format @@ -200,8 +200,8 @@ msgstr "не удалось записать файл \"%s\": %m" #: 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:1135 storage/smgr/md.c:1180 -#: storage/sync/sync.c:451 utils/misc/guc.c:4385 +#: 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\": %m" @@ -211,13 +211,13 @@ msgstr "не удалось синхронизировать с ФС файл \" #: ../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:269 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1412 +#: ../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:2537 postmaster/postmaster.c:4130 -#: postmaster/postmaster.c:5498 postmaster/postmaster.c:5869 +#: 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 @@ -230,7 +230,7 @@ msgstr "не удалось синхронизировать с ФС файл \" #: 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:4363 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 +#: 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 @@ -277,16 +277,16 @@ msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "не удалось преобразовать относительный путь \"%s\" в абсолютный: %m" #: ../common/exec.c:412 libpq/pqcomm.c:724 storage/ipc/latch.c:1134 -#: storage/ipc/latch.c:1314 storage/ipc/latch.c:1547 storage/ipc/latch.c:1709 -#: storage/ipc/latch.c:1835 +#: storage/ipc/latch.c:1314 storage/ipc/latch.c:1554 storage/ipc/latch.c:1716 +#: storage/ipc/latch.c:1842 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:868 +#: ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 #: utils/misc/ps_status.c:230 utils/misc/ps_status.c:238 #, c-format msgid "out of memory\n" @@ -313,7 +313,7 @@ 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:1564 storage/file/fd.c:2880 +#: postmaster/postmaster.c:1566 storage/file/fd.c:2880 #: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" @@ -454,9 +454,9 @@ msgstr "подсказка: " #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: postmaster/postmaster.c:2211 utils/misc/guc.c:3120 utils/misc/guc.c:3156 -#: utils/misc/guc.c:3226 utils/misc/guc.c:4562 utils/misc/guc.c:6744 -#: utils/misc/guc.c:6785 +#: 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 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неверное значение для параметра \"%s\": \"%s\"" @@ -538,15 +538,15 @@ msgstr "не удалось стереть файл \"%s\": %m" msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" -#: ../common/scram-common.c:282 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "не удалось закодировать соль" -#: ../common/scram-common.c:298 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "не удалось закодировать сохранённый ключ" -#: ../common/scram-common.c:315 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "не удалось закодировать ключ сервера" @@ -670,7 +670,7 @@ msgstr "" "Возможно, работе СУБД мешает антивирус, программа резервного копирования или " "что-то подобное." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format msgid "could not get current working directory: %s\n" msgstr "не удалось определить текущий рабочий каталог: %s\n" @@ -941,7 +941,7 @@ msgstr "В RESET не должно передаваться значение п msgid "unrecognized parameter namespace \"%s\"" msgstr "нераспознанное пространство имён параметров \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1302 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы со свойством WITH OIDS не поддерживаются" @@ -1064,7 +1064,7 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Для исправления выполните REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 +#: access/gin/ginutil.c:146 executor/execExpr.c:2177 #: utils/adt/arrayfuncs.c:4052 utils/adt/arrayfuncs.c:6739 #: utils/adt/rowtypes.c:984 #, c-format @@ -1178,7 +1178,7 @@ msgstr "" #: 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:2015 commands/tablecmds.c:17711 commands/view.c:86 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17711 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,38 +1239,38 @@ msgid "" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2048 +#: access/heap/heapam.c:2049 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2567 +#: access/heap/heapam.c:2568 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2614 +#: access/heap/heapam.c:2615 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3062 access/heap/heapam.c:6294 access/index/genam.c:819 +#: access/heap/heapam.c:3063 access/heap/heapam.c:6339 access/index/genam.c:819 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3194 +#: access/heap/heapam.c:3239 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4705 access/heap/heapam.c:4743 -#: access/heap/heapam.c:5008 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 +#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam.c:6107 commands/trigger.c:3347 +#: access/heap/heapam.c:6152 commands/trigger.c:3347 #: executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2472 #, c-format msgid "" @@ -1305,7 +1305,7 @@ msgstr "не удалось записать в файл \"%s\" (записан #: access/transam/xlog.c:3941 access/transam/xlog.c:8780 #: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 #: backup/basebackup_server.c:244 commands/dbcommands.c:495 -#: postmaster/postmaster.c:4557 postmaster/postmaster.c:5560 +#: postmaster/postmaster.c:4558 postmaster/postmaster.c:5562 #: replication/logical/origin.c:603 replication/slot.c:1804 #: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 #, c-format @@ -1321,13 +1321,13 @@ msgstr "не удалось обрезать файл \"%s\" до нужного #: 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:4567 postmaster/postmaster.c:4577 +#: 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 storage/file/buffile.c:545 -#: storage/file/copydir.c:197 utils/init/miscinit.c:1612 -#: utils/init/miscinit.c:1623 utils/init/miscinit.c:1631 utils/misc/guc.c:4346 -#: utils/misc/guc.c:4377 utils/misc/guc.c:5513 utils/misc/guc.c:5531 +#: 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" @@ -1626,8 +1626,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:2843 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17406 commands/tablecmds.c:19249 +#: commands/indexcmds.c:2850 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17406 commands/tablecmds.c:19275 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" @@ -1760,7 +1760,7 @@ msgid "%s cannot be empty." msgstr "Значение %s не может быть пустым." # well-spelled: симв -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4808 +#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4809 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "Длина %s превышает предел (%d симв.)." @@ -1983,36 +1983,36 @@ msgstr "" msgid "invalid MultiXactId: %u" msgstr "неверный MultiXactId: %u" -#: access/transam/parallel.c:742 access/transam/parallel.c:861 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "не удалось инициализировать параллельный исполнитель" -#: access/transam/parallel.c:743 access/transam/parallel.c:862 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Дополнительная информация может быть в журнале сервера." -#: access/transam/parallel.c:923 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершился в процессе параллельной транзакции" -#: access/transam/parallel.c:1110 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "потеряно подключение к параллельному исполнителю" -#: access/transam/parallel.c:1176 access/transam/parallel.c:1178 +#: access/transam/parallel.c:1182 access/transam/parallel.c:1184 msgid "parallel worker" msgstr "параллельный исполнитель" -#: access/transam/parallel.c:1332 replication/logical/applyparallelworker.c:893 +#: access/transam/parallel.c:1338 replication/logical/applyparallelworker.c:893 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не удалось отобразить динамический сегмент разделяемой памяти" -#: access/transam/parallel.c:1337 replication/logical/applyparallelworker.c:899 +#: access/transam/parallel.c:1343 replication/logical/applyparallelworker.c:899 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неверное магическое число в динамическом сегменте разделяемой памяти" @@ -2597,7 +2597,7 @@ msgstr "не удалось сгенерировать случайное чис #: 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 -#: utils/init/miscinit.c:1769 +#: utils/init/miscinit.c:1813 #, c-format msgid "database files are incompatible with server" msgstr "файлы базы данных несовместимы с сервером" @@ -3865,7 +3865,7 @@ msgstr "остановка в конце восстановления" msgid "Execute pg_wal_replay_resume() to promote." msgstr "Выполните pg_wal_replay_resume() для повышения." -#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4628 +#: access/transam/xlogrecovery.c:2891 access/transam/xlogrecovery.c:4629 #, c-format msgid "recovery has paused" msgstr "восстановление приостановлено" @@ -3894,38 +3894,38 @@ msgstr "" "не удалось прочитать сегмент WAL %s, LSN %X/%X, смещение %u (прочитано байт: " "%d из %zu)" -#: access/transam/xlogrecovery.c:4010 +#: access/transam/xlogrecovery.c:4011 #, c-format msgid "invalid checkpoint location" msgstr "неверное положение контрольной точки" -#: access/transam/xlogrecovery.c:4020 +#: access/transam/xlogrecovery.c:4021 #, c-format msgid "invalid checkpoint record" msgstr "неверная запись контрольной точки" -#: access/transam/xlogrecovery.c:4026 +#: access/transam/xlogrecovery.c:4027 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "неверный ID менеджера ресурсов в записи контрольной точки" -#: access/transam/xlogrecovery.c:4034 +#: access/transam/xlogrecovery.c:4035 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "неверные флаги xl_info в записи контрольной точки" -#: access/transam/xlogrecovery.c:4040 +#: access/transam/xlogrecovery.c:4041 #, c-format msgid "invalid length of checkpoint record" msgstr "неверная длина записи контрольной точки" -#: access/transam/xlogrecovery.c:4094 +#: access/transam/xlogrecovery.c:4095 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "" "новая линия времени %u не является ответвлением линии времени системы БД %u" -#: access/transam/xlogrecovery.c:4108 +#: access/transam/xlogrecovery.c:4109 #, c-format msgid "" "new timeline %u forked off current database system timeline %u before " @@ -3934,30 +3934,30 @@ msgstr "" "новая линия времени %u ответвилась от текущей линии времени базы данных %u " "до текущей точки восстановления %X/%X" -#: access/transam/xlogrecovery.c:4127 +#: access/transam/xlogrecovery.c:4128 #, c-format msgid "new target timeline is %u" msgstr "новая целевая линия времени %u" -#: access/transam/xlogrecovery.c:4330 +#: access/transam/xlogrecovery.c:4331 #, c-format msgid "WAL receiver process shutdown requested" msgstr "получен запрос на выключение процесса приёмника WAL" -#: access/transam/xlogrecovery.c:4390 +#: access/transam/xlogrecovery.c:4391 #, c-format msgid "received promote request" msgstr "получен запрос повышения статуса" -#: access/transam/xlogrecovery.c:4619 +#: access/transam/xlogrecovery.c:4620 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "" "режим горячего резерва невозможен из-за отсутствия достаточных значений " "параметров" -#: access/transam/xlogrecovery.c:4620 access/transam/xlogrecovery.c:4647 -#: access/transam/xlogrecovery.c:4677 +#: access/transam/xlogrecovery.c:4621 access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4678 #, c-format msgid "" "%s = %d is a lower setting than on the primary server, where its value was " @@ -3965,12 +3965,12 @@ msgid "" msgstr "" "Параметр %s = %d меньше, чем на ведущем сервере, где его значение было %d." -#: access/transam/xlogrecovery.c:4629 +#: access/transam/xlogrecovery.c:4630 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "В случае возобновления восстановления сервер отключится." -#: access/transam/xlogrecovery.c:4630 +#: access/transam/xlogrecovery.c:4631 #, c-format msgid "" "You can then restart the server after making the necessary configuration " @@ -3979,24 +3979,24 @@ msgstr "" "Затем вы можете перезапустить сервер после внесения необходимых изменений " "конфигурации." -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4642 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "повышение невозможно из-за отсутствия достаточных значений параметров" -#: access/transam/xlogrecovery.c:4651 +#: access/transam/xlogrecovery.c:4652 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "" "Перезапустите сервер после внесения необходимых изменений конфигурации." -#: access/transam/xlogrecovery.c:4675 +#: access/transam/xlogrecovery.c:4676 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "" "восстановление прервано из-за отсутствия достаточных значений параметров" -#: access/transam/xlogrecovery.c:4681 +#: access/transam/xlogrecovery.c:4682 #, c-format msgid "" "You can restart the server after making the necessary configuration changes." @@ -4004,12 +4004,12 @@ msgstr "" "Вы можете перезапустить сервер после внесения необходимых изменений " "конфигурации." -#: access/transam/xlogrecovery.c:4723 +#: access/transam/xlogrecovery.c:4724 #, c-format msgid "multiple recovery targets specified" msgstr "указано несколько целей восстановления" -#: access/transam/xlogrecovery.c:4724 +#: access/transam/xlogrecovery.c:4725 #, c-format msgid "" "At most one of recovery_target, recovery_target_lsn, recovery_target_name, " @@ -4019,18 +4019,18 @@ msgstr "" "recovery_target_lsn, recovery_target_name, recovery_target_time, " "recovery_target_xid." -#: access/transam/xlogrecovery.c:4735 +#: access/transam/xlogrecovery.c:4736 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Единственное допустимое значение: \"immediate\"." -#: access/transam/xlogrecovery.c:4887 utils/adt/timestamp.c:186 +#: access/transam/xlogrecovery.c:4888 utils/adt/timestamp.c:186 #: utils/adt/timestamp.c:439 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp вне диапазона: \"%s\"" -#: access/transam/xlogrecovery.c:4932 +#: access/transam/xlogrecovery.c:4933 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline не является допустимым числом." @@ -4063,7 +4063,7 @@ msgstr "Команда архивации с ошибкой: %s" msgid "archive command was terminated by exception 0x%X" msgstr "команда архивации была прервана исключением 0x%X" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3678 +#: archive/shell_archive.c:107 postmaster/postmaster.c:3679 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -4305,7 +4305,7 @@ msgstr "не удалось создать каталог \"%s\": %m" msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" существует, но он не пуст" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1166 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ошибка при обращении к каталогу \"%s\": %m" @@ -5102,9 +5102,9 @@ msgstr "удалить объект %s нельзя, так как от него #: 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:6638 -#: utils/misc/guc.c:6672 utils/misc/guc.c:6706 utils/misc/guc.c:6749 -#: utils/misc/guc.c:6791 +#: 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" msgstr "%s" @@ -5317,14 +5317,14 @@ msgstr "" msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1298 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1292 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, но тип выражения по умолчанию %s" #: catalog/heap.c:2814 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:1303 +#: parser/parse_target.c:893 rewrite/rewriteHandler.c:1297 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." @@ -5442,12 +5442,12 @@ msgstr "DROP INDEX CONCURRENTLY должен быть первым действ msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3685 commands/indexcmds.c:3607 +#: catalog/index.c:3685 commands/indexcmds.c:3614 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3701 commands/indexcmds.c:3487 commands/indexcmds.c:3631 +#: catalog/index.c:3701 commands/indexcmds.c:3494 commands/indexcmds.c:3638 #: commands/tablecmds.c:3428 #, c-format msgid "cannot move system relation \"%s\"" @@ -5466,7 +5466,7 @@ msgstr "" "пропускается" #: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5738 +#: commands/trigger.c:5736 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ссылки между базами не реализованы: \"%s.%s.%s\"" @@ -5774,74 +5774,74 @@ msgid "unrecognized object type \"%s\"" msgstr "нераспознанный тип объекта \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2966 #, c-format msgid "column %s of %s" msgstr "столбец %s отношения %s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2981 #, c-format msgid "function %s" msgstr "функция %s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2994 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:3031 #, c-format msgid "cast from %s to %s" msgstr "приведение %s к %s" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3064 #, c-format msgid "collation %s" msgstr "правило сортировки %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3095 #, c-format msgid "constraint %s on %s" msgstr "ограничение %s в отношении %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3101 #, c-format msgid "constraint %s" msgstr "ограничение %s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3133 #, c-format msgid "conversion %s" msgstr "преобразование %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3155 #, c-format msgid "default value for %s" msgstr "значение по умолчанию для %s" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3166 #, c-format msgid "language %s" msgstr "язык %s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3174 #, c-format msgid "large object %u" msgstr "большой объект %u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3187 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3224 #, c-format msgid "operator class %s for access method %s" msgstr "класс операторов %s для метода доступа %s" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3252 #, c-format msgid "access method %s" msgstr "метод доступа %s" @@ -5850,7 +5850,7 @@ msgstr "метод доступа %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3307 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) из семейства \"%s\": %s" @@ -5859,241 +5859,241 @@ msgstr "оператор %d (%s, %s) из семейства \"%s\": %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3372 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "функция %d (%s, %s) из семейства \"%s\": %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3426 #, c-format msgid "rule %s on %s" msgstr "правило %s для отношения %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3472 #, c-format msgid "trigger %s on %s" msgstr "триггер %s в отношении %s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3492 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3520 #, c-format msgid "statistics object %s" msgstr "объект статистики %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3551 #, c-format msgid "text search parser %s" msgstr "анализатор текстового поиска %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3582 #, c-format msgid "text search dictionary %s" msgstr "словарь текстового поиска %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3613 #, c-format msgid "text search template %s" msgstr "шаблон текстового поиска %s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3644 #, c-format msgid "text search configuration %s" msgstr "конфигурация текстового поиска %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3657 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3694 catalog/objectaddress.c:5546 #, c-format msgid "membership of role %s in role %s" msgstr "членство роли %s в роли %s" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3715 #, c-format msgid "database %s" msgstr "база данных %s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3731 #, c-format msgid "tablespace %s" msgstr "табличное пространство %s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3742 #, c-format msgid "foreign-data wrapper %s" msgstr "обёртка сторонних данных %s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3752 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3785 #, c-format msgid "user mapping for %s on server %s" msgstr "сопоставление для пользователя %s на сервере %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3837 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых отношений, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3841 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права по умолчанию для новых отношений, принадлежащих роли %s" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3847 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s в " "схеме %s" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3851 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3857 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3861 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3867 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3871 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3877 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права по умолчанию для новых схем, принадлежащих роли %s" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3884 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых объектов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3888 #, c-format msgid "default privileges belonging to role %s" msgstr "права по умолчанию для новых объектов, принадлежащих роли %s" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3910 #, c-format msgid "extension %s" msgstr "расширение %s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3927 #, c-format msgid "event trigger %s" msgstr "событийный триггер %s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3951 #, c-format msgid "parameter %s" msgstr "параметр %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3994 #, c-format msgid "policy %s on %s" msgstr "политика %s отношения %s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:4008 #, c-format msgid "publication %s" msgstr "публикация %s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:4021 #, c-format msgid "publication of schema %s in publication %s" msgstr "публикация схемы %s в публикации %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4052 #, c-format msgid "publication of %s in publication %s" msgstr "публикуемое отношение %s в публикации %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4065 #, c-format msgid "subscription %s" msgstr "подписка %s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4086 #, c-format msgid "transform for %s language %s" msgstr "преобразование для %s, языка %s" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4157 #, c-format msgid "table %s" msgstr "таблица %s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4162 #, c-format msgid "index %s" msgstr "индекс %s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4166 #, c-format msgid "sequence %s" msgstr "последовательность %s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4170 #, c-format msgid "toast table %s" msgstr "TOAST-таблица %s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4174 #, c-format msgid "view %s" msgstr "представление %s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4178 #, c-format msgid "materialized view %s" msgstr "материализованное представление %s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4182 #, c-format msgid "composite type %s" msgstr "составной тип %s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4186 #, c-format msgid "foreign table %s" msgstr "сторонняя таблица %s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4191 #, c-format msgid "relation %s" msgstr "отношение %s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4232 #, c-format msgid "operator family %s for access method %s" msgstr "семейство операторов %s для метода доступа %s" @@ -6146,7 +6146,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "обратная функция перехода %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3008 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" @@ -6854,7 +6854,7 @@ msgstr "" "Имя мультидиапазонного типа можно указать вручную, воспользовавшись " "атрибутом \"multirange_type_name\"." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:530 storage/buffer/bufmgr.c:1145 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неверная страница в блоке %u отношения %s" @@ -6957,79 +6957,79 @@ msgstr "" "параметр \"%s\" должен иметь характеристику READ_ONLY, SHAREABLE или " "READ_WRITE" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:87 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" msgstr "событийный триггер \"%s\" уже существует" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:90 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка сторонних данных \"%s\" уже существует" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:93 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:96 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "язык \"%s\" уже существует" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:99 commands/publicationcmds.c:771 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: commands/alter.c:101 commands/subscriptioncmds.c:657 +#: commands/alter.c:102 commands/subscriptioncmds.c:657 #, c-format msgid "subscription \"%s\" already exists" msgstr "подписка \"%s\" уже существует" -#: commands/alter.c:124 +#: commands/alter.c:125 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "преобразование \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:128 +#: commands/alter.c:129 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "объект статистики \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:132 +#: commands/alter.c:133 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "анализатор текстового поиска \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:136 +#: commands/alter.c:137 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "словарь текстового поиска \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:140 +#: commands/alter.c:141 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "шаблон текстового поиска \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:144 +#: commands/alter.c:145 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "конфигурация текстового поиска \"%s\" уже существует в схеме \"%s\"" -#: commands/alter.c:217 +#: commands/alter.c:218 #, c-format msgid "must be superuser to rename %s" msgstr "переименовать \"%s\" может только суперпользователь" -#: commands/alter.c:259 commands/subscriptioncmds.c:636 +#: commands/alter.c:260 commands/subscriptioncmds.c:636 #: commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 #: commands/subscriptioncmds.c:1837 #, c-format msgid "password_required=false is superuser-only" msgstr "задать password_required=false может только суперпользователь" -#: commands/alter.c:260 commands/subscriptioncmds.c:637 +#: commands/alter.c:261 commands/subscriptioncmds.c:637 #: commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 #: commands/subscriptioncmds.c:1838 #, c-format @@ -7040,7 +7040,7 @@ msgstr "" "Подписки с параметром password_required option, равным false, могут " "создавать или изменять только суперпользователи." -#: commands/alter.c:775 +#: commands/alter.c:776 #, c-format msgid "must be superuser to set schema of %s" msgstr "для назначения схемы объекта %s нужно быть суперпользователем" @@ -7060,8 +7060,8 @@ msgstr "Для создания метода доступа нужно быть msgid "access method \"%s\" already exists" msgstr "метод доступа \"%s\" уже существует" -#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 -#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:846 +#: commands/opclasscmds.c:376 commands/opclasscmds.c:834 #, c-format msgid "access method \"%s\" does not exist" msgstr "метод доступа \"%s\" не существует" @@ -7286,10 +7286,10 @@ msgstr "атрибут COLLATION \"%s\" не распознан" #: commands/collationcmds.c:125 commands/collationcmds.c:131 #: commands/define.c:389 commands/tablecmds.c:7952 -#: replication/pgoutput/pgoutput.c:309 replication/pgoutput/pgoutput.c:332 -#: replication/pgoutput/pgoutput.c:346 replication/pgoutput/pgoutput.c:356 -#: replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 -#: replication/pgoutput/pgoutput.c:386 replication/walsender.c:996 +#: 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 #, c-format msgid "conflicting or redundant options" @@ -7410,8 +7410,8 @@ msgstr "пригодные системные локали не найдены" #: commands/dbcommands.c:1944 commands/dbcommands.c:2142 #: commands/dbcommands.c:2382 commands/dbcommands.c:2475 #: commands/dbcommands.c:2588 commands/dbcommands.c:3091 -#: utils/init/postinit.c:1021 utils/init/postinit.c:1085 -#: utils/init/postinit.c:1157 +#: utils/init/postinit.c:1023 utils/init/postinit.c:1087 +#: utils/init/postinit.c:1159 #, c-format msgid "database \"%s\" does not exist" msgstr "база данных \"%s\" не существует" @@ -7701,7 +7701,7 @@ msgstr "столбец \"%s\" — генерируемый" msgid "Generated columns cannot be used in COPY." msgstr "Генерируемые столбцы нельзя использовать в COPY." -#: commands/copy.c:842 commands/indexcmds.c:1886 commands/statscmds.c:242 +#: commands/copy.c:842 commands/indexcmds.c:1893 commands/statscmds.c:242 #: commands/tablecmds.c:2419 commands/tablecmds.c:3141 #: commands/tablecmds.c:3655 parser/parse_relation.c:3698 #: parser/parse_relation.c:3708 parser/parse_relation.c:3726 @@ -8182,7 +8182,7 @@ msgid "cannot use invalid database \"%s\" as template" msgstr "использовать некорректную базу \"%s\" в качестве шаблона нельзя" #: commands/dbcommands.c:988 commands/dbcommands.c:2393 -#: utils/init/postinit.c:1100 +#: utils/init/postinit.c:1102 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Выполните DROP DATABASE для удаления некорректных баз данных." @@ -9699,97 +9699,97 @@ msgstr[0] "процедуре нельзя передать больше %d ар msgstr[1] "процедуре нельзя передать больше %d аргументов" msgstr[2] "процедуре нельзя передать больше %d аргументов" -#: commands/indexcmds.c:640 +#: commands/indexcmds.c:647 #, c-format msgid "must specify at least one column" msgstr "нужно указать минимум один столбец" -#: commands/indexcmds.c:644 +#: commands/indexcmds.c:651 #, c-format msgid "cannot use more than %d columns in an index" msgstr "число столбцов в индексе не может превышать %d" -#: commands/indexcmds.c:687 +#: commands/indexcmds.c:694 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "создать индекс для отношения \"%s\" нельзя" -#: commands/indexcmds.c:713 +#: commands/indexcmds.c:720 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "" "создать индекс в секционированной таблице \"%s\" параллельным способом нельзя" -#: commands/indexcmds.c:718 +#: commands/indexcmds.c:725 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "" "создать ограничение-исключение в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:728 +#: commands/indexcmds.c:735 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "создавать индексы во временных таблицах других сеансов нельзя" -#: commands/indexcmds.c:766 commands/tablecmds.c:802 commands/tablespace.c:1184 +#: commands/indexcmds.c:773 commands/tablecmds.c:802 commands/tablespace.c:1184 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "" "для секционированных отношений нельзя назначить табличное пространство по " "умолчанию" -#: commands/indexcmds.c:798 commands/tablecmds.c:833 commands/tablecmds.c:3435 +#: commands/indexcmds.c:805 commands/tablecmds.c:833 commands/tablecmds.c:3435 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "" "в табличное пространство pg_global можно поместить только разделяемые таблицы" -#: commands/indexcmds.c:831 +#: commands/indexcmds.c:838 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "устаревший метод доступа \"rtree\" подменяется методом \"gist\"" -#: commands/indexcmds.c:852 +#: commands/indexcmds.c:859 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "метод доступа \"%s\" не поддерживает уникальные индексы" -#: commands/indexcmds.c:857 +#: commands/indexcmds.c:864 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "метод доступа \"%s\" не поддерживает включаемые столбцы" -#: commands/indexcmds.c:862 +#: commands/indexcmds.c:869 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступа \"%s\" не поддерживает индексы по многим столбцам" -#: commands/indexcmds.c:867 +#: commands/indexcmds.c:874 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступа \"%s\" не поддерживает ограничения-исключения" -#: commands/indexcmds.c:994 +#: commands/indexcmds.c:1001 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "" "сопоставить ключ секционирования с индексом, использующим метод доступа " "\"%s\", нельзя" -#: commands/indexcmds.c:1004 +#: commands/indexcmds.c:1011 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "" "неподдерживаемое ограничение \"%s\" с определением ключа секционирования" -#: commands/indexcmds.c:1006 +#: commands/indexcmds.c:1013 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "" "Ограничения %s не могут использоваться, когда ключи секционирования включают " "выражения." -#: commands/indexcmds.c:1048 +#: commands/indexcmds.c:1055 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" @@ -9797,7 +9797,7 @@ msgstr "" "ограничение уникальности в секционированной таблице должно включать все " "секционирующие столбцы" -#: commands/indexcmds.c:1049 +#: commands/indexcmds.c:1056 #, c-format msgid "" "%s constraint on table \"%s\" lacks column \"%s\" which is part of the " @@ -9806,92 +9806,92 @@ msgstr "" "В ограничении %s таблицы \"%s\" не хватает столбца \"%s\", входящего в ключ " "секционирования." -#: commands/indexcmds.c:1068 commands/indexcmds.c:1087 +#: commands/indexcmds.c:1075 commands/indexcmds.c:1094 #, c-format msgid "index creation on system columns is not supported" msgstr "создание индекса для системных столбцов не поддерживается" -#: commands/indexcmds.c:1316 tcop/utility.c:1526 +#: commands/indexcmds.c:1323 tcop/utility.c:1526 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "создать уникальный индекс в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:1318 tcop/utility.c:1528 +#: commands/indexcmds.c:1325 tcop/utility.c:1528 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблица \"%s\" содержит секции, являющиеся сторонними таблицами." -#: commands/indexcmds.c:1803 +#: commands/indexcmds.c:1810 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функции в предикате индекса должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1881 parser/parse_utilcmd.c:2557 +#: commands/indexcmds.c:1888 parser/parse_utilcmd.c:2557 #: parser/parse_utilcmd.c:2692 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "указанный в ключе столбец \"%s\" не существует" -#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:1845 +#: commands/indexcmds.c:1912 parser/parse_utilcmd.c:1845 #, c-format msgid "expressions are not supported in included columns" msgstr "выражения во включаемых столбцах не поддерживаются" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1953 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функции в индексном выражении должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:1968 #, c-format msgid "including column does not support a collation" msgstr "включаемые столбцы не поддерживают правила сортировки" -#: commands/indexcmds.c:1965 +#: commands/indexcmds.c:1972 #, c-format msgid "including column does not support an operator class" msgstr "включаемые столбцы не поддерживают классы операторов" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1976 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включаемые столбцы не поддерживают сортировку ASC/DESC" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1980 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включаемые столбцы не поддерживают указания NULLS FIRST/LAST" -#: commands/indexcmds.c:2014 +#: commands/indexcmds.c:2021 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:2022 commands/tablecmds.c:17718 commands/typecmds.c:807 +#: 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 #: utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: commands/indexcmds.c:2087 +#: commands/indexcmds.c:2094 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не коммутативен" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2096 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "В ограничениях-исключениях могут использоваться только коммутативные " "операторы." -#: commands/indexcmds.c:2115 +#: commands/indexcmds.c:2122 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор \"%s\" не входит в семейство операторов \"%s\"" -#: commands/indexcmds.c:2118 +#: commands/indexcmds.c:2125 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -9900,17 +9900,17 @@ msgstr "" "Оператор исключения для ограничения должен относиться к классу операторов " "индекса." -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2160 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступа \"%s\" не поддерживает сортировку ASC/DESC" -#: commands/indexcmds.c:2158 +#: commands/indexcmds.c:2165 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2204 commands/tablecmds.c:17743 +#: commands/indexcmds.c:2211 commands/tablecmds.c:17743 #: commands/tablecmds.c:17749 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" @@ -9918,7 +9918,7 @@ msgstr "" "для типа данных %s не определён класс операторов по умолчанию для метода " "доступа \"%s\"" -#: commands/indexcmds.c:2206 +#: commands/indexcmds.c:2213 #, c-format msgid "" "You must specify an operator class for the index or define a default " @@ -9927,86 +9927,86 @@ msgstr "" "Вы должны указать класс операторов для индекса или определить класс " "операторов по умолчанию для этого типа данных." -#: commands/indexcmds.c:2235 commands/indexcmds.c:2243 -#: commands/opclasscmds.c:205 +#: commands/indexcmds.c:2242 commands/indexcmds.c:2250 +#: commands/opclasscmds.c:206 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "класс операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/indexcmds.c:2257 commands/typecmds.c:2289 +#: commands/indexcmds.c:2264 commands/typecmds.c:2289 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "класс операторов \"%s\" не принимает тип данных %s" -#: commands/indexcmds.c:2347 +#: commands/indexcmds.c:2354 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2675 +#: commands/indexcmds.c:2682 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нераспознанный параметр REINDEX: \"%s\"" -#: commands/indexcmds.c:2899 +#: commands/indexcmds.c:2906 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2920 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:2958 commands/indexcmds.c:3468 -#: commands/indexcmds.c:3596 +#: commands/indexcmds.c:2965 commands/indexcmds.c:3475 +#: commands/indexcmds.c:3603 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:2981 +#: commands/indexcmds.c:2988 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:3075 +#: commands/indexcmds.c:3082 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:3108 +#: commands/indexcmds.c:3115 #, c-format msgid "cannot move system relations, skipping all" msgstr "переместить системные отношения нельзя, все они пропускаются" -#: commands/indexcmds.c:3154 +#: commands/indexcmds.c:3161 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3157 +#: commands/indexcmds.c:3164 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3348 commands/indexcmds.c:4204 +#: commands/indexcmds.c:3355 commands/indexcmds.c:4211 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:3500 commands/indexcmds.c:3552 +#: commands/indexcmds.c:3507 commands/indexcmds.c:3559 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "" "перестроить нерабочий индекс \"%s.%s\" неблокирующим способом нельзя, он " "пропускается" -#: commands/indexcmds.c:3506 +#: commands/indexcmds.c:3513 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -10014,24 +10014,24 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3661 +#: commands/indexcmds.c:3668 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3682 +#: commands/indexcmds.c:3689 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4185 commands/indexcmds.c:4197 +#: commands/indexcmds.c:4192 commands/indexcmds.c:4204 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/indexcmds.c:4187 commands/indexcmds.c:4206 +#: commands/indexcmds.c:4194 commands/indexcmds.c:4213 #, c-format msgid "%s." msgstr "%s." @@ -10081,102 +10081,102 @@ msgstr "" msgid "Row: %s" msgstr "Строка: %s" -#: commands/opclasscmds.c:124 +#: commands/opclasscmds.c:125 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "семейство операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/opclasscmds.c:267 +#: commands/opclasscmds.c:268 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "семейство операторов \"%s\" для метода доступа \"%s\" уже существует" -#: commands/opclasscmds.c:416 +#: commands/opclasscmds.c:417 #, c-format msgid "must be superuser to create an operator class" msgstr "для создания класса операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 -#: commands/opclasscmds.c:1056 +#: commands/opclasscmds.c:494 commands/opclasscmds.c:911 +#: commands/opclasscmds.c:1057 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "неверный номер оператора (%d), требуется число от 1 до %d" -#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 -#: commands/opclasscmds.c:1072 +#: commands/opclasscmds.c:539 commands/opclasscmds.c:961 +#: commands/opclasscmds.c:1073 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "неверный номер функции (%d), требуется число от 1 до %d" -#: commands/opclasscmds.c:567 +#: commands/opclasscmds.c:568 #, c-format msgid "storage type specified more than once" msgstr "тип хранения указан неоднократно" -#: commands/opclasscmds.c:594 +#: commands/opclasscmds.c:595 #, c-format msgid "" "storage type cannot be different from data type for access method \"%s\"" msgstr "" "тип хранения не может отличаться от типа данных для метода доступа \"%s\"" -#: commands/opclasscmds.c:610 +#: commands/opclasscmds.c:611 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "класс операторов \"%s\" для метода доступа \"%s\" уже существует" -#: commands/opclasscmds.c:638 +#: commands/opclasscmds.c:639 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "" "класс операторов \"%s\" не удалось сделать классом по умолчанию для типа %s" -#: commands/opclasscmds.c:641 +#: commands/opclasscmds.c:642 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "Класс операторов \"%s\" уже является классом по умолчанию." -#: commands/opclasscmds.c:801 +#: commands/opclasscmds.c:802 #, c-format msgid "must be superuser to create an operator family" msgstr "для создания семейства операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:861 +#: commands/opclasscmds.c:862 #, c-format msgid "must be superuser to alter an operator family" msgstr "для изменения семейства операторов нужно быть суперпользователем" -#: commands/opclasscmds.c:919 +#: commands/opclasscmds.c:920 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "в ALTER OPERATOR FAMILY должны быть указаны типы аргументов оператора" -#: commands/opclasscmds.c:994 +#: commands/opclasscmds.c:995 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "в ALTER OPERATOR FAMILY нельзя указать STORAGE" -#: commands/opclasscmds.c:1128 +#: commands/opclasscmds.c:1129 #, c-format msgid "one or two argument types must be specified" msgstr "нужно указать один или два типа аргументов" -#: commands/opclasscmds.c:1154 +#: commands/opclasscmds.c:1155 #, c-format msgid "index operators must be binary" msgstr "индексные операторы должны быть бинарными" -#: commands/opclasscmds.c:1173 +#: commands/opclasscmds.c:1174 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "метод доступа \"%s\" не поддерживает сортирующие операторы" -#: commands/opclasscmds.c:1184 +#: commands/opclasscmds.c:1185 #, c-format msgid "index search operators must return boolean" msgstr "операторы поиска по индексу должны возвращать логическое значение" -#: commands/opclasscmds.c:1224 +#: commands/opclasscmds.c:1225 #, c-format msgid "" "associated data types for operator class options parsing functions must " @@ -10185,7 +10185,7 @@ msgstr "" "связанные типы данных для функций, разбирающих параметры класса операторов, " "должны совпадать с входным типом класса" -#: commands/opclasscmds.c:1231 +#: commands/opclasscmds.c:1232 #, c-format msgid "" "left and right associated data types for operator class options parsing " @@ -10194,119 +10194,119 @@ msgstr "" "левый и правый типы данных для функций, разбирающих параметры класса " "операторов, должны совпадать" -#: commands/opclasscmds.c:1239 +#: commands/opclasscmds.c:1240 #, c-format msgid "invalid operator class options parsing function" msgstr "неправильная функция разбора параметров класса операторов" -#: commands/opclasscmds.c:1240 +#: commands/opclasscmds.c:1241 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "" "Правильная сигнатура функции, осуществляющей разбор параметров класса " "операторов: '%s'." -#: commands/opclasscmds.c:1259 +#: commands/opclasscmds.c:1260 #, c-format msgid "btree comparison functions must have two arguments" msgstr "функции сравнения btree должны иметь два аргумента" -#: commands/opclasscmds.c:1263 +#: commands/opclasscmds.c:1264 #, c-format msgid "btree comparison functions must return integer" msgstr "функции сравнения btree должны возвращать целое число" -#: commands/opclasscmds.c:1280 +#: commands/opclasscmds.c:1281 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "опорные функции сортировки btree должны принимать тип \"internal\"" -#: commands/opclasscmds.c:1284 +#: commands/opclasscmds.c:1285 #, c-format msgid "btree sort support functions must return void" msgstr "опорные функции сортировки btree должны возвращать пустое (void)" -#: commands/opclasscmds.c:1295 +#: commands/opclasscmds.c:1296 #, c-format msgid "btree in_range functions must have five arguments" msgstr "функции in_range для btree должны принимать пять аргументов" -#: commands/opclasscmds.c:1299 +#: commands/opclasscmds.c:1300 #, c-format msgid "btree in_range functions must return boolean" msgstr "функции in_range для btree должны возвращать логическое значение" -#: commands/opclasscmds.c:1315 +#: commands/opclasscmds.c:1316 #, c-format msgid "btree equal image functions must have one argument" msgstr "функции равенства образов btree должны иметь один аргумент" -#: commands/opclasscmds.c:1319 +#: commands/opclasscmds.c:1320 #, c-format msgid "btree equal image functions must return boolean" msgstr "функции равенства образов должны возвращать логическое значение" -#: commands/opclasscmds.c:1332 +#: commands/opclasscmds.c:1333 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "функции равенства образов не должны быть межтиповыми" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1343 #, c-format msgid "hash function 1 must have one argument" msgstr "функция хеширования 1 должна принимать один аргумент" -#: commands/opclasscmds.c:1346 +#: commands/opclasscmds.c:1347 #, c-format msgid "hash function 1 must return integer" msgstr "функция хеширования 1 должна возвращать целое число" -#: commands/opclasscmds.c:1353 +#: commands/opclasscmds.c:1354 #, c-format msgid "hash function 2 must have two arguments" msgstr "функция хеширования 2 должна принимать два аргумента" -#: commands/opclasscmds.c:1357 +#: commands/opclasscmds.c:1358 #, c-format msgid "hash function 2 must return bigint" msgstr "функция хеширования 2 должна возвращать значение bigint" -#: commands/opclasscmds.c:1382 +#: commands/opclasscmds.c:1383 #, c-format msgid "associated data types must be specified for index support function" msgstr "для опорной функции индексов должны быть указаны связанные типы данных" -#: commands/opclasscmds.c:1407 +#: commands/opclasscmds.c:1408 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "номер функции %d для (%s,%s) дублируется" -#: commands/opclasscmds.c:1414 +#: commands/opclasscmds.c:1415 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "номер оператора %d для (%s,%s) дублируется" -#: commands/opclasscmds.c:1460 +#: commands/opclasscmds.c:1461 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "оператор %d(%s,%s) уже существует в семействе \"%s\"" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1590 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "функция %d(%s,%s) уже существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1745 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "оператор %d(%s,%s) не существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1785 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "функция %d(%s,%s) не существует в семействе операторов \"%s\"" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1816 #, c-format msgid "" "operator class \"%s\" for access method \"%s\" already exists in schema " @@ -10315,7 +10315,7 @@ msgstr "" "класс операторов \"%s\" для метода доступа \"%s\" уже существует в схеме " "\"%s\"" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1839 #, c-format msgid "" "operator family \"%s\" for access method \"%s\" already exists in schema " @@ -10484,7 +10484,7 @@ msgstr "" #: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 #: postmaster/postmaster.c:1306 storage/file/fd.c:3911 -#: utils/init/miscinit.c:1822 +#: utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "неверный формат списка в параметре \"%s\"" @@ -10986,7 +10986,7 @@ msgstr "объект статистики \"%s.%s\" не существует, msgid "unrecognized subscription parameter: \"%s\"" msgstr "нераспознанный параметр подписки: \"%s\"" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:395 +#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:402 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "нераспознанное значение origin: \"%s\"" @@ -11208,7 +11208,7 @@ msgstr "" "поступили не из других источников." #: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:893 -#: replication/pgoutput/pgoutput.c:1112 +#: replication/pgoutput/pgoutput.c:1138 #, c-format msgid "" "cannot use different column lists for table \"%s.%s\" in different " @@ -11319,7 +11319,7 @@ msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19292 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19318 #: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" does not exist" @@ -11495,11 +11495,11 @@ msgstr "конфликт типов в наследованном столбце #: commands/tablecmds.c:2613 commands/tablecmds.c:2642 #: commands/tablecmds.c:2661 commands/tablecmds.c:2933 #: commands/tablecmds.c:2969 commands/tablecmds.c:2985 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 #: parser/parse_param.c:223 #, c-format msgid "%s versus %s" @@ -12264,7 +12264,7 @@ msgstr "изменяя тип генерируемого столбца, нел #: commands/tablecmds.c:12446 commands/tablecmds.c:17561 #: commands/tablecmds.c:17651 commands/trigger.c:663 -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:972 +#: rewrite/rewriteHandler.c:943 rewrite/rewriteHandler.c:978 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Столбец \"%s\" является генерируемым." @@ -12875,29 +12875,29 @@ msgstr "секционированная таблица \"%s\" была пара msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19326 commands/tablecmds.c:19346 -#: commands/tablecmds.c:19367 commands/tablecmds.c:19386 -#: commands/tablecmds.c:19428 +#: commands/tablecmds.c:19352 commands/tablecmds.c:19372 +#: commands/tablecmds.c:19393 commands/tablecmds.c:19412 +#: commands/tablecmds.c:19454 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:19329 +#: commands/tablecmds.c:19355 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:19349 +#: commands/tablecmds.c:19375 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:19370 +#: commands/tablecmds.c:19396 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:19389 +#: commands/tablecmds.c:19415 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -12906,27 +12906,27 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:19431 +#: commands/tablecmds.c:19457 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:19667 +#: commands/tablecmds.c:19693 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:19674 +#: commands/tablecmds.c:19700 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablecmds.c:19700 +#: commands/tablecmds.c:19726 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:19710 +#: commands/tablecmds.c:19736 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" @@ -13349,19 +13349,19 @@ msgstr "не удалось сериализовать доступ из-за п msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" -#: commands/trigger.c:4608 +#: commands/trigger.c:4606 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя вызвать отложенный " "триггер" -#: commands/trigger.c:5789 +#: commands/trigger.c:5787 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не является откладываемым" -#: commands/trigger.c:5812 +#: commands/trigger.c:5810 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не существует" @@ -13929,8 +13929,10 @@ msgstr "" #: commands/user.c:826 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "Добавлять членов могут только роли с привилегией %s для роли \"%s\"." +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "" +"Добавлять или удалять членов могут только роли с привилегией %s для роли " +"\"%s\"." #: commands/user.c:871 #, c-format @@ -13966,11 +13968,11 @@ msgstr "" msgid "cannot use special role specifier in DROP ROLE" msgstr "использовать специальную роль в DROP ROLE нельзя" -#: commands/user.c:1136 commands/user.c:1358 commands/variable.c:836 -#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 +#: 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/regproc.c:1551 utils/init/miscinit.c:756 +#: utils/adt/regproc.c:1551 utils/init/miscinit.c:801 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не существует" @@ -14495,22 +14497,32 @@ msgstr "Изменить клиентскую кодировку сейчас н msgid "cannot change client_encoding during a parallel operation" msgstr "изменить клиентскую кодировку во время параллельной операции нельзя" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "в доступе для смены объекта авторизации \"%s\" будет отказано" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "нет доступа для смены объекта авторизации в сеансе \"%s\"" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "нет прав установить роль \"%s\"" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "нет прав установить роль \"%s\"" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не поддерживается в данной сборке" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format msgid "" "effective_io_concurrency must be set to 0 on platforms that lack " @@ -14519,7 +14531,7 @@ msgstr "" "Значение effective_io_concurrency должно равняться 0 на платформах, где " "отсутствует posix_fadvise()." -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format msgid "" "maintenance_io_concurrency must be set to 0 on platforms that lack " @@ -14528,7 +14540,7 @@ msgstr "" "Значение maintenance_io_concurrency должно равняться 0 на платформах, где " "отсутствует posix_fadvise()." -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не поддерживается в данной сборке" @@ -14629,7 +14641,7 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "" "для курсора \"%s\" не выполняется обновляемое сканирование таблицы \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2510 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -14637,14 +14649,14 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2522 #, c-format msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" #: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 -#: executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 -#: executor/execExprInterp.c:4350 executor/nodeModifyTable.c:205 +#: 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 #, c-format @@ -14662,7 +14674,7 @@ msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." -#: executor/execExpr.c:651 executor/execExprInterp.c:4252 +#: executor/execExpr.c:651 executor/execExprInterp.c:4264 #: executor/nodeModifyTable.c:217 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." @@ -14675,17 +14687,17 @@ msgstr "" msgid "window function calls cannot be nested" msgstr "вложенные вызовы оконных функций недопустимы" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1626 #, c-format msgid "target type is not an array" msgstr "целевой тип не является массивом" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1966 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "столбец ROW() имеет тип %s, а должен - %s" -#: executor/execExpr.c:2576 executor/execSRF.c:719 parser/parse_func.c:138 +#: executor/execExpr.c:2584 executor/execSRF.c:719 parser/parse_func.c:138 #: parser/parse_func.c:655 parser/parse_func.c:1032 #, c-format msgid "cannot pass more than %d argument to a function" @@ -14694,42 +14706,42 @@ msgstr[0] "функции нельзя передать больше %d аргу msgstr[1] "функции нельзя передать больше %d аргументов" msgstr[2] "функции нельзя передать больше %d аргументов" -#: executor/execExpr.c:2603 executor/execSRF.c:739 executor/functions.c:1068 +#: executor/execExpr.c:2611 executor/execSRF.c:739 executor/functions.c:1068 #: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: executor/execExpr.c:3009 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3017 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "" "к элементам типа %s нельзя обращаться по индексам, так как он это не " "поддерживает" -#: executor/execExpr.c:3137 executor/execExpr.c:3159 +#: executor/execExpr.c:3145 executor/execExpr.c:3167 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не поддерживает изменение элемента по индексу" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:1974 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типа %s был удалён" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:1980 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типа %s имеет неправильный тип" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 -#: executor/execExprInterp.c:3150 +#: executor/execExprInterp.c:1982 executor/execExprInterp.c:3116 +#: executor/execExprInterp.c:3162 #, c-format msgid "Table has type %s, but query expects %s." msgstr "В таблице задан тип %s, а в запросе ожидается %s." -#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 +#: executor/execExprInterp.c:2062 utils/adt/expandedrecord.c:99 #: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 #: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 #: utils/fmgr/funcapi.c:569 @@ -14737,17 +14749,17 @@ msgstr "В таблице задан тип %s, а в запросе ожида msgid "type %s is not composite" msgstr "тип %s не является составным" -#: executor/execExprInterp.c:2588 +#: executor/execExprInterp.c:2600 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиц такого типа не поддерживается" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2813 #, c-format msgid "cannot merge incompatible arrays" msgstr "не удалось объединить несовместимые массивы" -#: executor/execExprInterp.c:2802 +#: executor/execExprInterp.c:2814 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -14756,7 +14768,7 @@ msgstr "" "Массив с типом элементов %s нельзя включить в конструкцию ARRAY с типом " "элементов %s." -#: executor/execExprInterp.c:2823 utils/adt/arrayfuncs.c:266 +#: 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 @@ -14765,7 +14777,7 @@ msgstr "" msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "число размерностей массива (%d) превышает предел (%d)" -#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 +#: executor/execExprInterp.c:2855 executor/execExprInterp.c:2890 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -14773,7 +14785,7 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 +#: executor/execExprInterp.c:2867 utils/adt/array_expanded.c:274 #: utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 #: utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 #: utils/adt/arrayfuncs.c:2654 utils/adt/arrayfuncs.c:2670 @@ -14786,22 +14798,22 @@ msgstr "" msgid "array size exceeds the maximum allowed (%d)" msgstr "размер массива превышает предел (%d)" -#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:3115 executor/execExprInterp.c:3161 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d имеет неверный тип" -#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3747 utils/adt/domains.c:155 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускает значения null" -#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3762 utils/adt/domains.c:193 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значение домена %s нарушает ограничение-проверку \"%s\"" -#: executor/execExprInterp.c:4235 +#: executor/execExprInterp.c:4247 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -14809,7 +14821,7 @@ msgstr[0] "Строка таблицы содержит %d атрибут, а в msgstr[1] "Строка таблицы содержит %d атрибута, а в запросе ожидается %d." msgstr[2] "Строка таблицы содержит %d атрибутов, а в запросе ожидается %d." -#: executor/execExprInterp.c:4351 executor/execSRF.c:978 +#: executor/execExprInterp.c:4363 executor/execSRF.c:978 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" @@ -14855,24 +14867,24 @@ msgstr "Ключ %s конфликтует с существующим ключ msgid "Key conflicts with existing key." msgstr "Ключ конфликтует с уже существующим." -#: executor/execMain.c:1045 +#: executor/execMain.c:1037 #, c-format msgid "cannot change sequence \"%s\"" msgstr "последовательность \"%s\" изменить нельзя" -#: executor/execMain.c:1051 +#: executor/execMain.c:1043 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3092 -#: rewrite/rewriteHandler.c:3990 +#: executor/execMain.c:1061 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:4023 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставить данные в представление \"%s\" нельзя" -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3095 -#: rewrite/rewriteHandler.c:3993 +#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3128 +#: rewrite/rewriteHandler.c:4026 #, c-format msgid "" "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " @@ -14881,14 +14893,14 @@ msgstr "" "Чтобы представление допускало добавление данных, установите триггер INSTEAD " "OF INSERT или безусловное правило ON INSERT DO INSTEAD." -#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3100 -#: rewrite/rewriteHandler.c:3998 +#: executor/execMain.c:1069 rewrite/rewriteHandler.c:3133 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "cannot update view \"%s\"" msgstr "изменить данные в представлении \"%s\" нельзя" -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3103 -#: rewrite/rewriteHandler.c:4001 +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3136 +#: rewrite/rewriteHandler.c:4034 #, c-format msgid "" "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " @@ -14897,14 +14909,14 @@ msgstr "" "Чтобы представление допускало изменение данных, установите триггер INSTEAD " "OF UPDATE или безусловное правило ON UPDATE DO INSTEAD." -#: executor/execMain.c:1085 rewrite/rewriteHandler.c:3108 -#: rewrite/rewriteHandler.c:4006 +#: executor/execMain.c:1077 rewrite/rewriteHandler.c:3141 +#: rewrite/rewriteHandler.c:4039 #, c-format msgid "cannot delete from view \"%s\"" msgstr "удалить данные из представления \"%s\" нельзя" -#: executor/execMain.c:1087 rewrite/rewriteHandler.c:3111 -#: rewrite/rewriteHandler.c:4009 +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:4042 #, c-format msgid "" "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " @@ -14913,119 +14925,119 @@ msgstr "" "Чтобы представление допускало удаление данных, установите триггер INSTEAD OF " "DELETE или безусловное правило ON DELETE DO INSTEAD." -#: executor/execMain.c:1098 +#: executor/execMain.c:1090 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "изменить материализованное представление \"%s\" нельзя" -#: executor/execMain.c:1110 +#: executor/execMain.c:1102 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставлять данные в стороннюю таблицу \"%s\" нельзя" -#: executor/execMain.c:1116 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "сторонняя таблица \"%s\" не допускает добавления" -#: executor/execMain.c:1123 +#: executor/execMain.c:1115 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "изменять данные в сторонней таблице \"%s\"" -#: executor/execMain.c:1129 +#: executor/execMain.c:1121 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "сторонняя таблица \"%s\" не допускает изменения" -#: executor/execMain.c:1136 +#: executor/execMain.c:1128 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "удалять данные из сторонней таблицы \"%s\" нельзя" -#: executor/execMain.c:1142 +#: executor/execMain.c:1134 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "сторонняя таблица \"%s\" не допускает удаления" -#: executor/execMain.c:1153 +#: executor/execMain.c:1145 #, c-format msgid "cannot change relation \"%s\"" msgstr "отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1180 +#: executor/execMain.c:1172 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокировать строки в последовательности \"%s\" нельзя" -#: executor/execMain.c:1187 +#: executor/execMain.c:1179 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокировать строки в TOAST-отношении \"%s\" нельзя" -#: executor/execMain.c:1194 +#: executor/execMain.c:1186 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокировать строки в представлении \"%s\" нельзя" -#: executor/execMain.c:1202 +#: executor/execMain.c:1194 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокировать строки в материализованном представлении \"%s\" нельзя" -#: executor/execMain.c:1211 executor/execMain.c:2716 +#: executor/execMain.c:1203 executor/execMain.c:2711 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокировать строки в сторонней таблице \"%s\" нельзя" -#: executor/execMain.c:1217 +#: executor/execMain.c:1209 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокировать строки в отношении \"%s\" нельзя" -#: executor/execMain.c:1930 +#: executor/execMain.c:1925 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новая строка в отношении \"%s\" нарушает ограничение секции" -#: executor/execMain.c:1932 executor/execMain.c:2016 executor/execMain.c:2067 -#: executor/execMain.c:2177 +#: executor/execMain.c:1927 executor/execMain.c:2011 executor/execMain.c:2062 +#: executor/execMain.c:2172 #, c-format msgid "Failing row contains %s." msgstr "Ошибочная строка содержит %s." -#: executor/execMain.c:2013 +#: executor/execMain.c:2008 #, c-format msgid "" "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "" "значение NULL в столбце \"%s\" отношения \"%s\" нарушает ограничение NOT NULL" -#: executor/execMain.c:2065 +#: executor/execMain.c:2060 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новая строка в отношении \"%s\" нарушает ограничение-проверку \"%s\"" -#: executor/execMain.c:2175 +#: executor/execMain.c:2170 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новая строка нарушает ограничение-проверку для представления \"%s\"" -#: executor/execMain.c:2185 +#: executor/execMain.c:2180 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" для таблицы " "\"%s\"" -#: executor/execMain.c:2190 +#: executor/execMain.c:2185 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк для таблицы \"%s\"" -#: executor/execMain.c:2198 +#: executor/execMain.c:2193 #, c-format msgid "" "target row violates row-level security policy \"%s\" (USING expression) for " @@ -15034,7 +15046,7 @@ msgstr "" "целевая строка нарушает политику защиты на уровне строк \"%s\" (выражение " "USING) для таблицы \"%s\"" -#: executor/execMain.c:2203 +#: executor/execMain.c:2198 #, c-format msgid "" "target row violates row-level security policy (USING expression) for table " @@ -15043,7 +15055,7 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк (выражение USING) для " "таблицы \"%s\"" -#: executor/execMain.c:2210 +#: executor/execMain.c:2205 #, c-format msgid "" "new row violates row-level security policy \"%s\" (USING expression) for " @@ -15052,7 +15064,7 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" (выражение " "USING) для таблицы \"%s\"" -#: executor/execMain.c:2215 +#: executor/execMain.c:2210 #, c-format msgid "" "new row violates row-level security policy (USING expression) for table " @@ -15315,7 +15327,7 @@ msgstr "Последний оператор возвращает слишком msgid "return type %s is not supported for SQL functions" msgstr "для SQL-функций тип возврата %s не поддерживается" -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2992 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "" @@ -15522,7 +15534,7 @@ msgstr "смещение конца рамки не может быть NULL" msgid "frame ending offset must not be negative" msgstr "смещение конца рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2908 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "" @@ -17441,12 +17453,12 @@ msgstr "неверная строка в сообщении" msgid "invalid message format" msgstr "неверный формат сообщения" -#: main/main.c:235 +#: main/main.c:237 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: ошибка WSAStartup: %d\n" -#: main/main.c:329 +#: main/main.c:331 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -17455,7 +17467,7 @@ msgstr "" "%s - сервер PostgreSQL.\n" "\n" -#: main/main.c:330 +#: main/main.c:332 #, c-format msgid "" "Usage:\n" @@ -17466,110 +17478,110 @@ msgstr "" " %s [ПАРАМЕТР]...\n" "\n" -#: main/main.c:331 +#: main/main.c:333 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: main/main.c:332 +#: main/main.c:334 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ЧИСЛО_БУФ число разделяемых буферов\n" -#: main/main.c:333 +#: main/main.c:335 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\n" -#: main/main.c:334 +#: main/main.c:336 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C ИМЯ вывести значение параметра выполнения и выйти\n" -#: main/main.c:335 +#: main/main.c:337 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 уровень отладочных сообщений\n" -#: main/main.c:336 +#: main/main.c:338 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D КАТ_ДАННЫХ каталог с данными\n" # well-spelled: ДМГ -#: main/main.c:337 +#: main/main.c:339 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e использовать европейский формат дат (ДМГ)\n" -#: main/main.c:338 +#: main/main.c:340 #, c-format msgid " -F turn fsync off\n" msgstr " -F выключить синхронизацию с ФС\n" -#: main/main.c:339 +#: main/main.c:341 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h ИМЯ имя или IP-адрес для приёма сетевых соединений\n" -#: main/main.c:340 +#: main/main.c:342 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr "" " -i включить соединения TCP/IP (устаревший параметр)\n" -#: main/main.c:341 +#: main/main.c:343 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k КАТАЛОГ расположение Unix-сокетов\n" -#: main/main.c:343 +#: main/main.c:345 #, c-format msgid " -l enable SSL connections\n" msgstr " -l разрешить SSL-подключения\n" # well-spelled: ПОДКЛ -#: main/main.c:345 +#: main/main.c:347 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N МАКС_ПОДКЛ предельное число подключений\n" -#: main/main.c:346 +#: main/main.c:348 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p ПОРТ номер порта для приёма подключений\n" -#: main/main.c:347 +#: main/main.c:349 #, c-format msgid " -s show statistics after each query\n" msgstr " -s показывать статистику после каждого запроса\n" -#: main/main.c:348 +#: main/main.c:350 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S РАБ_ПАМЯТЬ задать объём памяти для сортировки (в КБ)\n" -#: main/main.c:349 +#: main/main.c:351 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: main/main.c:350 +#: main/main.c:352 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\n" -#: main/main.c:351 +#: main/main.c:353 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config вывести параметры конфигурации и выйти\n" -#: main/main.c:352 +#: main/main.c:354 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: main/main.c:354 +#: main/main.c:356 #, c-format msgid "" "\n" @@ -17578,27 +17590,27 @@ msgstr "" "\n" "Параметры для разработчиков:\n" -#: main/main.c:355 +#: main/main.c:357 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h запретить некоторые типы планов\n" -#: main/main.c:356 +#: main/main.c:358 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O разрешить изменять структуру системных таблиц\n" -#: main/main.c:357 +#: main/main.c:359 #, c-format msgid " -P disable system indexes\n" msgstr " -P отключить системные индексы\n" -#: main/main.c:358 +#: main/main.c:360 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex показать время каждого запроса\n" -#: main/main.c:359 +#: main/main.c:361 #, c-format msgid "" " -T send SIGABRT to all backend processes if one dies\n" @@ -17606,13 +17618,13 @@ msgstr "" " -T посылать сигнал SIGABRT всем серверным процессам\n" " при отключении одного\n" -#: main/main.c:360 +#: main/main.c:362 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr "" " -W СЕК ждать заданное число секунд для подключения отладчика\n" -#: main/main.c:362 +#: main/main.c:364 #, c-format msgid "" "\n" @@ -17621,7 +17633,7 @@ msgstr "" "\n" "Параметры для монопольного режима:\n" -#: main/main.c:363 +#: main/main.c:365 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" @@ -17629,22 +17641,22 @@ msgstr "" " --single включить монопольный режим\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:364 +#: main/main.c:366 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " ИМЯ_БД база данных (по умолчанию - имя пользователя)\n" -#: main/main.c:365 +#: main/main.c:367 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 переопределить уровень отладочных сообщений\n" -#: main/main.c:366 +#: main/main.c:368 #, c-format msgid " -E echo statement before execution\n" msgstr " -E выводить SQL-операторы перед выполнением\n" -#: main/main.c:367 +#: main/main.c:369 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -17652,12 +17664,12 @@ msgstr "" " -j не считать конец строки разделителем интерактивных " "запросов\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:370 main/main.c:376 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r ИМЯ_ФАЙЛА перенаправить STDOUT и STDERR в указанный файл\n" -#: main/main.c:370 +#: main/main.c:372 #, c-format msgid "" "\n" @@ -17666,7 +17678,7 @@ msgstr "" "\n" "Параметры для режима инициализации:\n" -#: main/main.c:371 +#: main/main.c:373 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" @@ -17674,14 +17686,14 @@ msgstr "" " --boot включить режим инициализации\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:372 +#: main/main.c:374 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr "" " --check включить режим проверки (этот аргумент должен быть " "первым)\n" -#: main/main.c:373 +#: main/main.c:375 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " @@ -17689,7 +17701,7 @@ msgid "" msgstr "" " ИМЯ_БД имя базы данных (необходимо в режиме инициализации)\n" -#: main/main.c:376 +#: main/main.c:378 #, c-format msgid "" "\n" @@ -17706,12 +17718,12 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: main/main.c:380 +#: main/main.c:382 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: main/main.c:391 +#: main/main.c:393 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -17724,12 +17736,12 @@ msgstr "" "должен запускать обычный пользователь. Подробнее о том, как\n" "правильно запускать сервер, вы можете узнать в документации.\n" -#: main/main.c:408 +#: main/main.c:410 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: фактический и эффективный ID пользователя должны совпадать\n" -#: main/main.c:415 +#: main/main.c:417 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -17764,8 +17776,8 @@ msgstr "отношение \"%s\" не имеет составного типа" msgid "unrecognized JSON encoding: %s" msgstr "нераспознанная кодировка JSON: %s" -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: 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 #: utils/fmgr/funcapi.c:669 #, c-format @@ -17816,7 +17828,7 @@ 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:1053 +#: optimizer/plan/planner.c:4677 optimizer/prep/prepunion.c:1052 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " @@ -17861,7 +17873,7 @@ msgid "All column datatypes must be hashable." msgstr "Все столбцы должны иметь хешируемые типы данных." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1051 #, c-format msgid "could not implement %s" msgstr "не удалось реализовать %s" @@ -18853,112 +18865,112 @@ msgid "argument of %s must not return a set" msgstr "аргумент конструкции %s не должен возвращать множество" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "в конструкции %s типы %s и %s не имеют общего" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "типы аргументов %s и %s не имеют общего" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "в конструкции %s нельзя преобразовать тип %s в %s" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "аргументы, объявленные как \"%s\", должны быть однотипными" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 #: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, объявленный как \"%s\", оказался не массивом, а типом %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 #: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, объявленный как \"%s\", имеет не диапазонный тип, а %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "аргумент, объявленный как \"%s\", имеет не мультидиапазонный тип, а %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "тип элемента аргумента \"anyarray\" определить нельзя" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, объявленный как \"%s\", не согласуется с аргументом %s" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "" "не удалось определить полиморфный тип, так как входные аргументы имеют тип %s" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "" "в нарушение объявления \"anynonarray\" соответствующий аргумент оказался " "массивом: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "" "в нарушение объявления \"anyenum\" соответствующий аргумент оказался не " "перечислением: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "" "аргументы семейства anycompatible не могут быть приведены к общему типу" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "" "не удалось определить полиморфный тип %s, так как входные аргументы имеют " "тип %s" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "тип %s (anycompatiblerange) не соответствует типу %s (anycompatible)" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "" "тип %s (anycompatiblemultirange) не соответствует типу %s (anycompatible)" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "" "в нарушение объявления \"anycompatiblenonarray\" соответствующий аргумент " "оказался массивом: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "" "A result of type %s requires at least one input of type anyrange or " @@ -18967,7 +18979,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа anyrange или " "anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatiblerange " @@ -18976,7 +18988,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа " "anycompatiblerange или anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "" "A result of type %s requires at least one input of type anyelement, " @@ -18985,7 +18997,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа anyelement, " "anyarray, anynonarray, anyenum, anyrange или anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatible, " @@ -18996,7 +19008,7 @@ msgstr "" "anycompatiblearray, anycompatiblenonarray, anycompatiblerange или " "anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "" "Для результата типа internal требуется минимум один аргумент типа internal." @@ -20567,7 +20579,7 @@ msgstr "" "UPDATE или DELETE" #: parser/parse_utilcmd.c:3174 parser/parse_utilcmd.c:3275 -#: rewrite/rewriteHandler.c:540 rewrite/rewriteManip.c:1087 +#: rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1088 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "условные операторы UNION/INTERSECT/EXCEPT не реализованы" @@ -20943,14 +20955,14 @@ msgid "huge pages not supported with the current shared_memory_type setting" msgstr "" "огромные страницы не поддерживаются с текущим значением shared_memory_type" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1358 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1402 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "ранее выделенный блок разделяемой памяти (ключ %lu, ID %lu) по-прежнему " "используется" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1360 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1404 #, c-format msgid "" "Terminate any old server processes associated with data directory \"%s\"." @@ -21145,32 +21157,32 @@ msgid "could not fork autovacuum worker process: %m" msgstr "не удалось породить рабочий процесс автоочистки: %m" # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2353 +#: postmaster/autovacuum.c:2355 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: удаление устаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2589 +#: postmaster/autovacuum.c:2591 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматическая очистка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2592 +#: postmaster/autovacuum.c:2594 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматический анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2786 +#: postmaster/autovacuum.c:2788 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей записи для отношения \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3400 +#: postmaster/autovacuum.c:3402 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3401 +#: postmaster/autovacuum.c:3403 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." @@ -21449,27 +21461,27 @@ msgstr "%s: не удалось записать внешний файл PID \"% msgid "could not load %s" msgstr "не удалось загрузить %s" -#: postmaster/postmaster.c:1434 +#: postmaster/postmaster.c:1436 #, c-format msgid "postmaster became multithreaded during startup" msgstr "процесс postmaster стал многопоточным при запуске" -#: postmaster/postmaster.c:1435 +#: postmaster/postmaster.c:1437 postmaster/postmaster.c:5062 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Установите в переменной окружения LC_ALL правильную локаль." -#: postmaster/postmaster.c:1536 +#: postmaster/postmaster.c:1538 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не удалось найти путь к собственному исполняемому файлу" -#: postmaster/postmaster.c:1543 +#: postmaster/postmaster.c:1545 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: подходящий исполняемый файл postgres не найден" -#: postmaster/postmaster.c:1566 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1568 utils/misc/tzparser.c:340 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -21478,7 +21490,7 @@ msgstr "" "Возможно, PostgreSQL установлен не полностью или файла \"%s\" нет в " "положенном месте." -#: postmaster/postmaster.c:1593 +#: postmaster/postmaster.c:1595 #, c-format msgid "" "%s: could not find the database system\n" @@ -21491,39 +21503,39 @@ msgstr "" # well-spelled: неподчиняющимся #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1890 +#: postmaster/postmaster.c:1892 #, c-format msgid "issuing %s to recalcitrant children" msgstr "неподчиняющимся потомкам посылается %s" -#: postmaster/postmaster.c:1912 +#: postmaster/postmaster.c:1914 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" msgstr "" "немедленное отключение из-за ошибочного файла блокировки каталога данных" -#: postmaster/postmaster.c:1987 postmaster/postmaster.c:2015 +#: postmaster/postmaster.c:1989 postmaster/postmaster.c:2017 #, c-format msgid "incomplete startup packet" msgstr "неполный стартовый пакет" -#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2032 +#: postmaster/postmaster.c:2001 postmaster/postmaster.c:2034 #, c-format msgid "invalid length of startup packet" msgstr "неверная длина стартового пакета" -#: postmaster/postmaster.c:2061 +#: postmaster/postmaster.c:2063 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "не удалось отправить ответ в процессе SSL-согласования: %m" -#: postmaster/postmaster.c:2079 +#: postmaster/postmaster.c:2081 #, c-format msgid "received unencrypted data after SSL request" msgstr "после запроса SSL получены незашифрованные данные" -#: postmaster/postmaster.c:2080 postmaster/postmaster.c:2124 +#: postmaster/postmaster.c:2082 postmaster/postmaster.c:2126 #, c-format msgid "" "This could be either a client-software bug or evidence of an attempted man-" @@ -21532,439 +21544,439 @@ msgstr "" "Это может свидетельствовать об ошибке в клиентском ПО или о попытке атаки " "MITM." -#: postmaster/postmaster.c:2105 +#: postmaster/postmaster.c:2107 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "не удалось отправить ответ в процессе согласования GSSAPI: %m" -#: postmaster/postmaster.c:2123 +#: postmaster/postmaster.c:2125 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "после запроса шифрования GSSAPI получены незашифрованные данные" -#: postmaster/postmaster.c:2147 +#: postmaster/postmaster.c:2149 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "" "неподдерживаемый протокол клиентского приложения %u.%u; сервер поддерживает " "%u.0 - %u.%u" -#: postmaster/postmaster.c:2214 +#: postmaster/postmaster.c:2216 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Допустимые значения: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2255 +#: postmaster/postmaster.c:2257 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "неверная структура стартового пакета: последним байтом должен быть терминатор" -#: postmaster/postmaster.c:2272 +#: postmaster/postmaster.c:2274 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "в стартовом пакете не указано имя пользователя PostgreSQL" -#: postmaster/postmaster.c:2336 +#: postmaster/postmaster.c:2338 #, c-format msgid "the database system is starting up" msgstr "система баз данных запускается" -#: postmaster/postmaster.c:2342 +#: postmaster/postmaster.c:2344 #, c-format msgid "the database system is not yet accepting connections" msgstr "система БД ещё не принимает подключения" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2345 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Согласованное состояние восстановления ещё не достигнуто." -#: postmaster/postmaster.c:2347 +#: postmaster/postmaster.c:2349 #, c-format msgid "the database system is not accepting connections" msgstr "система БД не принимает подключения" -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2350 #, c-format msgid "Hot standby mode is disabled." msgstr "Режим горячего резерва отключён." -#: postmaster/postmaster.c:2353 +#: postmaster/postmaster.c:2355 #, c-format msgid "the database system is shutting down" msgstr "система баз данных останавливается" -#: postmaster/postmaster.c:2358 +#: postmaster/postmaster.c:2360 #, c-format msgid "the database system is in recovery mode" msgstr "система баз данных в режиме восстановления" -#: postmaster/postmaster.c:2363 storage/ipc/procarray.c:491 +#: postmaster/postmaster.c:2365 storage/ipc/procarray.c:491 #: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 #, c-format msgid "sorry, too many clients already" msgstr "извините, уже слишком много клиентов" -#: postmaster/postmaster.c:2450 +#: postmaster/postmaster.c:2452 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильный ключ в запросе на отмену процесса %d" -#: postmaster/postmaster.c:2462 +#: postmaster/postmaster.c:2464 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "процесс с кодом %d, полученным в запросе на отмену, не найден" -#: postmaster/postmaster.c:2729 +#: postmaster/postmaster.c:2730 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "получен SIGHUP, файлы конфигурации перезагружаются" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2753 postmaster/postmaster.c:2757 +#: postmaster/postmaster.c:2754 postmaster/postmaster.c:2758 #, c-format msgid "%s was not reloaded" msgstr "%s не был перезагружен" -#: postmaster/postmaster.c:2767 +#: postmaster/postmaster.c:2768 #, c-format msgid "SSL configuration was not reloaded" msgstr "конфигурация SSL не была перезагружена" -#: postmaster/postmaster.c:2857 +#: postmaster/postmaster.c:2858 #, c-format msgid "received smart shutdown request" msgstr "получен запрос на \"вежливое\" выключение" -#: postmaster/postmaster.c:2898 +#: postmaster/postmaster.c:2899 #, c-format msgid "received fast shutdown request" msgstr "получен запрос на быстрое выключение" -#: postmaster/postmaster.c:2916 +#: postmaster/postmaster.c:2917 #, c-format msgid "aborting any active transactions" msgstr "прерывание всех активных транзакций" -#: postmaster/postmaster.c:2940 +#: postmaster/postmaster.c:2941 #, c-format msgid "received immediate shutdown request" msgstr "получен запрос на немедленное выключение" -#: postmaster/postmaster.c:3016 +#: postmaster/postmaster.c:3017 #, c-format msgid "shutdown at recovery target" msgstr "выключение при достижении цели восстановления" -#: postmaster/postmaster.c:3034 postmaster/postmaster.c:3070 +#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 msgid "startup process" msgstr "стартовый процесс" -#: postmaster/postmaster.c:3037 +#: postmaster/postmaster.c:3038 #, c-format msgid "aborting startup due to startup process failure" msgstr "прерывание запуска из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:3110 +#: postmaster/postmaster.c:3111 #, c-format msgid "database system is ready to accept connections" msgstr "система БД готова принимать подключения" -#: postmaster/postmaster.c:3131 +#: postmaster/postmaster.c:3132 msgid "background writer process" msgstr "процесс фоновой записи" -#: postmaster/postmaster.c:3178 +#: postmaster/postmaster.c:3179 msgid "checkpointer process" msgstr "процесс контрольных точек" -#: postmaster/postmaster.c:3194 +#: postmaster/postmaster.c:3195 msgid "WAL writer process" msgstr "процесс записи WAL" -#: postmaster/postmaster.c:3209 +#: postmaster/postmaster.c:3210 msgid "WAL receiver process" msgstr "процесс считывания WAL" -#: postmaster/postmaster.c:3224 +#: postmaster/postmaster.c:3225 msgid "autovacuum launcher process" msgstr "процесс запуска автоочистки" -#: postmaster/postmaster.c:3242 +#: postmaster/postmaster.c:3243 msgid "archiver process" msgstr "процесс архивации" -#: postmaster/postmaster.c:3255 +#: postmaster/postmaster.c:3256 msgid "system logger process" msgstr "процесс системного протоколирования" -#: postmaster/postmaster.c:3312 +#: postmaster/postmaster.c:3313 #, c-format msgid "background worker \"%s\"" msgstr "фоновый процесс \"%s\"" -#: postmaster/postmaster.c:3391 postmaster/postmaster.c:3411 -#: postmaster/postmaster.c:3418 postmaster/postmaster.c:3436 +#: postmaster/postmaster.c:3392 postmaster/postmaster.c:3412 +#: postmaster/postmaster.c:3419 postmaster/postmaster.c:3437 msgid "server process" msgstr "процесс сервера" -#: postmaster/postmaster.c:3490 +#: postmaster/postmaster.c:3491 #, c-format msgid "terminating any other active server processes" msgstr "завершение всех остальных активных серверных процессов" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3665 +#: postmaster/postmaster.c:3666 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершился с кодом выхода %d" -#: postmaster/postmaster.c:3667 postmaster/postmaster.c:3679 -#: postmaster/postmaster.c:3689 postmaster/postmaster.c:3700 +#: postmaster/postmaster.c:3668 postmaster/postmaster.c:3680 +#: postmaster/postmaster.c:3690 postmaster/postmaster.c:3701 #, c-format msgid "Failed process was running: %s" msgstr "Завершившийся процесс выполнял действие: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3676 +#: postmaster/postmaster.c:3677 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) был прерван исключением 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3686 +#: postmaster/postmaster.c:3687 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) был завершён по сигналу %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3698 +#: postmaster/postmaster.c:3699 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершился с нераспознанным кодом состояния %d" -#: postmaster/postmaster.c:3906 +#: postmaster/postmaster.c:3907 #, c-format msgid "abnormal database system shutdown" msgstr "аварийное выключение системы БД" -#: postmaster/postmaster.c:3932 +#: postmaster/postmaster.c:3933 #, c-format msgid "shutting down due to startup process failure" msgstr "сервер останавливается из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:3938 +#: postmaster/postmaster.c:3939 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "сервер останавливается, так как параметр restart_after_crash равен off" -#: postmaster/postmaster.c:3950 +#: postmaster/postmaster.c:3951 #, c-format msgid "all server processes terminated; reinitializing" msgstr "все серверные процессы завершены... переинициализация" -#: postmaster/postmaster.c:4144 postmaster/postmaster.c:5462 -#: postmaster/postmaster.c:5860 +#: postmaster/postmaster.c:4145 postmaster/postmaster.c:5464 +#: postmaster/postmaster.c:5862 #, c-format msgid "could not generate random cancel key" msgstr "не удалось сгенерировать случайный ключ отмены" -#: postmaster/postmaster.c:4206 +#: postmaster/postmaster.c:4207 #, c-format msgid "could not fork new process for connection: %m" msgstr "породить новый процесс для соединения не удалось: %m" -#: postmaster/postmaster.c:4248 +#: postmaster/postmaster.c:4249 msgid "could not fork new process for connection: " msgstr "породить новый процесс для соединения не удалось: " -#: postmaster/postmaster.c:4354 +#: postmaster/postmaster.c:4355 #, c-format msgid "connection received: host=%s port=%s" msgstr "принято подключение: узел=%s порт=%s" -#: postmaster/postmaster.c:4359 +#: postmaster/postmaster.c:4360 #, c-format msgid "connection received: host=%s" msgstr "принято подключение: узел=%s" -#: postmaster/postmaster.c:4596 +#: postmaster/postmaster.c:4597 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "запустить серверный процесс \"%s\" не удалось: %m" -#: postmaster/postmaster.c:4654 +#: postmaster/postmaster.c:4655 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "" "создать отображение файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4663 +#: postmaster/postmaster.c:4664 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "" "отобразить файл серверных параметров в память не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4690 +#: postmaster/postmaster.c:4691 #, c-format msgid "subprocess command line too long" msgstr "слишком длинная командная строка подпроцесса" -#: postmaster/postmaster.c:4708 +#: postmaster/postmaster.c:4709 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "ошибка в CreateProcess(): %m (код ошибки: %lu)" -#: postmaster/postmaster.c:4735 +#: postmaster/postmaster.c:4736 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "" "отключить отображение файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4740 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "" "закрыть указатель файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4761 +#: postmaster/postmaster.c:4762 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "" "число повторных попыток резервирования разделяемой памяти достигло предела" -#: postmaster/postmaster.c:4762 +#: postmaster/postmaster.c:4763 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Это может быть вызвано антивирусным ПО или механизмом ASLR." -#: postmaster/postmaster.c:4935 +#: postmaster/postmaster.c:4936 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "не удалось загрузить конфигурацию SSL в дочерний процесс" -#: postmaster/postmaster.c:5060 +#: postmaster/postmaster.c:5061 #, c-format -msgid "Please report this to <%s>." -msgstr "Пожалуйста, напишите об этой ошибке по адресу <%s>." +msgid "postmaster became multithreaded" +msgstr "процесс postmaster стал многопоточным" -#: postmaster/postmaster.c:5128 +#: postmaster/postmaster.c:5130 #, c-format msgid "database system is ready to accept read-only connections" msgstr "система БД готова принимать подключения в режиме \"только чтение\"" -#: postmaster/postmaster.c:5386 +#: postmaster/postmaster.c:5388 #, c-format msgid "could not fork startup process: %m" msgstr "породить стартовый процесс не удалось: %m" -#: postmaster/postmaster.c:5390 +#: postmaster/postmaster.c:5392 #, c-format msgid "could not fork archiver process: %m" msgstr "породить процесс архиватора не удалось: %m" -#: postmaster/postmaster.c:5394 +#: postmaster/postmaster.c:5396 #, c-format msgid "could not fork background writer process: %m" msgstr "породить процесс фоновой записи не удалось: %m" -#: postmaster/postmaster.c:5398 +#: postmaster/postmaster.c:5400 #, c-format msgid "could not fork checkpointer process: %m" msgstr "породить процесс контрольных точек не удалось: %m" -#: postmaster/postmaster.c:5402 +#: postmaster/postmaster.c:5404 #, c-format msgid "could not fork WAL writer process: %m" msgstr "породить процесс записи WAL не удалось: %m" -#: postmaster/postmaster.c:5406 +#: postmaster/postmaster.c:5408 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "породить процесс считывания WAL не удалось: %m" -#: postmaster/postmaster.c:5410 +#: postmaster/postmaster.c:5412 #, c-format msgid "could not fork process: %m" msgstr "породить процесс не удалось: %m" -#: postmaster/postmaster.c:5611 postmaster/postmaster.c:5638 +#: postmaster/postmaster.c:5613 postmaster/postmaster.c:5640 #, c-format msgid "database connection requirement not indicated during registration" msgstr "" "при регистрации фонового процесса не указывалось, что ему требуется " "подключение к БД" -#: postmaster/postmaster.c:5622 postmaster/postmaster.c:5649 +#: postmaster/postmaster.c:5624 postmaster/postmaster.c:5651 #, c-format msgid "invalid processing mode in background worker" msgstr "неправильный режим обработки в фоновом процессе" -#: postmaster/postmaster.c:5734 +#: postmaster/postmaster.c:5736 #, c-format msgid "could not fork worker process: %m" msgstr "породить рабочий процесс не удалось: %m" -#: postmaster/postmaster.c:5846 +#: postmaster/postmaster.c:5848 #, c-format msgid "no slot available for new worker process" msgstr "для нового рабочего процесса не нашлось свободного слота" -#: postmaster/postmaster.c:6177 +#: postmaster/postmaster.c:6179 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "" "продублировать сокет %d для серверного процесса не удалось (код ошибки: %d)" -#: postmaster/postmaster.c:6209 +#: postmaster/postmaster.c:6211 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "создать наследуемый сокет не удалось (код ошибки: %d)\n" -#: postmaster/postmaster.c:6238 +#: postmaster/postmaster.c:6240 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "открыть файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6245 +#: postmaster/postmaster.c:6247 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "прочитать файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6254 +#: postmaster/postmaster.c:6256 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "не удалось стереть файл \"%s\": %s\n" -#: postmaster/postmaster.c:6271 +#: postmaster/postmaster.c:6273 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "отобразить файл серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6280 +#: postmaster/postmaster.c:6282 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "" "отключить отображение файла серверных переменных не удалось (код ошибки: " "%lu)\n" -#: postmaster/postmaster.c:6287 +#: postmaster/postmaster.c:6289 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "" "закрыть указатель файла серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6446 +#: postmaster/postmaster.c:6448 #, c-format msgid "could not read exit code for process\n" msgstr "прочитать код завершения процесса не удалось\n" -#: postmaster/postmaster.c:6488 +#: postmaster/postmaster.c:6490 #, c-format msgid "could not post child completion status\n" msgstr "отправить состояние завершения потомка не удалось\n" @@ -22971,22 +22983,22 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " "\"%s\", в транзакции %u, конечная позиция %X/%X" -#: replication/pgoutput/pgoutput.c:317 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "invalid proto_version" msgstr "неверное значение proto_version" -#: replication/pgoutput/pgoutput.c:322 +#: replication/pgoutput/pgoutput.c:329 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значение proto_verson \"%s\" вне диапазона" -#: replication/pgoutput/pgoutput.c:339 +#: replication/pgoutput/pgoutput.c:346 #, c-format msgid "invalid publication_names syntax" msgstr "неверный синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:440 +#: replication/pgoutput/pgoutput.c:466 #, c-format msgid "" "client sent proto_version=%d but server only supports protocol %d or lower" @@ -22994,7 +23006,7 @@ msgstr "" "клиент передал proto_version=%d, но сервер поддерживает только протокол %d и " "ниже" -#: replication/pgoutput/pgoutput.c:446 +#: replication/pgoutput/pgoutput.c:472 #, c-format msgid "" "client sent proto_version=%d but server only supports protocol %d or higher" @@ -23002,12 +23014,12 @@ msgstr "" "клиент передал proto_version=%d, но сервер поддерживает только протокол %d и " "выше" -#: replication/pgoutput/pgoutput.c:452 +#: replication/pgoutput/pgoutput.c:478 #, c-format msgid "publication_names parameter missing" msgstr "отсутствует параметр publication_names" -#: replication/pgoutput/pgoutput.c:466 +#: replication/pgoutput/pgoutput.c:492 #, c-format msgid "" "requested proto_version=%d does not support streaming, need %d or higher" @@ -23015,7 +23027,7 @@ msgstr "" "запрошенная версия proto_version=%d не поддерживает потоковую передачу, " "требуется версия %d или выше" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:498 #, c-format msgid "" "requested proto_version=%d does not support parallel streaming, need %d or " @@ -23024,12 +23036,12 @@ msgstr "" "запрошенная версия proto_version=%d не поддерживает параллельную потоковую " "передачу, требуется версия %d или выше" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:503 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запрошена потоковая передача, но она не поддерживается модулем вывода" -#: replication/pgoutput/pgoutput.c:494 +#: replication/pgoutput/pgoutput.c:520 #, c-format msgid "" "requested proto_version=%d does not support two-phase commit, need %d or " @@ -23038,7 +23050,7 @@ msgstr "" "запрошенная версия proto_version=%d не поддерживает двухфазную фиксацию, " "требуется версия %d или выше" -#: replication/pgoutput/pgoutput.c:499 +#: replication/pgoutput/pgoutput.c:525 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "запрошена двухфазная фиксация, но она не поддерживается модулем вывода" @@ -23398,7 +23410,7 @@ msgstr "не удалось записать в сегмент WAL %s (смещ msgid "cannot use %s with a logical replication slot" msgstr "использовать %s со слотом логической репликации нельзя" -#: replication/walsender.c:623 storage/smgr/md.c:1529 +#: replication/walsender.c:623 storage/smgr/md.c:1541 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не удалось перейти к концу файла \"%s\": %m" @@ -23719,7 +23731,7 @@ msgstr "правило \"%s\" для отношения\"%s\" не сущест msgid "renaming an ON SELECT rule is not allowed" msgstr "переименовывать правило ON SELECT нельзя" -#: rewrite/rewriteHandler.c:584 +#: rewrite/rewriteHandler.c:590 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " @@ -23728,7 +23740,7 @@ msgstr "" "имя запроса WITH \"%s\" оказалось и в действии правила, и в переписываемом " "запросе" -#: rewrite/rewriteHandler.c:611 +#: rewrite/rewriteHandler.c:617 #, c-format msgid "" "INSERT ... SELECT rule actions are not supported for queries having data-" @@ -23737,118 +23749,118 @@ msgstr "" "правила INSERT ... SELECT не поддерживаются для запросов с операторами, " "изменяющими данные, в WITH" -#: rewrite/rewriteHandler.c:664 +#: rewrite/rewriteHandler.c:670 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING можно определить только для одного правила" -#: rewrite/rewriteHandler.c:896 rewrite/rewriteHandler.c:935 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:941 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "в столбец \"%s\" можно вставить только значение по умолчанию" -#: rewrite/rewriteHandler.c:898 rewrite/rewriteHandler.c:964 +#: rewrite/rewriteHandler.c:904 rewrite/rewriteHandler.c:970 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "" "Столбец \"%s\" является столбцом идентификации со свойством GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:900 +#: rewrite/rewriteHandler.c:906 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Для переопределения укажите OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:962 rewrite/rewriteHandler.c:970 +#: rewrite/rewriteHandler.c:968 rewrite/rewriteHandler.c:976 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "столбцу \"%s\" можно присвоить только значение DEFAULT" -#: rewrite/rewriteHandler.c:1117 rewrite/rewriteHandler.c:1135 +#: rewrite/rewriteHandler.c:1111 rewrite/rewriteHandler.c:1129 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "многочисленные присвоения одному столбцу \"%s\"" -#: rewrite/rewriteHandler.c:1749 rewrite/rewriteHandler.c:3125 +#: rewrite/rewriteHandler.c:1733 rewrite/rewriteHandler.c:3158 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "доступ к несистемному представлению \"%s\" ограничен" -#: rewrite/rewriteHandler.c:2128 rewrite/rewriteHandler.c:4064 +#: rewrite/rewriteHandler.c:2131 rewrite/rewriteHandler.c:4097 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в правилах для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2213 +#: rewrite/rewriteHandler.c:2236 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в политике для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2566 msgid "Junk view columns are not updatable." msgstr "Утилизируемые столбцы представлений не обновляются." -#: rewrite/rewriteHandler.c:2538 +#: rewrite/rewriteHandler.c:2571 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" "Столбцы представлений, не являющиеся столбцами базовых отношений, не " "обновляются." -#: rewrite/rewriteHandler.c:2541 +#: rewrite/rewriteHandler.c:2574 msgid "View columns that refer to system columns are not updatable." msgstr "" "Столбцы представлений, ссылающиеся на системные столбцы, не обновляются." -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2577 msgid "View columns that return whole-row references are not updatable." msgstr "" "Столбцы представлений, возвращающие ссылки на всю строку, не обновляются." -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2638 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Представления с DISTINCT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2641 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Представления с GROUP BY не обновляются автоматически." -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2644 msgid "Views containing HAVING are not automatically updatable." msgstr "Представления с HAVING не обновляются автоматически." -#: rewrite/rewriteHandler.c:2614 +#: rewrite/rewriteHandler.c:2647 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" "Представления с UNION, INTERSECT или EXCEPT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2617 +#: rewrite/rewriteHandler.c:2650 msgid "Views containing WITH are not automatically updatable." msgstr "Представления с WITH не обновляются автоматически." -#: rewrite/rewriteHandler.c:2620 +#: rewrite/rewriteHandler.c:2653 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Представления с LIMIT или OFFSET не обновляются автоматически." -#: rewrite/rewriteHandler.c:2632 +#: rewrite/rewriteHandler.c:2665 msgid "Views that return aggregate functions are not automatically updatable." msgstr "" "Представления, возвращающие агрегатные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2635 +#: rewrite/rewriteHandler.c:2668 msgid "Views that return window functions are not automatically updatable." msgstr "" "Представления, возвращающие оконные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2638 +#: rewrite/rewriteHandler.c:2671 msgid "" "Views that return set-returning functions are not automatically updatable." msgstr "" "Представления, возвращающие функции с результатом-множеством, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:2645 rewrite/rewriteHandler.c:2649 -#: rewrite/rewriteHandler.c:2657 +#: rewrite/rewriteHandler.c:2678 rewrite/rewriteHandler.c:2682 +#: rewrite/rewriteHandler.c:2690 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." @@ -23856,27 +23868,27 @@ msgstr "" "Представления, выбирающие данные не из одной таблицы или представления, не " "обновляются автоматически." -#: rewrite/rewriteHandler.c:2660 +#: rewrite/rewriteHandler.c:2693 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Представления, содержащие TABLESAMPLE, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2684 +#: rewrite/rewriteHandler.c:2717 msgid "Views that have no updatable columns are not automatically updatable." msgstr "" "Представления, не содержащие обновляемых столбцов, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:3185 +#: rewrite/rewriteHandler.c:3218 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставить данные в столбец \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3193 +#: rewrite/rewriteHandler.c:3226 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "изменить данные в столбце \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3691 +#: rewrite/rewriteHandler.c:3724 #, c-format msgid "" "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " @@ -23885,7 +23897,7 @@ msgstr "" "правила DO INSTEAD NOTIFY не поддерживаются в операторах, изменяющих данные, " "в WITH" -#: rewrite/rewriteHandler.c:3702 +#: rewrite/rewriteHandler.c:3735 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " @@ -23894,7 +23906,7 @@ msgstr "" "правила DO INSTEAD NOTHING не поддерживаются в операторах, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3716 +#: rewrite/rewriteHandler.c:3749 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " @@ -23903,13 +23915,13 @@ msgstr "" "условные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3720 +#: rewrite/rewriteHandler.c:3753 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "" "правила DO ALSO не поддерживаются для операторов, изменяющих данные, в WITH" -#: rewrite/rewriteHandler.c:3725 +#: rewrite/rewriteHandler.c:3758 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " @@ -23918,8 +23930,8 @@ msgstr "" "составные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3992 rewrite/rewriteHandler.c:4000 -#: rewrite/rewriteHandler.c:4008 +#: rewrite/rewriteHandler.c:4025 rewrite/rewriteHandler.c:4033 +#: rewrite/rewriteHandler.c:4041 #, c-format msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." @@ -23927,43 +23939,43 @@ msgstr "" "Представления в сочетании с правилами DO INSTEAD с условиями не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:4113 +#: rewrite/rewriteHandler.c:4146 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "выполнить INSERT RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4115 +#: rewrite/rewriteHandler.c:4148 #, c-format msgid "" "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON INSERT DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:4120 +#: rewrite/rewriteHandler.c:4153 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "выполнить UPDATE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4122 +#: rewrite/rewriteHandler.c:4155 #, c-format msgid "" "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON UPDATE DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:4127 +#: rewrite/rewriteHandler.c:4160 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "выполнить DELETE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4129 +#: rewrite/rewriteHandler.c:4162 #, c-format msgid "" "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" "Необходимо безусловное правило ON DELETE DO INSTEAD с предложением RETURNING." -#: rewrite/rewriteHandler.c:4147 +#: rewrite/rewriteHandler.c:4180 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " @@ -23972,7 +23984,7 @@ msgstr "" "INSERT c предложением ON CONFLICT нельзя использовать с таблицей, для " "которой заданы правила INSERT или UPDATE" -#: rewrite/rewriteHandler.c:4204 +#: rewrite/rewriteHandler.c:4237 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " @@ -23981,17 +23993,17 @@ msgstr "" "WITH нельзя использовать в запросе, преобразованном правилами в несколько " "запросов" -#: rewrite/rewriteManip.c:1075 +#: rewrite/rewriteManip.c:1076 #, c-format msgid "conditional utility statements are not implemented" msgstr "условные служебные операторы не реализованы" -#: rewrite/rewriteManip.c:1422 +#: rewrite/rewriteManip.c:1423 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "условие WHERE CURRENT OF для представлений не реализовано" -#: rewrite/rewriteManip.c:1757 +#: rewrite/rewriteManip.c:1759 #, c-format msgid "" "NEW variables in ON UPDATE rules cannot reference columns that are part of a " @@ -24147,7 +24159,7 @@ msgstr "" msgid "could not delete fileset \"%s\": %m" msgstr "ошибка удаления набора файлов \"%s\": %m" -#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1041 +#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1043 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "не удалось обрезать файл \"%s\": %m" @@ -24971,19 +24983,19 @@ msgstr "не удалось записать блок %u в файл \"%s\": %m" msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "не удалось записать блок %u в файл \"%s\" (записано байт: %d из %d)" -#: storage/smgr/md.c:1012 +#: storage/smgr/md.c:1014 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "" "не удалось обрезать файл \"%s\" (требуемая длина в блоках: %u, но сейчас он " "содержит %u)" -#: storage/smgr/md.c:1067 +#: storage/smgr/md.c:1069 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не удалось обрезать файл \"%s\" до нужного числа блоков (%u): %m" -#: storage/smgr/md.c:1494 +#: storage/smgr/md.c:1506 #, c-format msgid "" "could not open file \"%s\" (target block %u): previous segment is only %u " @@ -24992,7 +25004,7 @@ msgstr "" "не удалось открыть файл file \"%s\" (целевой блок %u): недостаточно блоков в " "предыдущем сегменте (всего %u)" -#: storage/smgr/md.c:1508 +#: storage/smgr/md.c:1520 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не удалось открыть файл file \"%s\" (целевой блок %u): %m" @@ -25418,12 +25430,12 @@ msgstr "" "число форматов результатов в сообщении Bind (%d) не равно числу столбцов в " "запросе (%d)" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "курсор может сканировать только вперёд" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Добавьте в его объявление SCROLL, чтобы он мог перемещаться назад." @@ -25747,28 +25759,28 @@ msgstr "неверный вид статистики: \"%s\"" msgid "could not open temporary statistics file \"%s\": %m" msgstr "не удалось открыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1450 +#: utils/activity/pgstat.c:1458 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не удалось записать во временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1459 +#: utils/activity/pgstat.c:1467 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не удалось закрыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1467 +#: utils/activity/pgstat.c:1475 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "не удалось переименовать временный файл статистики из \"%s\" в \"%s\": %m" -#: utils/activity/pgstat.c:1516 +#: utils/activity/pgstat.c:1524 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не удалось открыть файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1678 +#: utils/activity/pgstat.c:1686 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "файл статистики \"%s\" испорчен" @@ -28337,7 +28349,7 @@ msgstr "" #: 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:6633 utils/misc/guc.c:6667 +#: utils/adt/regexp.c:1872 utils/misc/guc.c:6668 utils/misc/guc.c:6702 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неверное значение параметра \"%s\": %d" @@ -28390,8 +28402,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:10097 -#: utils/adt/ruleutils.c:10310 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10103 +#: utils/adt/ruleutils.c:10316 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -29620,105 +29632,100 @@ msgstr "псевдоним столбца не указан" msgid "could not determine row description for function returning record" msgstr "не удалось определить описание строки для функции, возвращающей запись" -#: utils/init/miscinit.c:346 +#: utils/init/miscinit.c:347 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:351 +#: utils/init/miscinit.c:352 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не удалось прочитать права на каталог \"%s\": %m" -#: utils/init/miscinit.c:359 +#: utils/init/miscinit.c:360 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "указанный каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:375 +#: utils/init/miscinit.c:376 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "владелец каталога данных \"%s\" определён неверно" -#: utils/init/miscinit.c:377 +#: utils/init/miscinit.c:378 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "" "Сервер должен запускать пользователь, являющийся владельцем каталога данных." -#: utils/init/miscinit.c:395 +#: utils/init/miscinit.c:396 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "для каталога данных \"%s\" установлены неправильные права доступа" -#: utils/init/miscinit.c:397 +#: utils/init/miscinit.c:398 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Маска прав должна быть u=rwx (0700) или u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:455 +#: utils/init/miscinit.c:456 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалось перейти в каталог \"%s\": %m" -#: utils/init/miscinit.c:692 utils/misc/guc.c:3563 +#: utils/init/miscinit.c:726 utils/misc/guc.c:3563 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "параметр \"%s\" нельзя задать в рамках операции с ограничениями по " "безопасности" -#: utils/init/miscinit.c:764 +#: utils/init/miscinit.c:809 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: utils/init/miscinit.c:794 +#: utils/init/miscinit.c:854 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для роли \"%s\" вход запрещён" -#: utils/init/miscinit.c:812 +#: utils/init/miscinit.c:875 #, c-format msgid "too many connections for role \"%s\"" msgstr "слишком много подключений для роли \"%s\"" -#: utils/init/miscinit.c:919 -#, c-format -msgid "permission denied to set session authorization" -msgstr "нет прав для смены объекта авторизации в сеансе" - -#: utils/init/miscinit.c:1002 +#: utils/init/miscinit.c:1046 #, c-format msgid "invalid role OID: %u" msgstr "неверный OID роли: %u" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1193 #, c-format msgid "database system is shut down" msgstr "система БД выключена" -#: utils/init/miscinit.c:1236 +#: utils/init/miscinit.c:1280 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не удалось создать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1294 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не удалось открыть файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1257 +#: utils/init/miscinit.c:1301 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не удалось прочитать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1310 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокировки \"%s\" пуст" -#: utils/init/miscinit.c:1267 +#: utils/init/miscinit.c:1311 #, c-format msgid "" "Either another server is starting, or the lock file is the remnant of a " @@ -29727,38 +29734,38 @@ msgstr "" "Либо сейчас запускается другой сервер, либо этот файл остался в результате " "сбоя при предыдущем запуске." -#: utils/init/miscinit.c:1311 +#: utils/init/miscinit.c:1355 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокировки \"%s\" уже существует" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1359 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1317 +#: utils/init/miscinit.c:1361 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Другой экземпляр postmaster (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1320 +#: utils/init/miscinit.c:1364 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1322 +#: utils/init/miscinit.c:1366 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postmaster (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1373 +#: utils/init/miscinit.c:1417 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не удалось стереть старый файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1375 +#: utils/init/miscinit.c:1419 #, c-format msgid "" "The file seems accidentally left over, but it could not be removed. Please " @@ -29767,48 +29774,48 @@ msgstr "" "Кажется, файл сохранился по ошибке, но удалить его не получилось. " "Пожалуйста, удалите файл вручную и повторите попытку." -#: utils/init/miscinit.c:1412 utils/init/miscinit.c:1426 -#: utils/init/miscinit.c:1437 +#: utils/init/miscinit.c:1456 utils/init/miscinit.c:1470 +#: utils/init/miscinit.c:1481 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не удалось записать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1548 utils/init/miscinit.c:1690 utils/misc/guc.c:5603 +#: utils/init/miscinit.c:1592 utils/init/miscinit.c:1734 utils/misc/guc.c:5644 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: utils/init/miscinit.c:1678 +#: utils/init/miscinit.c:1722 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не удалось открыть файл \"%s\": %m; ошибка игнорируется" -#: utils/init/miscinit.c:1703 +#: utils/init/miscinit.c:1747 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокировки \"%s\" содержит неверный PID: %ld вместо %ld" -#: utils/init/miscinit.c:1742 utils/init/miscinit.c:1758 +#: utils/init/miscinit.c:1786 utils/init/miscinit.c:1802 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не является каталогом данных" -#: utils/init/miscinit.c:1744 +#: utils/init/miscinit.c:1788 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" отсутствует." -#: utils/init/miscinit.c:1760 +#: utils/init/miscinit.c:1804 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" содержит неприемлемые данные." -#: utils/init/miscinit.c:1762 +#: utils/init/miscinit.c:1806 #, c-format msgid "You might need to initdb." msgstr "Возможно, вам нужно выполнить initdb." -#: utils/init/miscinit.c:1770 +#: utils/init/miscinit.c:1814 #, c-format msgid "" "The data directory was initialized by PostgreSQL version %s, which is not " @@ -29893,17 +29900,17 @@ msgstr "доступ к базе \"%s\" запрещён" msgid "User does not have CONNECT privilege." msgstr "Пользователь не имеет привилегии CONNECT." -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "слишком много подключений к БД \"%s\"" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "локаль БД несовместима с операционной системой" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "" "The database was initialized with LC_COLLATE \"%s\", which is not " @@ -29912,7 +29919,7 @@ msgstr "" "База данных была инициализирована с параметром LC_COLLATE \"%s\", но сейчас " "setlocale() не воспринимает его." -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "" "Recreate the database with another locale or install the missing locale." @@ -29920,7 +29927,7 @@ msgstr "" "Пересоздайте базу данных с другой локалью или установите поддержку нужной " "локали." -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "" "The database was initialized with LC_CTYPE \"%s\", which is not recognized " @@ -29929,12 +29936,12 @@ msgstr "" "База данных была инициализирована с параметром LC_CTYPE \"%s\", но сейчас " "setlocale() не воспринимает его." -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:478 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "несовпадение версии для правила сортировки в базе данных \"%s\"" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:480 #, c-format msgid "" "The database was created using collation version %s, but the operating " @@ -29943,7 +29950,7 @@ msgstr "" "База данных была создана с версией правила сортировки %s, но операционная " "система предоставляет версию %s." -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:483 #, c-format msgid "" "Rebuild all objects in this database that use the default collation and run " @@ -29954,31 +29961,31 @@ msgstr "" "сортировки, и выполните ALTER DATABASE %s REFRESH COLLATION VERSION, либо " "соберите PostgreSQL с правильной версией библиотеки." -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:894 #, c-format msgid "no roles are defined in this database system" msgstr "в этой системе баз данных не создано ни одной роли" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:895 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Вы должны немедленно выполнить CREATE USER \"%s\" CREATEUSER;." -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:931 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "" "нужно быть суперпользователем, чтобы подключиться в режиме двоичного " "обновления" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:951 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "" "оставшиеся слоты подключений зарезервированы для подключений ролей с " "атрибутом %s" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:957 #, c-format msgid "" "remaining connection slots are reserved for roles with privileges of the " @@ -29987,32 +29994,32 @@ msgstr "" "оставшиеся слоты подключений зарезервированы для подключений ролей с правами " "роли \"%s\"" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:969 #, c-format msgid "permission denied to start WAL sender" msgstr "нет прав для запуска процесса, передающего WAL" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:970 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "Только роли с атрибутом %s могут запускать процессы, передающие WAL." -#: utils/init/postinit.c:1086 +#: utils/init/postinit.c:1088 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Похоже, она только что была удалена или переименована." -#: utils/init/postinit.c:1090 +#: utils/init/postinit.c:1092 #, c-format msgid "database %u does not exist" msgstr "база данных %u не существует" -#: utils/init/postinit.c:1099 +#: utils/init/postinit.c:1101 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "подключиться к некорректной базе \"%s\" нельзя" -#: utils/init/postinit.c:1159 +#: utils/init/postinit.c:1161 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Подкаталог базы данных \"%s\" отсутствует." @@ -30120,8 +30127,8 @@ msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "нераспознанный параметр конфигурации \"%s\" в файле \"%s\", строке %d" #: utils/misc/guc.c:461 utils/misc/guc.c:3417 utils/misc/guc.c:3661 -#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3981 -#: utils/misc/guc.c:4084 +#: utils/misc/guc.c:3759 utils/misc/guc.c:3857 utils/misc/guc.c:3984 +#: utils/misc/guc.c:4125 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "параметр \"%s\" изменяется только при перезапуске сервера" @@ -30261,7 +30268,7 @@ msgstr "%g%s%s вне диапазона, допустимого для пара msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "параметр \"%s\" нельзя установить во время параллельной операции" -#: utils/misc/guc.c:3394 utils/misc/guc.c:4545 +#: utils/misc/guc.c:3394 utils/misc/guc.c:4586 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" нельзя изменить" @@ -30271,8 +30278,8 @@ msgstr "параметр \"%s\" нельзя изменить" msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" нельзя изменить сейчас" -#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4521 -#: utils/misc/guc.c:6569 +#: utils/misc/guc.c:3454 utils/misc/guc.c:3516 utils/misc/guc.c:4562 +#: utils/misc/guc.c:6604 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "нет прав для изменения параметра \"%s\"" @@ -30299,63 +30306,63 @@ msgstr "параметр \"%s\" нельзя сбросить" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "параметр \"%s\" нельзя задавать локально в функциях" -#: utils/misc/guc.c:4227 utils/misc/guc.c:4274 utils/misc/guc.c:5288 +#: utils/misc/guc.c:4268 utils/misc/guc.c:4315 utils/misc/guc.c:5329 #, c-format msgid "permission denied to examine \"%s\"" msgstr "нет прав для просмотра параметра \"%s\"" -#: utils/misc/guc.c:4228 utils/misc/guc.c:4275 utils/misc/guc.c:5289 +#: utils/misc/guc.c:4269 utils/misc/guc.c:4316 utils/misc/guc.c:5330 #, c-format msgid "" "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "Просматривать этот параметр могут только роли с правами роли \"%s\"." -#: utils/misc/guc.c:4511 +#: utils/misc/guc.c:4552 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "нет прав для выполнения ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:4577 +#: utils/misc/guc.c:4618 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значение параметра для ALTER SYSTEM не должно быть многострочным" -#: utils/misc/guc.c:4623 +#: utils/misc/guc.c:4664 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не удалось разобрать содержимое файла \"%s\"" -#: utils/misc/guc.c:4805 +#: utils/misc/guc.c:4846 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "попытка переопределить параметр \"%s\"" -#: utils/misc/guc.c:5144 +#: utils/misc/guc.c:5185 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "неверное имя параметра конфигурации: \"%s\", он удаляется" -#: utils/misc/guc.c:5146 +#: utils/misc/guc.c:5187 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "Теперь \"%s\" — зарезервированный префикс." -#: utils/misc/guc.c:6023 +#: utils/misc/guc.c:6058 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "при назначении параметру \"%s\" значения \"%s\"" -#: utils/misc/guc.c:6192 +#: utils/misc/guc.c:6227 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" нельзя установить" -#: utils/misc/guc.c:6282 +#: utils/misc/guc.c:6317 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не удалось разобрать значение параметра \"%s\"" -#: utils/misc/guc.c:6701 +#: utils/misc/guc.c:6736 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неверное значение параметра \"%s\": %g" @@ -31066,10 +31073,10 @@ msgstr "" #: utils/misc/guc_tables.c:1633 msgid "" -"Start a subprocess to capture stderr output and/or csvlogs into log files." +"Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." msgstr "" -"Запускает подпроцесс для чтения stderr и/или csv-файлов и записи в файлы " -"протоколов." +"Запускает подпроцесс для чтения stderr, csvlog и/или jsonlog и записи в " +"файлы протоколов." #: utils/misc/guc_tables.c:1642 msgid "Truncate existing log files of same name during log rotation." @@ -33877,6 +33884,10 @@ msgstr "нестандартное использование спецсимво msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#, c-format +#~ msgid "Please report this to <%s>." +#~ msgstr "Пожалуйста, напишите об этой ошибке по адресу <%s>." + #, c-format #~ msgid "out of memory while trying to decode a record of length %u" #~ msgstr "не удалось выделить память для декодирования записи длины %u" @@ -37561,9 +37572,6 @@ msgstr "Используйте для записи спецсимволов си #~ "Для архивации WAL (archive_mode=on) wal_level должен быть \"archive\", " #~ "\"hot_standby\" или \"logical\"" -#~ msgid "postmaster became multithreaded" -#~ msgstr "процесс postmaster стал многопоточным" - #~ msgid "could not determine input data types" #~ msgstr "не удалось определить типы входных данных" diff --git a/src/bin/pg_basebackup/po/fr.po b/src/bin/pg_basebackup/po/fr.po index d55f8224b5f..b4eb82a1d06 100644 --- a/src/bin/pg_basebackup/po/fr.po +++ b/src/bin/pg_basebackup/po/fr.po @@ -1195,7 +1195,7 @@ msgid "" " time between status packets sent to server (default: %d)\n" msgstr "" " -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n" -" (par défaut %d)\n" +" serveur (par défaut %d)\n" #: pg_receivewal.c:90 #, c-format diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po index b27acff7fee..f3ea7ce2fc5 100644 --- a/src/bin/pg_basebackup/po/ja.po +++ b/src/bin/pg_basebackup/po/ja.po @@ -998,7 +998,7 @@ msgstr "データをディスクに同期しています..." #: pg_basebackup.c:2223 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" -msgstr "backup_manifest.tmp の名前を backup_manifest に変更してください" +msgstr "backup_manifest.tmp の名前を backup_manifest に変更しています" #: pg_basebackup.c:2243 #, c-format diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po index 643e10de424..6717af2c74a 100644 --- a/src/bin/pg_controldata/po/ru.po +++ b/src/bin/pg_controldata/po/ru.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_controldata (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-11-03 09:08+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2022-09-05 13:34+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -176,22 +176,22 @@ msgstr "нераспознанный код состояния" msgid "unrecognized wal_level" msgstr "нераспознанный уровень WAL" -#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 +#: pg_controldata.c:139 pg_controldata.c:157 pg_controldata.c:164 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: pg_controldata.c:154 +#: pg_controldata.c:155 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: pg_controldata.c:162 +#: pg_controldata.c:163 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format msgid "" "WARNING: Calculated CRC checksum does not match value stored in file.\n" @@ -205,12 +205,12 @@ msgstr "" "Следующая информация может быть недостоверной.\n" "\n" -#: pg_controldata.c:179 +#: pg_controldata.c:180 #, c-format msgid "WARNING: invalid WAL segment size\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: неверный размер сегмента WAL\n" -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format msgid "" "The WAL segment size stored in the file, %d byte, is not a power of two\n" @@ -241,306 +241,307 @@ msgstr[2] "" "подлежит сомнению.\n" "\n" -#: pg_controldata.c:222 +#: pg_controldata.c:206 pg_controldata.c:214 pg_controldata.c:233 +#, c-format msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:239 #, c-format msgid "pg_control version number: %u\n" msgstr "Номер версии pg_control: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:241 #, c-format msgid "Catalog version number: %u\n" msgstr "Номер версии каталога: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:243 #, c-format msgid "Database system identifier: %llu\n" msgstr "Идентификатор системы баз данных: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:245 #, c-format msgid "Database cluster state: %s\n" msgstr "Состояние кластера БД: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:247 #, c-format msgid "pg_control last modified: %s\n" msgstr "Последнее обновление pg_control: %s\n" # skip-rule: capital-letter-first -#: pg_controldata.c:238 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Положение последней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:240 +#: pg_controldata.c:251 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Положение REDO последней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:242 +#: pg_controldata.c:253 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "Файл WAL c REDO последней к. т.: %s\n" # skip-rule: capital-letter-first -#: pg_controldata.c:244 +#: pg_controldata.c:255 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Линия времени последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:246 +#: pg_controldata.c:257 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "Пред. линия времени последней к. т.: %u\n" # skip-rule: no-space-after-period -#: pg_controldata.c:248 +#: pg_controldata.c:259 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Режим full_page_writes последней к.т: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:260 pg_controldata.c:301 pg_controldata.c:313 msgid "off" msgstr "выкл." -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:260 pg_controldata.c:301 pg_controldata.c:313 msgid "on" msgstr "вкл." # skip-rule: capital-letter-first -#: pg_controldata.c:250 +#: pg_controldata.c:261 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID последней конт. точки: %u:%u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:253 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:255 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:257 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset послед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:259 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:261 +#: pg_controldata.c:272 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "БД с oldestXID последней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:263 +#: pg_controldata.c:274 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID последней к. т.: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:265 +#: pg_controldata.c:276 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid последней конт. точки: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:267 +#: pg_controldata.c:278 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "БД с oldestMulti последней к. т.: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:269 +#: pg_controldata.c:280 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid последней к. т.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_controldata.c:271 +#: pg_controldata.c:282 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid последней к. т.: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:284 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Время последней контрольной точки: %s\n" # skip-rule: capital-letter-first # well-spelled: нежурналир -#: pg_controldata.c:275 +#: pg_controldata.c:286 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Фиктивный LSN для нежурналир. таблиц: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:288 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Мин. положение конца восстановления: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:279 +#: pg_controldata.c:290 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Линия времени мин. положения к. в.: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:292 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Положение начала копии: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:294 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Положение конца копии: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:296 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Требуется запись конец-копии: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:297 msgid "no" msgstr "нет" -#: pg_controldata.c:286 +#: pg_controldata.c:297 msgid "yes" msgstr "да" -#: pg_controldata.c:287 +#: pg_controldata.c:298 #, c-format msgid "wal_level setting: %s\n" msgstr "Значение wal_level: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:300 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Значение wal_log_hints: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:302 #, c-format msgid "max_connections setting: %d\n" msgstr "Значение max_connections: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:304 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Значение max_worker_processes: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:306 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Значение max_wal_senders: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:308 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Значение max_prepared_xacts: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:310 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Значение max_locks_per_xact: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:312 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Значение track_commit_timestamp: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:314 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Макс. предел выравнивания данных: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:317 #, c-format msgid "Database block size: %u\n" msgstr "Размер блока БД: %u\n" # skip-rule: double-space -#: pg_controldata.c:308 +#: pg_controldata.c:319 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоков в макс. сегменте отношений: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:321 #, c-format msgid "WAL block size: %u\n" msgstr "Размер блока WAL: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:323 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байт в сегменте WAL: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:325 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Максимальная длина идентификаторов: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:327 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Макс. число столбцов в индексе: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:329 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Максимальный размер порции TOAST: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:331 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Размер порции большого объекта: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:334 #, c-format msgid "Date/time type storage: %s\n" msgstr "Формат хранения даты/времени: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:335 msgid "64-bit integers" msgstr "64-битные целые" -#: pg_controldata.c:325 +#: pg_controldata.c:336 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргумента float8: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:337 msgid "by reference" msgstr "по ссылке" -#: pg_controldata.c:326 +#: pg_controldata.c:337 msgid "by value" msgstr "по значению" -#: pg_controldata.c:327 +#: pg_controldata.c:338 #, c-format msgid "Data page checksum version: %u\n" msgstr "Версия контрольных сумм страниц: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:329 +#: pg_controldata.c:340 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Случ. число для псевдоаутентификации: %s\n" diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po index 4623e873880..7b6247b0d74 100644 --- a/src/bin/pg_ctl/po/ru.po +++ b/src/bin/pg_ctl/po/ru.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_ctl (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-02-08 07:45+0200\n" "PO-Revision-Date: 2024-09-07 06:47+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -53,7 +53,7 @@ msgstr "нехватка памяти" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:830 ../../port/path.c:868 ../../port/path.c:885 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" @@ -93,7 +93,7 @@ msgstr "дочерний процесс завершён по сигналу %d: msgid "child process exited with unrecognized status %d" msgstr "дочерний процесс завершился с нераспознанным кодом состояния %d" -#: ../../port/path.c:775 +#: ../../port/path.c:852 #, c-format msgid "could not get current working directory: %s\n" msgstr "не удалось определить текущий рабочий каталог: %s\n" diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po index 1e10a632ccf..796bbd988d8 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: 2024-09-19 11:24+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2024-09-07 07:35+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -436,7 +436,7 @@ msgid "could not read from input file: %s" msgstr "не удалось прочитать входной файл: %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" @@ -477,23 +477,23 @@ msgstr "не удалось завершить распаковку: %s" msgid "could not set compression parameter \"%s\": %s" msgstr "не удалось задать параметр сжатия \"%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 "не удалось инициализировать библиотеку сжатия" -#: 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 "не удалось распаковать данные: %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 "не удалось прочитать входной файл: %m" -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "необрабатываемый режим \"%s\"" @@ -2151,8 +2151,8 @@ msgstr "чтение политик защиты на уровне строк" msgid "unexpected policy command type: %c" msgstr "нераспознанный тип команды в политике: %c" -#: pg_dump.c:4472 pg_dump.c:4838 pg_dump.c:12069 pg_dump.c:17980 -#: pg_dump.c:17982 pg_dump.c:18603 +#: pg_dump.c:4472 pg_dump.c:4838 pg_dump.c:12071 pg_dump.c:17982 +#: pg_dump.c:17984 pg_dump.c:18605 #, c-format msgid "could not parse %s array" msgstr "не удалось разобрать массив %s" @@ -2173,7 +2173,7 @@ msgstr "не удалось найти родительское расширен msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: pg_dump.c:6857 pg_dump.c:17244 +#: pg_dump.c:6857 pg_dump.c:17246 #, 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:7000 +#: pg_dump.c:7002 #, 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:7231 pg_dump.c:7502 pg_dump.c:7973 pg_dump.c:8637 pg_dump.c:8756 -#: pg_dump.c:8904 +#: pg_dump.c:7233 pg_dump.c:7504 pg_dump.c:7975 pg_dump.c:8639 pg_dump.c:8758 +#: pg_dump.c:8906 #, c-format msgid "unrecognized table OID %u" msgstr "нераспознанный OID таблицы %u" -#: pg_dump.c:7235 +#: pg_dump.c:7237 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неожиданно получены данные индекса для таблицы \"%s\"" -#: pg_dump.c:7734 +#: pg_dump.c:7736 #, 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:8025 +#: pg_dump.c:8027 #, 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:8641 +#: pg_dump.c:8643 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неожиданно получены данные столбцов для таблицы \"%s\"" -#: pg_dump.c:8670 +#: pg_dump.c:8672 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неверная нумерация столбцов в таблице \"%s\"" -#: pg_dump.c:8718 +#: pg_dump.c:8720 #, c-format msgid "finding table default expressions" msgstr "поиск выражений по умолчанию для таблиц" -#: pg_dump.c:8760 +#: pg_dump.c:8762 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неверное значение adnum (%d) в таблице \"%s\"" -#: pg_dump.c:8854 +#: pg_dump.c:8856 #, c-format msgid "finding table check constraints" msgstr "поиск ограничений-проверок для таблиц" -#: pg_dump.c:8908 +#: pg_dump.c:8910 #, 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:8912 +#: pg_dump.c:8914 #, c-format msgid "The system catalogs might be corrupted." msgstr "Возможно, повреждены системные каталоги." -#: pg_dump.c:9602 +#: pg_dump.c:9604 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: pg_dump.c:9714 pg_dump.c:9743 +#: pg_dump.c:9716 pg_dump.c:9745 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "неподдерживаемая запись в pg_init_privs: %u %u %d" -#: pg_dump.c:10564 +#: pg_dump.c:10566 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный тип типа" # TO REVEIW -#: pg_dump.c:12138 +#: pg_dump.c:12140 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "недопустимое значение provolatile для функции \"%s\"" # TO REVEIW -#: pg_dump.c:12188 pg_dump.c:14070 +#: pg_dump.c:12190 pg_dump.c:14072 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "недопустимое значение proparallel для функции \"%s\"" -#: pg_dump.c:12318 pg_dump.c:12424 pg_dump.c:12431 +#: pg_dump.c:12320 pg_dump.c:12426 pg_dump.c:12433 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не удалось найти определение функции для функции с OID %u" -#: pg_dump.c:12357 +#: pg_dump.c:12359 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod" -#: pg_dump.c:12360 +#: pg_dump.c:12362 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castmethod" -#: pg_dump.c:12450 +#: pg_dump.c:12452 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " @@ -2311,62 +2311,62 @@ msgstr "" "неприемлемое определение преобразования (trffromsql или trftosql должно быть " "ненулевым)" -#: pg_dump.c:12467 +#: pg_dump.c:12469 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприемлемое значение в поле pg_transform.trffromsql" -#: pg_dump.c:12488 +#: pg_dump.c:12490 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприемлемое значение в поле pg_transform.trftosql" -#: pg_dump.c:12633 +#: pg_dump.c:12635 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "постфиксные операторы больше не поддерживаются (оператор \"%s\")" -#: pg_dump.c:12803 +#: pg_dump.c:12805 #, c-format msgid "could not find operator with OID %s" msgstr "оператор с OID %s не найден" -#: pg_dump.c:12871 +#: pg_dump.c:12873 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неверный тип \"%c\" метода доступа \"%s\"" -#: pg_dump.c:13540 pg_dump.c:13599 +#: pg_dump.c:13542 pg_dump.c:13601 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераспознанный провайдер правил сортировки: %s" -#: pg_dump.c:13549 pg_dump.c:13558 pg_dump.c:13568 pg_dump.c:13583 +#: pg_dump.c:13551 pg_dump.c:13560 pg_dump.c:13570 pg_dump.c:13585 #, c-format msgid "invalid collation \"%s\"" msgstr "неверное правило сортировки \"%s\"" -#: pg_dump.c:13989 +#: pg_dump.c:13991 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14045 +#: pg_dump.c:14047 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggmfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14762 +#: pg_dump.c:14764 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нераспознанный тип объекта в определении прав по умолчанию: %d" -#: pg_dump.c:14778 +#: pg_dump.c:14780 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не удалось разобрать список прав по умолчанию (%s)" -#: pg_dump.c:14860 +#: pg_dump.c:14862 #, 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:14885 +#: pg_dump.c:14887 #, 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:15426 +#: pg_dump.c:15428 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "" "запрос на получение определения представления \"%s\" не возвратил данные" -#: pg_dump.c:15429 +#: pg_dump.c:15431 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" @@ -2395,49 +2395,49 @@ msgstr "" "запрос на получение определения представления \"%s\" возвратил несколько " "определений" -#: pg_dump.c:15436 +#: pg_dump.c:15438 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "определение представления \"%s\" пустое (длина равна нулю)" -#: pg_dump.c:15520 +#: pg_dump.c:15522 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")" -#: pg_dump.c:16444 +#: pg_dump.c:16446 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер столбца %d для таблицы \"%s\"" -#: pg_dump.c:16522 +#: pg_dump.c:16524 #, c-format msgid "could not parse index statistic columns" msgstr "не удалось разобрать столбцы статистики в индексе" -#: pg_dump.c:16524 +#: pg_dump.c:16526 #, c-format msgid "could not parse index statistic values" msgstr "не удалось разобрать значения статистики в индексе" -#: pg_dump.c:16526 +#: pg_dump.c:16528 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "" "столбцы, задающие статистику индекса, не соответствуют значениям по " "количеству" -#: pg_dump.c:16742 +#: pg_dump.c:16744 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отсутствует индекс для ограничения \"%s\"" -#: pg_dump.c:16977 +#: pg_dump.c:16979 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераспознанный тип ограничения: %c" -#: pg_dump.c:17078 pg_dump.c:17308 +#: pg_dump.c:17080 pg_dump.c:17310 #, 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:17110 +#: pg_dump.c:17112 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераспознанный тип последовательности: %s" -#: pg_dump.c:17400 +#: pg_dump.c:17402 #, c-format msgid "unexpected tgtype value: %d" msgstr "неожиданное значение tgtype: %d" -#: pg_dump.c:17472 +#: pg_dump.c:17474 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "неверная строка аргументов (%s) для триггера \"%s\" таблицы \"%s\"" -#: pg_dump.c:17741 +#: pg_dump.c:17743 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2476,27 +2476,27 @@ msgstr "" "запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное " "число строк" -#: pg_dump.c:17894 +#: pg_dump.c:17896 #, c-format msgid "could not find referenced extension %u" msgstr "не удалось найти упомянутое расширение %u" -#: pg_dump.c:17984 +#: pg_dump.c:17986 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "конфигурации расширения не соответствуют условиям по количеству" -#: pg_dump.c:18116 +#: pg_dump.c:18118 #, c-format msgid "reading dependency data" msgstr "чтение информации о зависимостях" -#: pg_dump.c:18202 +#: pg_dump.c:18204 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:18213 +#: pg_dump.c:18215 #, c-format msgid "no referenced object %u %u" msgstr "нет вышестоящего объекта %u %u" diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index 4274635fefb..523d6462f14 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: 2024-09-07 17:26+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2024-09-07 13:07+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -125,7 +125,7 @@ msgstr "восстановить файл \"%s\" из архива не удал msgid "out of memory" msgstr "нехватка памяти" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:333 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" @@ -210,12 +210,12 @@ msgstr "ошибка при удалении символической ссыл msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:371 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: file_ops.c:344 parsexlog.c:352 +#: file_ops.c:344 parsexlog.c:373 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" @@ -245,32 +245,32 @@ msgstr "не удалось прочитать каталог \"%s\": %m" msgid "could not close directory \"%s\": %m" msgstr "не удалось закрыть каталог \"%s\": %m" -#: filemap.c:236 +#: filemap.c:298 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "файл данных \"%s\" в источнике не является обычным файлом" -#: filemap.c:241 filemap.c:274 +#: filemap.c:303 filemap.c:336 #, c-format msgid "duplicate source file \"%s\"" msgstr "повторный исходный файл \"%s\"" -#: filemap.c:329 +#: filemap.c:391 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "неожиданная модификация страницы для файла особого вида \"%s\"" -#: filemap.c:683 filemap.c:777 +#: filemap.c:745 filemap.c:847 #, c-format msgid "unknown file type for \"%s\"" msgstr "неизвестный тип файла \"%s\"" -#: filemap.c:710 +#: filemap.c:780 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "файл \"%s\" имеет разный тип в исходном и целевом кластере" -#: filemap.c:782 +#: filemap.c:852 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "не удалось определить, что делать с файлом \"%s\"" @@ -429,7 +429,7 @@ msgstr "не удалось переместиться в исходном фа msgid "unexpected EOF while reading file \"%s\"" msgstr "неожиданный конец файла при чтении \"%s\"" -#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "не удалось выделить память для чтения WAL" @@ -450,22 +450,22 @@ msgid "end pointer %X/%X is not a valid end point; expected %X/%X" msgstr "" "конечный указатель %X/%X неверно задаёт конечную точку; ожидается %X/%X" -#: parsexlog.c:212 +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X: %s" -#: parsexlog.c:216 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X" -#: parsexlog.c:341 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не удалось переместиться в файле \"%s\": %m" -#: parsexlog.c:440 +#: parsexlog.c:461 #, c-format msgid "" "WAL record modifies a relation, but record type is not recognized: lsn: %X/" @@ -687,74 +687,74 @@ msgstr "серверы разошлись в позиции WAL %X/%X на ли msgid "no rewind required" msgstr "перемотка не требуется" -#: pg_rewind.c:451 +#: pg_rewind.c:454 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "" "перемотка от последней общей контрольной точки в позиции %X/%X на линии " "времени %u" -#: pg_rewind.c:461 +#: pg_rewind.c:464 #, c-format msgid "reading source file list" msgstr "чтение списка исходных файлов" -#: pg_rewind.c:465 +#: pg_rewind.c:468 #, c-format msgid "reading target file list" msgstr "чтение списка целевых файлов" -#: pg_rewind.c:474 +#: pg_rewind.c:477 #, c-format msgid "reading WAL in target" msgstr "чтение WAL в целевом кластере" -#: pg_rewind.c:495 +#: pg_rewind.c:498 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "требуется скопировать %lu МБ (общий размер исходного каталога: %lu МБ)" -#: pg_rewind.c:513 +#: pg_rewind.c:516 #, c-format msgid "syncing target data directory" msgstr "синхронизация целевого каталога данных" -#: pg_rewind.c:529 +#: pg_rewind.c:532 #, c-format msgid "Done!" msgstr "Готово!" -#: pg_rewind.c:609 +#: pg_rewind.c:612 #, c-format msgid "no action decided for file \"%s\"" msgstr "действие не определено для файла \"%s\"" -#: pg_rewind.c:641 +#: pg_rewind.c:644 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "в исходной системе произошли изменения в процессе работы pg_rewind" -#: pg_rewind.c:645 +#: pg_rewind.c:648 #, c-format msgid "creating backup label and updating control file" msgstr "создание метки копии и модификация управляющего файла" -#: pg_rewind.c:695 +#: pg_rewind.c:698 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "исходная система оказалась в неожиданном состоянии после перемотки" -#: pg_rewind.c:727 +#: pg_rewind.c:730 #, c-format msgid "source and target clusters are from different systems" msgstr "исходный и целевой кластеры относятся к разным системам" -#: pg_rewind.c:735 +#: pg_rewind.c:738 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "кластеры несовместимы с этой версией pg_rewind" -#: pg_rewind.c:745 +#: pg_rewind.c:748 #, c-format msgid "" "target server needs to use either data checksums or \"wal_log_hints = on\"" @@ -762,44 +762,44 @@ msgstr "" "на целевом сервере должны быть контрольные суммы данных или \"wal_log_hints " "= on\"" -#: pg_rewind.c:756 +#: pg_rewind.c:759 #, c-format msgid "target server must be shut down cleanly" msgstr "целевой сервер должен быть выключен штатно" -#: pg_rewind.c:766 +#: pg_rewind.c:769 #, c-format msgid "source data directory must be shut down cleanly" msgstr "работа с исходным каталогом данных должна быть завершена штатно" -#: pg_rewind.c:813 +#: pg_rewind.c:816 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s КБ (%d%%) скопировано" -#: pg_rewind.c:939 +#: pg_rewind.c:942 #, c-format msgid "" "could not find common ancestor of the source and target cluster's timelines" msgstr "" "не удалось найти общего предка линий времени исходного и целевого кластеров" -#: pg_rewind.c:980 +#: pg_rewind.c:983 #, c-format msgid "backup label buffer too small" msgstr "буфер для метки копии слишком мал" -#: pg_rewind.c:1003 +#: pg_rewind.c:1006 #, c-format msgid "unexpected control file CRC" msgstr "неверная контрольная сумма управляющего файла" -#: pg_rewind.c:1015 +#: pg_rewind.c:1018 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "неверный размер управляющего файла (%d), ожидалось: %d" -#: pg_rewind.c:1024 +#: pg_rewind.c:1027 #, c-format msgid "" "WAL segment size must be a power of two between 1 MB and 1 GB, but the " @@ -817,39 +817,39 @@ msgstr[2] "" "Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 " "ГБ, но в управляющем файле указано значение: %d" -#: pg_rewind.c:1063 pg_rewind.c:1133 +#: pg_rewind.c:1066 pg_rewind.c:1136 #, c-format msgid "" "program \"%s\" is needed by %s but was not found in the same directory as " "\"%s\"" msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\"" -#: pg_rewind.c:1066 pg_rewind.c:1136 +#: pg_rewind.c:1069 pg_rewind.c:1139 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её версия отличается от " "версии %s" -#: pg_rewind.c:1099 +#: pg_rewind.c:1102 #, c-format msgid "restore_command is not set in the target cluster" msgstr "команда restore_command в целевом кластере не определена" -#: pg_rewind.c:1140 +#: pg_rewind.c:1143 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "" "выполнение \"%s\" для восстановления согласованности на целевом сервере" -#: pg_rewind.c:1178 +#: pg_rewind.c:1181 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "" "не удалось запустить postgres в целевом кластере в однопользовательском " "режиме" -#: pg_rewind.c:1179 +#: pg_rewind.c:1182 #, c-format msgid "Command was: %s" msgstr "Выполнялась команда: %s" diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po index e81820c6ef5..a5662af8449 100644 --- a/src/bin/psql/po/de.po +++ b/src/bin/psql/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: 2024-11-07 14:05+0000\n" +"POT-Creation-Date: 2025-02-07 09:04+0000\n" "PO-Revision-Date: 2023-08-01 10:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -2467,7 +2467,7 @@ msgstr "" "psql ist das interaktive PostgreSQL-Terminal.\n" "\n" -#: help.c:76 help.c:395 help.c:479 help.c:522 +#: help.c:76 help.c:395 help.c:479 help.c:525 msgid "Usage:\n" msgstr "Aufruf:\n" @@ -3183,7 +3183,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NAME [WERT]] Tabellenausgabeoption setzen\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3191,7 +3191,7 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" #: help.c:321 #, c-format @@ -3777,7 +3777,17 @@ msgstr "" " unicode_header_linestyle\n" " setzt den Stil für Unicode-Linien [single, double]\n" -#: help.c:521 +#: help.c:520 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" setzt die maximale Breite der Kopfzeile für die erweiterte Ausgabe\n" +" [full, column, page, ganze Zahl]\n" + +#: help.c:524 msgid "" "\n" "Environment variables:\n" @@ -3785,7 +3795,7 @@ msgstr "" "\n" "Umgebungsvariablen:\n" -#: help.c:525 +#: help.c:528 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3795,7 +3805,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:527 +#: help.c:530 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3807,7 +3817,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:530 +#: help.c:533 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3815,7 +3825,7 @@ msgstr "" " COLUMNS\n" " Anzahl Spalten im Format »wrapped«\n" -#: help.c:532 +#: help.c:535 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3823,7 +3833,7 @@ msgstr "" " PGAPPNAME\n" " wie Verbindungsparameter »application_name«\n" -#: help.c:534 +#: help.c:537 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3831,7 +3841,7 @@ msgstr "" " PGDATABASE\n" " wie Verbindungsparameter »dbname«\n" -#: help.c:536 +#: help.c:539 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3839,7 +3849,7 @@ msgstr "" " PGHOST\n" " wie Verbindungsparameter »host«\n" -#: help.c:538 +#: help.c:541 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3847,7 +3857,7 @@ msgstr "" " PGPASSFILE\n" " Name der Passwortdatei\n" -#: help.c:540 +#: help.c:543 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3855,7 +3865,7 @@ msgstr "" " PGPASSWORD\n" " Verbindungspasswort (nicht empfohlen)\n" -#: help.c:542 +#: help.c:545 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3863,7 +3873,7 @@ msgstr "" " PGPORT\n" " wie Verbindungsparameter »port«\n" -#: help.c:544 +#: help.c:547 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3871,7 +3881,7 @@ msgstr "" " PGUSER\n" " wie Verbindungsparameter »user«\n" -#: help.c:546 +#: help.c:549 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3879,7 +3889,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " Editor für Befehle \\e, \\ef und \\ev\n" -#: help.c:548 +#: help.c:551 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3887,7 +3897,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " wie die Zeilennummer beim Aufruf des Editors angegeben wird\n" -#: help.c:550 +#: help.c:553 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3895,7 +3905,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativer Pfad für History-Datei\n" -#: help.c:552 +#: help.c:555 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3903,7 +3913,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " Name des externen Pager-Programms\n" -#: help.c:555 +#: help.c:558 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3911,7 +3921,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " Name des externen Pager-Programms für \\watch\n" -#: help.c:558 +#: help.c:561 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3919,7 +3929,7 @@ msgstr "" " PSQLRC\n" " alternativer Pfad für .psqlrc-Datei des Benutzers\n" -#: help.c:560 +#: help.c:563 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3927,7 +3937,7 @@ msgstr "" " SHELL\n" " Shell für den Befehl \\!\n" -#: help.c:562 +#: help.c:565 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3935,11 +3945,11 @@ msgstr "" " TMPDIR\n" " Verzeichnis für temporäre Dateien\n" -#: help.c:622 +#: help.c:625 msgid "Available help:\n" msgstr "Verfügbare Hilfe:\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "" "Command: %s\n" @@ -3958,7 +3968,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:740 +#: help.c:743 #, c-format msgid "" "No help available for \"%s\".\n" diff --git a/src/bin/psql/po/es.po b/src/bin/psql/po/es.po index d9996049337..f2c5ec1e1f9 100644 --- a/src/bin/psql/po/es.po +++ b/src/bin/psql/po/es.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-09 06:06+0000\n" +"POT-Creation-Date: 2024-12-02 22:06+0000\n" "PO-Revision-Date: 2024-11-09 09:27+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" @@ -2474,7 +2474,7 @@ msgstr "" "psql es el terminal interactivo de PostgreSQL.\n" "\n" -#: help.c:76 help.c:395 help.c:479 help.c:522 +#: help.c:76 help.c:395 help.c:479 help.c:525 msgid "Usage:\n" msgstr "Empleo:\n" @@ -3188,14 +3188,14 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NOMBRE [VALOR]] define opción de tabla de salida\n" " (border|columns|csv_fieldsep|expanded|fieldsep|fieldsep_zero|\n" " footer|format|linestyle|null|numericlocale|pager|\n" " pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" " tuples_only|unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" #: help.c:321 #, c-format @@ -3729,7 +3729,17 @@ msgstr "" " unicode_header_linestyle\n" " define el estilo de líneas Unicode [single, double]\n" -#: help.c:521 +#: help.c:520 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" define el ancho máximo del encabezado para el formato expandido\n" +" [full, column, page, valor entero]\n" + +#: help.c:524 msgid "" "\n" "Environment variables:\n" @@ -3737,7 +3747,7 @@ msgstr "" "\n" "Variables de ambiente:\n" -#: help.c:525 +#: help.c:528 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3746,7 +3756,7 @@ msgstr "" " NOMBRE=VALOR [NOMBRE=VALOR] psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:527 +#: help.c:530 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3757,55 +3767,55 @@ msgstr "" " psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:530 +#: help.c:533 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" msgstr " COLUMNS número de columnas para formato «wrapped»\n" -#: help.c:532 +#: help.c:535 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" msgstr " PGAPPNAME igual que el parámetro de conexión application_name\n" -#: help.c:534 +#: help.c:537 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" msgstr " PGDATABASE igual que el parámetro de conexión dbname\n" -#: help.c:536 +#: help.c:539 msgid "" " PGHOST\n" " same as the host connection parameter\n" msgstr " PGHOST igual que el parámetro de conexión host\n" -#: help.c:538 +#: help.c:541 msgid "" " PGPASSFILE\n" " password file name\n" msgstr " PGPASSFILE nombre de archivo de contraseñas\n" -#: help.c:540 +#: help.c:543 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" msgstr " PGPASSWORD contraseña de la conexión (no recomendado)\n" -#: help.c:542 +#: help.c:545 msgid "" " PGPORT\n" " same as the port connection parameter\n" msgstr " PGPORT igual que el parámetro de conexión port\n" -#: help.c:544 +#: help.c:547 msgid "" " PGUSER\n" " same as the user connection parameter\n" msgstr " PGUSER igual que el parámetro de conexión user\n" -#: help.c:546 +#: help.c:549 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3813,7 +3823,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor usado por órdenes \\e, \\ef, y \\ev\n" -#: help.c:548 +#: help.c:551 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3821,47 +3831,47 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARGS\n" " cómo especificar número de línea al invocar al editor\n" -#: help.c:550 +#: help.c:553 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" msgstr " PSQL_HISTORY ubicación alternativa del archivo de historia de órdenes\n" -#: help.c:552 +#: help.c:555 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" msgstr " PSQL_PAGER, PAGER nombre de programa paginador externo\n" -#: help.c:555 +#: help.c:558 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" msgstr " PSQL_WATCH_PAGER paginador externo para usar con \\watch\n" -#: help.c:558 +#: help.c:561 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" msgstr " PSQLRC ubicación alternativa para el archivo .psqlrc del usuario\n" -#: help.c:560 +#: help.c:563 msgid "" " SHELL\n" " shell used by the \\! command\n" msgstr " SHELL intérprete usado por la orden \\!\n" -#: help.c:562 +#: help.c:565 msgid "" " TMPDIR\n" " directory for temporary files\n" msgstr " TMPDIR directorio para archivos temporales\n" -#: help.c:622 +#: help.c:625 msgid "Available help:\n" msgstr "Ayuda disponible:\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "" "Command: %s\n" @@ -3880,7 +3890,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:740 +#: help.c:743 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4265,7 +4275,6 @@ msgid "new_constraint_name" msgstr "nuevo_nombre_restricción" #: sql_help.c:263 -#| msgid "where column_constraint is:" msgid "where domain_constraint is:" msgstr "donde restricción_de_dominio es:" diff --git a/src/bin/psql/po/fr.po b/src/bin/psql/po/fr.po index 21157df4705..62b53901ce7 100644 --- a/src/bin/psql/po/fr.po +++ b/src/bin/psql/po/fr.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-11 02:05+0000\n" -"PO-Revision-Date: 2024-11-11 09:57+0100\n" +"POT-Creation-Date: 2025-02-04 23:34+0000\n" +"PO-Revision-Date: 2025-02-05 09:05+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -2480,7 +2480,7 @@ msgstr "" "psql est l'interface interactive de PostgreSQL.\n" "\n" -#: help.c:76 help.c:395 help.c:479 help.c:522 +#: help.c:76 help.c:395 help.c:479 help.c:525 msgid "Usage:\n" msgstr "Usage :\n" @@ -3247,7 +3247,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NOM [VALEUR]] règle l'affichage de la table\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3255,7 +3255,7 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" #: help.c:321 #, c-format @@ -3853,7 +3853,17 @@ msgstr "" " unicode_header_linestyle\n" " configure le style d'affichage de ligne Unicode [single, double]\n" -#: help.c:521 +#: help.c:520 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" configure la largeur maximale de l'entête dans le format étendu\n" +" [full, column, page, valeur entière]\n" + +#: help.c:524 msgid "" "\n" "Environment variables:\n" @@ -3861,7 +3871,7 @@ msgstr "" "\n" "Variables d'environnement :\n" -#: help.c:525 +#: help.c:528 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3871,7 +3881,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:527 +#: help.c:530 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3883,7 +3893,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:530 +#: help.c:533 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3891,7 +3901,7 @@ msgstr "" " COLUMNS\n" " nombre de colonnes pour le format encadré\n" -#: help.c:532 +#: help.c:535 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3899,7 +3909,7 @@ msgstr "" " PGAPPNAME\n" " identique au paramètre de connexion application_name\n" -#: help.c:534 +#: help.c:537 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3907,7 +3917,7 @@ msgstr "" " PGDATABASE\n" " identique au paramètre de connexion dbname\n" -#: help.c:536 +#: help.c:539 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3915,7 +3925,7 @@ msgstr "" " PGHOST\n" " identique au paramètre de connexion host\n" -#: help.c:538 +#: help.c:541 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3923,7 +3933,7 @@ msgstr "" " PGPASSFILE\n" " nom du fichier de mot de passe\n" -#: help.c:540 +#: help.c:543 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3931,7 +3941,7 @@ msgstr "" " PGPASSWORD\n" " mot de passe de connexion (non recommendé)\n" -#: help.c:542 +#: help.c:545 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3939,7 +3949,7 @@ msgstr "" " PGPORT\n" " identique au paramètre de connexion port\n" -#: help.c:544 +#: help.c:547 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3947,7 +3957,7 @@ msgstr "" " PGUSER\n" " identique au paramètre de connexion user\n" -#: help.c:546 +#: help.c:549 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3955,7 +3965,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " éditeur utilisé par les commandes \\e, \\ef et \\ev\n" -#: help.c:548 +#: help.c:551 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3963,7 +3973,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " comment spécifier un numéro de ligne lors de l'appel de l'éditeur\n" -#: help.c:550 +#: help.c:553 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3971,7 +3981,7 @@ msgstr "" " PSQL_HISTORY\n" " autre emplacement pour le fichier d'historique des commandes\n" -#: help.c:552 +#: help.c:555 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3979,7 +3989,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " nom du paginateur externe\n" -#: help.c:555 +#: help.c:558 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3987,7 +3997,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " nom du paginateur externe utilisé pour \\watch\n" -#: help.c:558 +#: help.c:561 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3995,7 +4005,7 @@ msgstr "" " PSQLRC\n" " autre emplacement pour le fichier .psqlrc de l'utilisateur\n" -#: help.c:560 +#: help.c:563 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4003,7 +4013,7 @@ msgstr "" " SHELL\n" " shell utilisé par la commande \\!\n" -#: help.c:562 +#: help.c:565 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4011,11 +4021,11 @@ msgstr "" " TMPDIR\n" " répertoire pour les fichiers temporaires\n" -#: help.c:622 +#: help.c:625 msgid "Available help:\n" msgstr "Aide-mémoire disponible :\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "" "Command: %s\n" @@ -4034,7 +4044,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:740 +#: help.c:743 #, c-format msgid "" "No help available for \"%s\".\n" diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po index 56583255085..2fa0d4d1a21 100644 --- a/src/bin/psql/po/ja.po +++ b/src/bin/psql/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL 16)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-05 09:20+0900\n" -"PO-Revision-Date: 2024-11-05 09:29+0900\n" +"POT-Creation-Date: 2024-11-25 11:26+0900\n" +"PO-Revision-Date: 2024-11-25 14:31+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -2468,7 +2468,7 @@ msgstr "" "psql は PostgreSQL の対話型ターミナルです。\n" "\n" -#: help.c:76 help.c:395 help.c:479 help.c:522 +#: help.c:76 help.c:395 help.c:479 help.c:525 msgid "Usage:\n" msgstr "使い方:\n" @@ -3175,15 +3175,15 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" -" \\pset [名前 [値]] テーブル出力のオプション設定\n" -" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" \\pset [名前 [値]] テーブル出力のオプションを指定します\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" #: help.c:321 #, c-format @@ -3768,7 +3768,17 @@ msgstr "" " unicode_header_linestyle\n" " Unicode による線描画時のスタイルを設定 [single, double]\n" -#: help.c:521 +#: help.c:520 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" 拡張出力のヘッダの最大幅を指定します\n" +" [full, column, page, 整数値]\n" + +#: help.c:524 msgid "" "\n" "Environment variables:\n" @@ -3776,7 +3786,7 @@ msgstr "" "\n" "環境変数:\n" -#: help.c:525 +#: help.c:528 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3786,7 +3796,7 @@ msgstr "" " またはpsql内で \\setenv 名前 [値]\n" "\n" -#: help.c:527 +#: help.c:530 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3798,7 +3808,7 @@ msgstr "" " またはpsq内で \\setenv 名前 [値]\n" "\n" -#: help.c:530 +#: help.c:533 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3806,7 +3816,7 @@ msgstr "" " COLUMNS\n" " 折り返し書式におけるカラム数\n" -#: help.c:532 +#: help.c:535 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3814,7 +3824,7 @@ msgstr "" " PGAPPNAME\n" " application_name 接続パラメータと同じ\n" -#: help.c:534 +#: help.c:537 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3822,7 +3832,7 @@ msgstr "" " PGDATABASE\n" " dbname 接続パラメータと同じ\n" -#: help.c:536 +#: help.c:539 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3830,7 +3840,7 @@ msgstr "" " PGHOST\n" " host 接続パラメータと同じ\n" -#: help.c:538 +#: help.c:541 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3838,7 +3848,7 @@ msgstr "" " PGPASSFILE\n" " パスワードファイル名\n" -#: help.c:540 +#: help.c:543 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3846,7 +3856,7 @@ msgstr "" " PGPASSWORD\n" " 接続用パスワード (推奨されません)\n" -#: help.c:542 +#: help.c:545 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3854,7 +3864,7 @@ msgstr "" " PGPORT\n" " port 接続パラメータと同じ\n" -#: help.c:544 +#: help.c:547 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3862,7 +3872,7 @@ msgstr "" " PGUSER\n" " user 接続パラメータと同じ\n" -#: help.c:546 +#: help.c:549 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3870,7 +3880,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev コマンドで使われるエディタ\n" -#: help.c:548 +#: help.c:551 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3878,7 +3888,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " エディタの起動時に行番号を指定する方法\n" -#: help.c:550 +#: help.c:553 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3886,7 +3896,7 @@ msgstr "" " PSQL_HISTORY\n" " コマンドライン履歴ファイルの代替の場所\n" -#: help.c:552 +#: help.c:555 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3894,7 +3904,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部ページャープログラムの名前\n" -#: help.c:555 +#: help.c:558 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3902,7 +3912,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " \\watchで使用する外部ページャープログラムの名前\n" -#: help.c:558 +#: help.c:561 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3910,7 +3920,7 @@ msgstr "" " PSQLRC\n" " ユーザーの .psqlrc ファイルの代替の場所\n" -#: help.c:560 +#: help.c:563 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3918,7 +3928,7 @@ msgstr "" " SHELL\n" " \\! コマンドで使われるシェル\n" -#: help.c:562 +#: help.c:565 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3926,11 +3936,11 @@ msgstr "" " TMPDIR\n" " テンポラリファイル用ディレクトリ\n" -#: help.c:622 +#: help.c:625 msgid "Available help:\n" msgstr "利用可能なヘルプ:\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "" "Command: %s\n" @@ -3949,7 +3959,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:740 +#: help.c:743 #, c-format msgid "" "No help available for \"%s\".\n" diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po index 57b97e09e2a..9a2b20948a3 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -4,14 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Sergey Burladyan , 2012. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# Alexander Lakhin , 2012-2025. # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-02 08:21+0300\n" -"PO-Revision-Date: 2024-09-07 06:49+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" +"PO-Revision-Date: 2025-02-08 08:33+0200\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -2563,7 +2563,7 @@ msgstr "" "psql - это интерактивный терминал PostgreSQL.\n" "\n" -#: help.c:76 help.c:395 help.c:479 help.c:522 +#: help.c:76 help.c:395 help.c:479 help.c:525 msgid "Usage:\n" msgstr "Использование:\n" @@ -3404,7 +3404,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [ИМЯ [ЗНАЧЕНИЕ]] установить параметр вывода таблицы\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3412,7 +3412,7 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" #: help.c:321 #, c-format @@ -3430,7 +3430,7 @@ msgstr "" #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr "" -" \\x [on|off|auto] переключить режим расширенного вывода (сейчас: " +" \\x [on|off|auto] переключить режим развёрнутого вывода (сейчас: " "%s)\n" #: help.c:325 @@ -3909,7 +3909,7 @@ msgid "" " expanded output [on, off, auto]\n" msgstr "" " expanded (или x)\n" -" расширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n" +" развёрнутый вывод [on (вкл.), off (выкл.), auto (авто)]\n" #: help.c:488 #, c-format @@ -4035,7 +4035,17 @@ msgstr "" " задаёт стиль рисуемых линий Unicode [single (одинарные), double " "(двойные)]\n" -#: help.c:521 +#: help.c:520 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" задаёт максимальную ширину заголовка для развёрнутого вывода\n" +" [full (полностью), column (столбец), page (страница), целое значение]\n" + +#: help.c:524 msgid "" "\n" "Environment variables:\n" @@ -4043,7 +4053,7 @@ msgstr "" "\n" "Переменные окружения:\n" -#: help.c:525 +#: help.c:528 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -4053,7 +4063,7 @@ msgstr "" " или \\setenv ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n" "\n" -#: help.c:527 +#: help.c:530 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -4065,7 +4075,7 @@ msgstr "" " или \\setenv ИМЯ ЗНАЧЕНИЕ в приглашении psql\n" "\n" -#: help.c:530 +#: help.c:533 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -4073,7 +4083,7 @@ msgstr "" " COLUMNS\n" " число столбцов для форматирования с переносом\n" -#: help.c:532 +#: help.c:535 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -4081,7 +4091,7 @@ msgstr "" " PGAPPNAME\n" " синоним параметра подключения application_name\n" -#: help.c:534 +#: help.c:537 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -4089,7 +4099,7 @@ msgstr "" " PGDATABASE\n" " синоним параметра подключения dbname\n" -#: help.c:536 +#: help.c:539 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -4097,7 +4107,7 @@ msgstr "" " PGHOST\n" " синоним параметра подключения host\n" -#: help.c:538 +#: help.c:541 msgid "" " PGPASSFILE\n" " password file name\n" @@ -4105,7 +4115,7 @@ msgstr "" " PGPASSFILE\n" " имя файла с паролем\n" -#: help.c:540 +#: help.c:543 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -4113,7 +4123,7 @@ msgstr "" " PGPASSWORD\n" " пароль для подключения (использовать не рекомендуется)\n" -#: help.c:542 +#: help.c:545 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4121,7 +4131,7 @@ msgstr "" " PGPORT\n" " синоним параметра подключения port\n" -#: help.c:544 +#: help.c:547 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4129,7 +4139,7 @@ msgstr "" " PGUSER\n" " синоним параметра подключения user\n" -#: help.c:546 +#: help.c:549 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4137,7 +4147,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор, вызываемый командами \\e, \\ef и \\ev\n" -#: help.c:548 +#: help.c:551 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4145,7 +4155,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " определяет способ передачи номера строки при вызове редактора\n" -#: help.c:550 +#: help.c:553 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4153,7 +4163,7 @@ msgstr "" " PSQL_HISTORY\n" " альтернативное размещение файла с историей команд\n" -#: help.c:552 +#: help.c:555 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4161,7 +4171,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " имя программы внешнего постраничника\n" -#: help.c:555 +#: help.c:558 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -4169,7 +4179,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " имя программы внешнего постраничника для \\watch\n" -#: help.c:558 +#: help.c:561 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4177,7 +4187,7 @@ msgstr "" " PSQLRC\n" " альтернативное размещение пользовательского файла .psqlrc\n" -#: help.c:560 +#: help.c:563 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4185,7 +4195,7 @@ msgstr "" " SHELL\n" " оболочка, вызываемая командой \\!\n" -#: help.c:562 +#: help.c:565 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4193,11 +4203,11 @@ msgstr "" " TMPDIR\n" " каталог для временных файлов\n" -#: help.c:622 +#: help.c:625 msgid "Available help:\n" msgstr "Имеющаяся справка:\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "" "Command: %s\n" @@ -4216,7 +4226,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:740 +#: help.c:743 #, c-format msgid "" "No help available for \"%s\".\n" diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po index b15d604c193..cde1db11490 100644 --- a/src/bin/scripts/po/ru.po +++ b/src/bin/scripts/po/ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-02 08:21+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2024-09-05 08:25+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -205,18 +205,18 @@ msgstr "" "\n" #: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:754 vacuumdb.c:1167 +#: pg_isready.c:226 reindexdb.c:754 vacuumdb.c:1179 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: clusterdb.c:266 reindexdb.c:755 vacuumdb.c:1168 +#: clusterdb.c:266 reindexdb.c:755 vacuumdb.c:1180 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" #: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:756 vacuumdb.c:1169 +#: pg_isready.c:229 reindexdb.c:756 vacuumdb.c:1181 #, c-format msgid "" "\n" @@ -268,7 +268,7 @@ msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" #: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:771 vacuumdb.c:1198 +#: pg_isready.c:235 reindexdb.c:771 vacuumdb.c:1210 #, c-format msgid "" "\n" @@ -277,35 +277,35 @@ msgstr "" "\n" "Параметры подключения:\n" -#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1199 +#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1211 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ компьютер с сервером баз данных или каталог " "сокетов\n" -#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1200 +#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1212 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1201 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1213 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1202 +#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1214 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1203 +#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1215 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросить пароль\n" -#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1204 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1216 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" @@ -320,7 +320,7 @@ msgstr "" "Подробнее о кластеризации вы можете узнать в описании SQL-команды CLUSTER.\n" #: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:779 vacuumdb.c:1206 +#: pg_isready.c:240 reindexdb.c:779 vacuumdb.c:1218 #, c-format msgid "" "\n" @@ -330,7 +330,7 @@ msgstr "" "Об ошибках сообщайте по адресу <%s>.\n" #: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:780 vacuumdb.c:1207 +#: pg_isready.c:241 reindexdb.c:780 vacuumdb.c:1219 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" @@ -992,8 +992,8 @@ msgid "cannot use multiple jobs to reindex indexes" msgstr "нельзя задействовать несколько заданий для перестроения индексов" #: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:524 vacuumdb.c:531 vacuumdb.c:538 -#: vacuumdb.c:545 vacuumdb.c:552 vacuumdb.c:559 vacuumdb.c:566 vacuumdb.c:571 -#: vacuumdb.c:575 vacuumdb.c:579 vacuumdb.c:583 +#: vacuumdb.c:545 vacuumdb.c:552 vacuumdb.c:559 vacuumdb.c:566 vacuumdb.c:573 +#: vacuumdb.c:580 vacuumdb.c:587 vacuumdb.c:594 #, c-format msgid "" "cannot use the \"%s\" option on server versions older than PostgreSQL %s" @@ -1190,27 +1190,27 @@ msgstr "Вычисление средней статистики для опти msgid "Generating default (full) optimizer statistics" msgstr "Вычисление стандартной (полной) статистики для оптимизатора" -#: vacuumdb.c:592 +#: vacuumdb.c:604 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обработка базы данных \"%s\": %s\n" -#: vacuumdb.c:595 +#: vacuumdb.c:607 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очистка базы данных \"%s\"\n" -#: vacuumdb.c:1155 +#: vacuumdb.c:1167 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистить таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: vacuumdb.c:1158 +#: vacuumdb.c:1170 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистить базу данных \"%s\" не удалось: %s" -#: vacuumdb.c:1166 +#: vacuumdb.c:1178 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1219,12 +1219,12 @@ msgstr "" "%s очищает и анализирует базу данных PostgreSQL.\n" "\n" -#: vacuumdb.c:1170 +#: vacuumdb.c:1182 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистить все базы данных\n" -#: vacuumdb.c:1171 +#: vacuumdb.c:1183 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr "" @@ -1232,18 +1232,18 @@ msgstr "" "при\n" " очистке\n" -#: vacuumdb.c:1172 +#: vacuumdb.c:1184 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ИМЯ_БД очистить указанную базу данных\n" -#: vacuumdb.c:1173 +#: vacuumdb.c:1185 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr "" " --disable-page-skipping исключить все варианты пропуска страниц\n" -#: vacuumdb.c:1174 +#: vacuumdb.c:1186 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -1251,19 +1251,19 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: vacuumdb.c:1175 +#: vacuumdb.c:1187 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full произвести полную очистку\n" -#: vacuumdb.c:1176 +#: vacuumdb.c:1188 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze заморозить информацию о транзакциях в " "строках\n" -#: vacuumdb.c:1177 +#: vacuumdb.c:1189 #, c-format msgid "" " --force-index-cleanup always remove index entries that point to " @@ -1273,7 +1273,7 @@ msgstr "" "указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1178 +#: vacuumdb.c:1190 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1282,7 +1282,7 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для очистки заданное число " "заданий\n" -#: vacuumdb.c:1179 +#: vacuumdb.c:1191 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1291,7 +1291,7 @@ msgstr "" " --min-mxid-age=ВОЗРАСТ минимальный возраст мультитранзакций для\n" " таблиц, подлежащих очистке\n" -#: vacuumdb.c:1180 +#: vacuumdb.c:1192 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1301,7 +1301,7 @@ msgstr "" "таблиц,\n" " подлежащих очистке\n" -#: vacuumdb.c:1181 +#: vacuumdb.c:1193 #, c-format msgid "" " --no-index-cleanup don't remove index entries that point to " @@ -1310,12 +1310,12 @@ msgstr "" " --no-index-cleanup не удалять элементы индекса, указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1182 +#: vacuumdb.c:1194 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main пропускать основное отношение\n" -#: vacuumdb.c:1183 +#: vacuumdb.c:1195 #, c-format msgid "" " --no-process-toast skip the TOAST table associated with the " @@ -1324,7 +1324,7 @@ msgstr "" " --no-process-toast пропускать TOAST-таблицу, связанную\n" " с очищаемой таблицей\n" -#: vacuumdb.c:1184 +#: vacuumdb.c:1196 #, c-format msgid "" " --no-truncate don't truncate empty pages at the end of " @@ -1333,7 +1333,7 @@ msgstr "" " --no-truncate не отсекать пустые страницы в конце " "таблицы\n" -#: vacuumdb.c:1185 +#: vacuumdb.c:1197 #, c-format msgid "" " -n, --schema=SCHEMA vacuum tables in the specified schema(s) " @@ -1342,7 +1342,7 @@ msgstr "" " -n, --schema=СХЕМА очищать таблицы только в указанной " "схеме(ах)\n" -#: vacuumdb.c:1186 +#: vacuumdb.c:1198 #, c-format msgid "" " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified " @@ -1350,7 +1350,7 @@ msgid "" msgstr "" " -N, --exclude-schema=СХЕМА не очищать таблицы в указанной схеме(ах)\n" -#: vacuumdb.c:1187 +#: vacuumdb.c:1199 #, c-format msgid "" " -P, --parallel=PARALLEL_WORKERS use this many background workers for " @@ -1360,12 +1360,12 @@ msgstr "" " по возможности использовать для очистки\n" " заданное число фоновых процессов\n" -#: vacuumdb.c:1188 +#: vacuumdb.c:1200 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: vacuumdb.c:1189 +#: vacuumdb.c:1201 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1374,29 +1374,29 @@ msgstr "" " --skip-locked пропускать отношения, которые не удаётся\n" " заблокировать немедленно\n" -#: vacuumdb.c:1190 +#: vacuumdb.c:1202 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='ТАБЛ[(СТОЛБЦЫ)]' очистить только указанную таблицу(ы)\n" -#: vacuumdb.c:1191 +#: vacuumdb.c:1203 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: vacuumdb.c:1192 +#: vacuumdb.c:1204 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: vacuumdb.c:1193 +#: vacuumdb.c:1205 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze обновить статистику оптимизатора\n" -#: vacuumdb.c:1194 +#: vacuumdb.c:1206 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1405,7 +1405,7 @@ msgstr "" " -Z, --analyze-only только обновить статистику оптимизатора,\n" " не очищать БД\n" -#: vacuumdb.c:1195 +#: vacuumdb.c:1207 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1417,12 +1417,12 @@ msgstr "" " (в несколько проходов для большей " "скорости), без очистки\n" -#: vacuumdb.c:1197 +#: vacuumdb.c:1209 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: vacuumdb.c:1205 +#: vacuumdb.c:1217 #, c-format msgid "" "\n" diff --git a/src/interfaces/ecpg/preproc/po/ru.po b/src/interfaces/ecpg/preproc/po/ru.po index 0ea17e6bc6d..2c1e8a10324 100644 --- a/src/interfaces/ecpg/preproc/po/ru.po +++ b/src/interfaces/ecpg/preproc/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ecpg (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-19 11:24+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2022-09-05 13:32+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -399,7 +399,7 @@ msgstr "имя типа \"string\" в режиме Informix зарезервир msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:577 preproc.y:19028 preproc.y:19350 variable.c:625 +#: preproc.y:577 preproc.y:19028 preproc.y:19350 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные массивы с простыми типами данных не поддерживаются" @@ -684,22 +684,22 @@ msgstr "переменная \"%s\" - не массив" msgid "variable \"%s\" is not declared" msgstr "переменная \"%s\" не объявлена" -#: variable.c:493 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "переменная-индикатор должна быть целочисленной" -#: variable.c:510 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "нераспознанное имя типа данных \"%s\"" -#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "многомерные массивы не поддерживаются" -#: variable.c:538 +#: variable.c:537 #, c-format msgid "" "multilevel pointers (more than 2 levels) are not supported; found %d level" @@ -715,12 +715,12 @@ msgstr[2] "" "многоуровневые указатели (больше 2 уровней) не поддерживаются, обнаружено %d " "уровней" -#: variable.c:543 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "для этого типа данных указатели на указатели не поддерживаются" -#: variable.c:563 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "многомерные массивы структур не поддерживаются" diff --git a/src/interfaces/libpq/po/de.po b/src/interfaces/libpq/po/de.po index bdf67b54faf..29e82dbe331 100644 --- a/src/interfaces/libpq/po/de.po +++ b/src/interfaces/libpq/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: 2023-06-23 12:40+0000\n" +"POT-Creation-Date: 2025-02-07 08:58+0000\n" "PO-Revision-Date: 2023-06-23 15:13+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -69,19 +69,19 @@ msgstr "konnte Nonce nicht erzeugen" #: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 #: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 -#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:295 -#: fe-auth.c:368 fe-auth.c:402 fe-auth.c:617 fe-auth.c:728 fe-auth.c:1209 -#: fe-auth.c:1374 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 -#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 -#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 -#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 -#: fe-protocol3.c:1770 fe-protocol3.c:2170 fe-secure-common.c:110 -#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 +#: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 +#: fe-connect.c:3291 fe-connect.c:4492 fe-connect.c:5157 fe-connect.c:5412 +#: fe-connect.c:5530 fe-connect.c:5777 fe-connect.c:5857 fe-connect.c:5955 +#: 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:4100 fe-exec.c:4264 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 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -140,193 +140,193 @@ msgstr "fehlerhafte SCRAM-Nachricht (ungültige Serversignatur)" msgid "could not generate random salt" msgstr "konnte zufälliges Salt nicht erzeugen" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des GSSAPI-Puffers (%d)" -#: fe-auth.c:137 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "GSSAPI-Fortsetzungsfehler" -#: fe-auth.c:167 fe-auth.c:396 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 #: fe-secure-common.c:173 #, c-format msgid "host name must be specified" msgstr "Hostname muss angegeben werden" -#: fe-auth.c:173 +#: fe-auth.c:174 #, c-format msgid "duplicate GSS authentication request" msgstr "doppelte GSSAPI-Authentifizierungsanfrage" -#: fe-auth.c:237 +#: fe-auth.c:238 #, c-format msgid "out of memory allocating SSPI buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des SSPI-Puffers (%d)" -#: fe-auth.c:284 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "SSPI-Fortsetzungsfehler" -#: fe-auth.c:358 +#: fe-auth.c:359 #, c-format msgid "duplicate SSPI authentication request" msgstr "doppelte SSPI-Authentifizierungsanfrage" -#: fe-auth.c:383 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: fe-auth.c:436 +#: fe-auth.c:437 #, c-format msgid "channel binding required, but SSL not in use" msgstr "Channel-Binding wurde verlangt, aber SSL wird nicht verwendet" -#: fe-auth.c:442 +#: fe-auth.c:443 #, c-format msgid "duplicate SASL authentication request" msgstr "doppelte SASL-Authentifizierungsanfrage" -#: fe-auth.c:500 +#: fe-auth.c:501 #, c-format msgid "channel binding is required, but client does not support it" msgstr "Channel-Binding wurde verlangt, aber der Client unterstützt es nicht" -#: fe-auth.c:516 +#: fe-auth.c:517 #, c-format msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "Server hat Authentifizierung mit SCRAM-SHA-256-PLUS über eine Verbindung ohne SSL angeboten" -#: fe-auth.c:530 +#: fe-auth.c:531 #, c-format msgid "none of the server's SASL authentication mechanisms are supported" msgstr "keine der SASL-Authentifizierungsmechanismen des Servers werden unterstützt" -#: fe-auth.c:537 +#: fe-auth.c:538 #, c-format msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" msgstr "Channel-Binding wurde verlangt, aber der Server hat keine Authentifizierungsmethode mit Channel-Binding angeboten" -#: fe-auth.c:640 +#: fe-auth.c:641 #, c-format msgid "out of memory allocating SASL buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des SASL-Puffers (%d)" -#: fe-auth.c:664 +#: fe-auth.c:665 #, c-format msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" msgstr "AuthenticationSASLFinal vom Server empfangen, aber SASL-Authentifizierung war noch nicht abgeschlossen" -#: fe-auth.c:674 +#: fe-auth.c:675 #, c-format msgid "no client response found after SASL exchange success" msgstr "keine Client-Antwort gefunden nach Erfolg des SASL-Austauschs" -#: fe-auth.c:737 fe-auth.c:744 fe-auth.c:1357 fe-auth.c:1368 +#: fe-auth.c:738 fe-auth.c:745 fe-auth.c:1358 fe-auth.c:1369 #, c-format msgid "could not encrypt password: %s" msgstr "konnte Passwort nicht verschlüsseln: %s" -#: fe-auth.c:772 +#: fe-auth.c:773 msgid "server requested a cleartext password" msgstr "Server hat ein Passwort im Klartext verlangt" -#: fe-auth.c:774 +#: fe-auth.c:775 msgid "server requested a hashed password" msgstr "Server hat ein gehashtes Passwort verlangt" -#: fe-auth.c:777 +#: fe-auth.c:778 msgid "server requested GSSAPI authentication" msgstr "Server hat GSSAPI-Authentifizierung verlangt" -#: fe-auth.c:779 +#: fe-auth.c:780 msgid "server requested SSPI authentication" msgstr "Server hat SSPI-Authentifizierung verlangt" -#: fe-auth.c:783 +#: fe-auth.c:784 msgid "server requested SASL authentication" msgstr "Server hat SASL-Authentifizierung verlangt" -#: fe-auth.c:786 +#: fe-auth.c:787 msgid "server requested an unknown authentication type" msgstr "Server hat einen unbekannten Authentifizierungstyp verlangt" -#: fe-auth.c:819 +#: fe-auth.c:820 #, c-format msgid "server did not request an SSL certificate" msgstr "Server hat kein SSL-Zertifikat verlangt" -#: fe-auth.c:824 +#: fe-auth.c:825 #, c-format msgid "server accepted connection without a valid SSL certificate" msgstr "Server hat Verbindung ohne gültiges SSL-Zertifikat angenommen" -#: fe-auth.c:878 +#: fe-auth.c:879 msgid "server did not complete authentication" msgstr "Server hat Authentifizierung nicht abgeschlossen" -#: fe-auth.c:912 +#: fe-auth.c:913 #, c-format msgid "authentication method requirement \"%s\" failed: %s" msgstr "Authentifizierungsmethodenanforderung »%s« fehlgeschlagen: %s" -#: fe-auth.c:935 +#: fe-auth.c:936 #, c-format msgid "channel binding required, but server authenticated client without channel binding" msgstr "Channel-Binding wurde verlangt, aber der Server hat den Client ohne Channel-Binding authentifiziert" -#: fe-auth.c:940 +#: fe-auth.c:941 #, c-format msgid "channel binding required but not supported by server's authentication request" msgstr "Channel-Binding wurde verlangt aber von der Authentifizierungsanfrage des Servers nicht unterstützt" -#: fe-auth.c:974 +#: fe-auth.c:975 #, c-format msgid "Kerberos 4 authentication not supported" msgstr "Authentifizierung mit Kerberos 4 nicht unterstützt" -#: fe-auth.c:978 +#: fe-auth.c:979 #, c-format msgid "Kerberos 5 authentication not supported" msgstr "Authentifizierung mit Kerberos 5 nicht unterstützt" -#: fe-auth.c:1048 +#: fe-auth.c:1049 #, c-format msgid "GSSAPI authentication not supported" msgstr "Authentifizierung mit GSSAPI nicht unterstützt" -#: fe-auth.c:1079 +#: fe-auth.c:1080 #, c-format msgid "SSPI authentication not supported" msgstr "Authentifizierung mit SSPI nicht unterstützt" -#: fe-auth.c:1086 +#: fe-auth.c:1087 #, c-format msgid "Crypt authentication not supported" msgstr "Authentifizierung mit Crypt nicht unterstützt" -#: fe-auth.c:1150 +#: fe-auth.c:1151 #, c-format msgid "authentication method %u not supported" msgstr "Authentifizierungsmethode %u nicht unterstützt" -#: fe-auth.c:1196 +#: fe-auth.c:1197 #, c-format msgid "user name lookup failure: error code %lu" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" -#: fe-auth.c:1320 +#: fe-auth.c:1321 #, c-format msgid "unexpected shape of result set returned for SHOW" msgstr "unerwartete Form der Ergebnismenge von SHOW" -#: fe-auth.c:1328 +#: fe-auth.c:1329 #, c-format msgid "password_encryption value too long" msgstr "Wert von password_encryption ist zu lang" -#: fe-auth.c:1378 +#: fe-auth.c:1379 #, c-format msgid "unrecognized password encryption algorithm \"%s\"" msgstr "unbekannter Passwortverschlüsselungsalgorithmus »%s«" @@ -479,11 +479,6 @@ msgstr "konnte Socket nicht auf nicht-blockierenden Modus umstellen: %s" msgid "could not set socket to close-on-exec mode: %s" msgstr "konnte Socket nicht auf »Close on exec«-Modus umstellen: %s" -#: fe-connect.c:2961 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "Parameter »keepalives« muss eine ganze Zahl sein" - #: fe-connect.c:3100 #, c-format msgid "could not get socket error status: %s" @@ -534,256 +529,261 @@ msgstr "konnte Startpaket nicht senden: %s" msgid "server does not support SSL, but SSL was required" msgstr "Server unterstützt kein SSL, aber SSL wurde verlangt" -#: fe-connect.c:3404 +#: fe-connect.c:3395 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "Server hat während des SSL-Austauschs eine Fehlermeldung gesendet" + +#: fe-connect.c:3400 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "ungültige Antwort auf SSL-Verhandlungspaket empfangen: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3420 #, c-format msgid "received unencrypted data after SSL response" msgstr "unverschlüsselte Daten nach SSL-Antwort empfangen" -#: fe-connect.c:3504 +#: fe-connect.c:3500 #, c-format msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "Server unterstützt keine GSSAPI-Verschlüsselung, sie wurde aber verlangt" -#: fe-connect.c:3515 +#: fe-connect.c:3511 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "ungültige Antwort auf GSSAPI-Verhandlungspaket empfangen: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3529 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsantwort empfangen" -#: fe-connect.c:3598 +#: fe-connect.c:3594 #, c-format msgid "expected authentication request from server, but received %c" msgstr "Authentifizierungsanfrage wurde vom Server erwartet, aber %c wurde empfangen" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3621 fe-connect.c:3790 #, c-format msgid "received invalid authentication request" msgstr "ungültige Authentifizierungsanforderung empfangen" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3626 fe-connect.c:3775 #, c-format msgid "received invalid protocol negotiation message" msgstr "ungültige Protokollverhandlungsnachricht empfangen" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3644 fe-connect.c:3698 #, c-format msgid "received invalid error message" msgstr "ungültige Fehlermeldung empfangen" -#: fe-connect.c:3865 +#: fe-connect.c:3861 #, c-format msgid "unexpected message from server during startup" msgstr "unerwartete Nachricht vom Server beim Start" -#: fe-connect.c:3956 +#: fe-connect.c:3952 #, c-format msgid "session is read-only" msgstr "Sitzung ist read-only" -#: fe-connect.c:3958 +#: fe-connect.c:3954 #, c-format msgid "session is not read-only" msgstr "Sitzung ist nicht read-only" -#: fe-connect.c:4011 +#: fe-connect.c:4007 #, c-format msgid "server is in hot standby mode" msgstr "Server ist im Hot-Standby-Modus" -#: fe-connect.c:4013 +#: fe-connect.c:4009 #, c-format msgid "server is not in hot standby mode" msgstr "Server ist nicht im Hot-Standby-Modus" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4125 fe-connect.c:4175 #, c-format msgid "\"%s\" failed" msgstr "»%s« fehlgeschlagen" -#: fe-connect.c:4193 +#: fe-connect.c:4189 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "ungültiger Verbindungszustand %d, möglicherweise ein Speicherproblem" -#: fe-connect.c:5174 +#: fe-connect.c:5170 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "ungültige LDAP-URL »%s«: Schema muss ldap:// sein" -#: fe-connect.c:5189 +#: fe-connect.c:5185 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "ungültige LDAP-URL »%s«: Distinguished Name fehlt" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5197 fe-connect.c:5255 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "ungültige LDAP-URL »%s«: muss genau ein Attribut haben" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5209 fe-connect.c:5271 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "ungültige LDAP-URL »%s«: Suchbereich fehlt (base/one/sub)" -#: fe-connect.c:5225 +#: fe-connect.c:5221 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "ungültige LDAP-URL »%s«: kein Filter" -#: fe-connect.c:5247 +#: fe-connect.c:5243 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "ungültige LDAP-URL »%s«: ungültige Portnummer" -#: fe-connect.c:5284 +#: fe-connect.c:5280 #, c-format msgid "could not create LDAP structure" msgstr "konnte LDAP-Struktur nicht erzeugen" -#: fe-connect.c:5359 +#: fe-connect.c:5355 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "Suche auf LDAP-Server fehlgeschlagen: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5365 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "LDAP-Suche ergab mehr als einen Eintrag" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5367 fe-connect.c:5378 #, c-format msgid "no entry found on LDAP lookup" msgstr "kein Eintrag gefunden bei LDAP-Suche" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5388 fe-connect.c:5400 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "Attribut hat keine Werte bei LDAP-Suche" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5451 fe-connect.c:5470 fe-connect.c:5994 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "fehlendes »=« nach »%s« in der Zeichenkette der Verbindungsdaten" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5541 fe-connect.c:6177 fe-connect.c:6975 #, c-format msgid "invalid connection option \"%s\"" msgstr "ungültige Verbindungsoption »%s«" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5556 fe-connect.c:6042 #, c-format msgid "unterminated quoted string in connection info string" msgstr "fehlendes schließendes Anführungszeichen (\") in der Zeichenkette der Verbindungsdaten" -#: fe-connect.c:5640 +#: fe-connect.c:5636 #, c-format msgid "definition of service \"%s\" not found" msgstr "Definition von Service »%s« nicht gefunden" -#: fe-connect.c:5666 +#: fe-connect.c:5662 #, c-format msgid "service file \"%s\" not found" msgstr "Servicedatei »%s« nicht gefunden" -#: fe-connect.c:5679 +#: fe-connect.c:5675 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "Zeile %d zu lang in Servicedatei »%s«" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5746 fe-connect.c:5789 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "Syntaxfehler in Servicedatei »%s«, Zeile %d" -#: fe-connect.c:5761 +#: fe-connect.c:5757 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "geschachtelte »service«-Definitionen werden nicht unterstützt in Servicedatei »%s«, Zeile %d" -#: fe-connect.c:6500 +#: fe-connect.c:6496 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "ungültige URI an interne Parserroutine weitergeleitet: »%s«" -#: fe-connect.c:6577 +#: fe-connect.c:6573 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "Ende der Eingabezeichenkette gefunden beim Suchen nach passendem »]« in IPv6-Hostadresse in URI: »%s«" -#: fe-connect.c:6584 +#: fe-connect.c:6580 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "IPv6-Hostadresse darf nicht leer sein in URI: »%s«" -#: fe-connect.c:6599 +#: fe-connect.c:6595 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "unerwartetes Zeichen »%c« an Position %d in URI (»:« oder »/« erwartet): »%s«" -#: fe-connect.c:6728 +#: fe-connect.c:6724 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "zusätzliches Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«" -#: fe-connect.c:6748 +#: fe-connect.c:6744 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "fehlendes Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«" -#: fe-connect.c:6800 +#: fe-connect.c:6796 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "ungültiger URI-Query-Parameter: »%s«" -#: fe-connect.c:6874 +#: fe-connect.c:6870 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "ungültiges Prozent-kodiertes Token: »%s«" -#: fe-connect.c:6884 +#: fe-connect.c:6880 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "verbotener Wert %%00 in Prozent-kodiertem Wert: »%s«" -#: fe-connect.c:7248 +#: fe-connect.c:7244 msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 -#: fe-protocol3.c:974 fe-protocol3.c:1007 +#: fe-connect.c:7252 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 "Speicher aufgebraucht\n" -#: fe-connect.c:7547 +#: fe-connect.c:7543 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "WARNUNG: Passwortdatei »%s« ist keine normale Datei\n" -#: fe-connect.c:7556 +#: fe-connect.c:7552 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "WARNUNG: Passwortdatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Rechte sollten u=rw (0600) oder weniger sein\n" -#: fe-connect.c:7663 +#: fe-connect.c:7659 #, c-format msgid "password retrieved from file \"%s\"" msgstr "Passwort wurde aus Datei »%s« gelesen" -#: fe-exec.c:466 fe-exec.c:3366 +#: fe-exec.c:466 fe-exec.c:3395 #, c-format msgid "row number %d is out of range 0..%d" msgstr "Zeilennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:528 fe-protocol3.c:1976 +#: fe-exec.c:528 fe-protocol3.c:1971 #, c-format msgid "%s" msgstr "%s" @@ -793,141 +793,141 @@ msgstr "%s" msgid "write to server failed" msgstr "Schreiben zum Server fehlgeschlagen" -#: fe-exec.c:869 +#: fe-exec.c:871 #, c-format msgid "no error text available" msgstr "kein Fehlertext verfügbar" -#: fe-exec.c:958 +#: fe-exec.c:960 msgid "NOTICE" msgstr "HINWEIS" -#: fe-exec.c:1016 +#: fe-exec.c:1018 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult kann nicht mehr als INT_MAX Tupel enthalten" -#: fe-exec.c:1028 +#: fe-exec.c:1030 msgid "size_t overflow" msgstr "Überlauf von size_t" -#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#: fe-exec.c:1446 fe-exec.c:1515 fe-exec.c:1561 #, c-format msgid "command string is a null pointer" msgstr "Befehlszeichenkette ist ein NULL-Zeiger" -#: fe-exec.c:1450 fe-exec.c:2888 +#: fe-exec.c:1452 fe-exec.c:2883 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#: fe-exec.c:1520 fe-exec.c:1566 fe-exec.c:1660 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "Anzahl der Parameter muss zwischen 0 und %d sein" -#: fe-exec.c:1554 fe-exec.c:1653 +#: fe-exec.c:1556 fe-exec.c:1655 #, c-format msgid "statement name is a null pointer" msgstr "Anweisungsname ist ein NULL-Zeiger" -#: fe-exec.c:1695 fe-exec.c:3220 +#: fe-exec.c:1697 fe-exec.c:3241 #, c-format msgid "no connection to the server" msgstr "keine Verbindung mit dem Server" -#: fe-exec.c:1703 fe-exec.c:3228 +#: fe-exec.c:1705 fe-exec.c:3249 #, c-format msgid "another command is already in progress" msgstr "ein anderer Befehl ist bereits in Ausführung" -#: fe-exec.c:1733 +#: fe-exec.c:1735 #, c-format msgid "cannot queue commands during COPY" msgstr "während COPY können keine Befehle aufgereiht werden" -#: fe-exec.c:1850 +#: fe-exec.c:1852 #, c-format msgid "length must be given for binary parameter" msgstr "für binäre Parameter muss eine Länge angegeben werden" -#: fe-exec.c:2171 +#: fe-exec.c:2166 #, c-format msgid "unexpected asyncStatus: %d" msgstr "unerwarteter asyncStatus: %d" -#: fe-exec.c:2327 +#: fe-exec.c:2322 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "synchrone Befehlsausführungsfunktionen sind im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:2344 +#: fe-exec.c:2339 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2360 +#: fe-exec.c:2355 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "PQexec ist während COPY BOTH nicht erlaubt" -#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1907 +#: fe-exec.c:2581 fe-exec.c:2636 fe-exec.c:2704 fe-protocol3.c:1902 #, c-format msgid "no COPY in progress" msgstr "keine COPY in Ausführung" -#: fe-exec.c:2895 +#: fe-exec.c:2890 #, c-format msgid "connection in wrong state" msgstr "Verbindung im falschen Zustand" -#: fe-exec.c:2938 +#: fe-exec.c:2933 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv" -#: fe-exec.c:2974 fe-exec.c:2995 +#: fe-exec.c:2969 fe-exec.c:2990 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse" -#: fe-exec.c:2978 +#: fe-exec.c:2973 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "kann Pipeline-Modus nicht beenden während die Verbindung beschäftigt ist" -#: fe-exec.c:2989 +#: fe-exec.c:2984 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "kann Pipeline-Modus nicht beenden während COPY aktiv ist" -#: fe-exec.c:3154 +#: fe-exec.c:3175 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "Pipeline kann nicht gesendet werden, wenn der Pipeline-Modus aus ist" -#: fe-exec.c:3255 +#: fe-exec.c:3284 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3282 +#: fe-exec.c:3311 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3350 fe-exec.c:3373 +#: fe-exec.c:3379 fe-exec.c:3402 #, c-format msgid "column number %d is out of range 0..%d" msgstr "Spaltennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3388 +#: fe-exec.c:3417 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "Parameternummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3699 +#: fe-exec.c:3728 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:3964 fe-exec.c:4054 +#: fe-exec.c:3993 fe-exec.c:4083 #, c-format msgid "incomplete multibyte character" msgstr "unvollständiges Mehrbyte-Zeichen" @@ -993,8 +993,8 @@ msgstr "Integer der Größe %lu wird von pqPutInt nicht unterstützt" msgid "connection not open" msgstr "Verbindung nicht offen" -#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 -#: fe-secure.c:257 fe-secure.c:419 +#: fe-misc.c:751 fe-secure-openssl.c:210 fe-secure-openssl.c:316 +#: fe-secure.c:259 fe-secure.c:426 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1029,148 +1029,148 @@ msgstr "%s() fehlgeschlagen: %s" msgid "message type 0x%02x arrived from server while idle" msgstr "Nachricht vom Typ 0x%02x kam vom Server im Ruhezustand" -#: fe-protocol3.c:385 +#: fe-protocol3.c:380 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "Server sendete Daten (»D«-Nachricht) ohne vorherige Zeilenbeschreibung (»T«-Nachricht)" -#: fe-protocol3.c:427 +#: fe-protocol3.c:422 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "unerwartete Antwort vom Server; erstes empfangenes Zeichen war »%c«" -#: fe-protocol3.c:450 +#: fe-protocol3.c:445 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "Nachrichteninhalt stimmt nicht mit Länge in Nachrichtentyp »%c« überein" -#: fe-protocol3.c:468 +#: fe-protocol3.c:463 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "Synchronisation mit Server verloren: Nachrichtentyp »%c« empfangen, Länge %d" -#: fe-protocol3.c:520 fe-protocol3.c:560 +#: fe-protocol3.c:515 fe-protocol3.c:555 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:631 fe-protocol3.c:837 +#: fe-protocol3.c:626 fe-protocol3.c:832 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:700 +#: fe-protocol3.c:695 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +#: fe-protocol3.c:754 fe-protocol3.c:786 fe-protocol3.c:804 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:765 +#: fe-protocol3.c:760 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1020 +#: fe-protocol3.c:1015 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#: fe-protocol3.c:1063 fe-protocol3.c:1082 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1100 +#: fe-protocol3.c:1095 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1103 +#: fe-protocol3.c:1098 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1106 +#: fe-protocol3.c:1101 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1113 +#: fe-protocol3.c:1108 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1117 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1121 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1130 +#: fe-protocol3.c:1125 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1134 +#: fe-protocol3.c:1129 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1133 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1145 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1147 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1149 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1349 +#: fe-protocol3.c:1344 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1423 +#: fe-protocol3.c:1418 #, c-format msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" msgstr "Protokollversion nicht vom Server unterstützt: Client verwendet %u.%u, Server unterstützt bis %u.%u" -#: fe-protocol3.c:1429 +#: fe-protocol3.c:1424 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" msgstr[0] "Protokollerweiterung nicht vom Server unterstützt: %s" msgstr[1] "Protokollerweiterungen nicht vom Server unterstützt: %s" -#: fe-protocol3.c:1437 +#: fe-protocol3.c:1432 #, c-format msgid "invalid %s message" msgstr "ungültige %s-Nachricht" -#: fe-protocol3.c:1802 +#: fe-protocol3.c:1797 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: Text COPY OUT nicht ausgeführt" -#: fe-protocol3.c:2176 +#: fe-protocol3.c:2171 #, c-format msgid "protocol error: no function result" msgstr "Protokollfehler: kein Funktionsergebnis" -#: fe-protocol3.c:2187 +#: fe-protocol3.c:2182 #, c-format msgid "protocol error: id=0x%x" msgstr "Protokollfehler: id=0x%x" @@ -1212,132 +1212,132 @@ msgstr "Server-Zertifikat für »%s« stimmt nicht mit dem Hostnamen »%s« übe msgid "could not get server's host name from server certificate" msgstr "konnte Hostnamen des Servers nicht aus dem Serverzertifikat ermitteln" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:201 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: fe-secure-gssapi.c:215 +#: fe-secure-gssapi.c:208 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Client versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" -#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "übergroßes GSSAPI-Paket vom Server gesendet (%zu > %zu)" -#: fe-secure-gssapi.c:390 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPI-Unwrap-Fehler" -#: fe-secure-gssapi.c:399 +#: fe-secure-gssapi.c:395 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "eingehende GSSAPI-Nachricht verwendete keine Vertraulichkeit" -#: fe-secure-gssapi.c:656 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "konnte GSSAPI-Sicherheitskontext nicht initiieren" -#: fe-secure-gssapi.c:685 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" -#: fe-secure-gssapi.c:696 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPI-Fehler beim Einrichten des Kontexts" -#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:320 fe-secure-openssl.c:1518 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL-SYSCALL-Fehler: %s" -#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#: fe-secure-openssl.c:220 fe-secure-openssl.c:326 fe-secure-openssl.c:1521 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL-SYSCALL-Fehler: Dateiende entdeckt" -#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:336 fe-secure-openssl.c:1529 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#: fe-secure-openssl.c:244 fe-secure-openssl.c:350 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-Verbindung wurde unerwartet geschlossen" -#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#: fe-secure-openssl.c:249 fe-secure-openssl.c:355 fe-secure-openssl.c:1576 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:398 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "konnte Signaturalgorithmus des Serverzertifikats nicht ermitteln" -#: fe-secure-openssl.c:417 +#: fe-secure-openssl.c:418 #, c-format msgid "could not find digest for NID %s" msgstr "konnte Digest für NID %s nicht finden" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:427 #, c-format msgid "could not generate peer certificate hash" msgstr "konnte Hash des Zertifikats der Gegenstelle nicht erzeugen" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:510 #, c-format msgid "SSL certificate's name entry is missing" msgstr "Namenseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:543 +#: fe-secure-openssl.c:544 #, c-format msgid "SSL certificate's address entry is missing" msgstr "Adresseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:960 +#: fe-secure-openssl.c:945 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: fe-secure-openssl.c:1002 +#: fe-secure-openssl.c:987 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "ungültiger Wert »%s« für minimale SSL-Protokollversion" -#: fe-secure-openssl.c:1012 +#: fe-secure-openssl.c:997 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "konnte minimale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1013 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "ungültiger Wert »%s« für maximale SSL-Protokollversion" -#: fe-secure-openssl.c:1038 +#: fe-secure-openssl.c:1023 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "konnte maximale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1076 +#: fe-secure-openssl.c:1061 #, c-format msgid "could not load system root certificate paths: %s" msgstr "konnte System-Root-Zertifikat-Pfade nicht laden: %s" -#: fe-secure-openssl.c:1093 +#: fe-secure-openssl.c:1078 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1130 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1346,7 +1346,7 @@ msgstr "" "konnte Home-Verzeichnis nicht ermitteln, um Root-Zertifikat-Datei zu finden\n" "Legen Sie entweder die Datei an, verwenden Sie die vertrauenswürdigen Roots des Systems mit sslrootcert=system, oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten." -#: fe-secure-openssl.c:1148 +#: fe-secure-openssl.c:1133 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1355,112 +1355,112 @@ msgstr "" "Root-Zertifikat-Datei »%s« existiert nicht\n" "Legen Sie entweder die Datei an, verwenden Sie die vertrauenswürdigen Roots des Systems mit sslrootcert=system, oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten." -#: fe-secure-openssl.c:1183 +#: fe-secure-openssl.c:1168 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht öffnen: %s" -#: fe-secure-openssl.c:1201 +#: fe-secure-openssl.c:1186 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1225 +#: fe-secure-openssl.c:1210 #, c-format msgid "could not establish SSL connection: %s" msgstr "konnte SSL-Verbindung nicht aufbauen: %s" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1242 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "konnte SSL-Server-Name-Indication (SNI) nicht setzen: %s" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1286 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht laden: %s" -#: fe-secure-openssl.c:1311 +#: fe-secure-openssl.c:1297 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht initialisieren: %s" -#: fe-secure-openssl.c:1326 +#: fe-secure-openssl.c:1312 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« lesen: %s" -#: fe-secure-openssl.c:1339 +#: fe-secure-openssl.c:1325 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« laden: %s" -#: fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:1362 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "Zertifikat vorhanden, aber keine private Schlüsseldatei »%s«" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1365 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "konnte »stat« für private Schlüsseldatei »%s« nicht ausführen: %m" -#: fe-secure-openssl.c:1387 +#: fe-secure-openssl.c:1373 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "private Schlüsseldatei »%s« ist keine normale Datei" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1406 #, c-format msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" msgstr "private Schlüsseldatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der aktuelle Benutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist" -#: fe-secure-openssl.c:1444 +#: fe-secure-openssl.c:1430 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: fe-secure-openssl.c:1460 +#: fe-secure-openssl.c:1446 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "Zertifikat passt nicht zur privaten Schlüsseldatei »%s«: %s" -#: fe-secure-openssl.c:1528 +#: fe-secure-openssl.c:1515 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSL-Fehler: Zertifikatsüberprüfung fehlgeschlagen: %s" -#: fe-secure-openssl.c:1573 +#: fe-secure-openssl.c:1560 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." msgstr "Das zeigt möglicherweise an, dass der Server keine SSL-Protokollversion zwischen %s und %s unterstützt." -#: fe-secure-openssl.c:1606 +#: fe-secure-openssl.c:1593 #, c-format msgid "certificate could not be obtained: %s" msgstr "Zertifikat konnte nicht ermittelt werden: %s" -#: fe-secure-openssl.c:1711 +#: fe-secure-openssl.c:1699 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1720 +#: fe-secure-openssl.c:1725 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:1986 +#: fe-secure-openssl.c:2015 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" -#: fe-secure.c:263 +#: fe-secure.c:270 #, c-format msgid "could not receive data from server: %s" msgstr "konnte keine Daten vom Server empfangen: %s" -#: fe-secure.c:434 +#: fe-secure.c:441 #, c-format msgid "could not send data to server: %s" msgstr "konnte keine Daten an den Server senden: %s" diff --git a/src/interfaces/libpq/po/es.po b/src/interfaces/libpq/po/es.po index 3cf2429afcd..dc4551bb51a 100644 --- a/src/interfaces/libpq/po/es.po +++ b/src/interfaces/libpq/po/es.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-09 05:58+0000\n" +"POT-Creation-Date: 2024-12-02 21:59+0000\n" "PO-Revision-Date: 2023-10-06 13:28+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" @@ -78,11 +78,11 @@ msgstr "no se pudo generar nonce" #: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 #: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 #: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1323 +#: fe-connect.c:3291 fe-connect.c:4492 fe-connect.c:5157 fe-connect.c:5412 +#: fe-connect.c:5530 fe-connect.c:5777 fe-connect.c:5857 fe-connect.c:5955 +#: 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:4100 fe-exec.c:4264 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 @@ -535,246 +535,251 @@ msgstr "no se pudo enviar el paquete de inicio: %s" msgid "server does not support SSL, but SSL was required" msgstr "el servidor no soporta SSL, pero SSL es requerida" -#: fe-connect.c:3404 +#: fe-connect.c:3395 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "el servidor envió una respuesta de error durante el intercambio SSL" + +#: fe-connect.c:3400 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "se ha recibido una respuesta no válida en la negociación SSL: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3420 #, c-format msgid "received unencrypted data after SSL response" msgstr "se recibieron datos no cifrados después de la respuesta SSL" -#: fe-connect.c:3504 +#: fe-connect.c:3500 #, c-format msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "el servidor no soporta cifrado GSSAPI, pero es requerida" -#: fe-connect.c:3515 +#: fe-connect.c:3511 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "se ha recibido una respuesta no válida en la negociación GSSAPI: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3529 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "se recibieron datos no cifrados después de la respuesta de cifrado GSSAPI" -#: fe-connect.c:3598 +#: fe-connect.c:3594 #, c-format msgid "expected authentication request from server, but received %c" msgstr "se esperaba una petición de autentificación desde el servidor, pero se ha recibido %c" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3621 fe-connect.c:3790 #, c-format msgid "received invalid authentication request" msgstr "se recibió una solicitud de autentificación no válida" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3626 fe-connect.c:3775 #, c-format msgid "received invalid protocol negotiation message" msgstr "se recibió un mensaje de negociación de protocolo no válido" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3644 fe-connect.c:3698 #, c-format msgid "received invalid error message" msgstr "se recibió un mensaje de error no válido" -#: fe-connect.c:3865 +#: fe-connect.c:3861 #, c-format msgid "unexpected message from server during startup" msgstr "se ha recibido un mensaje inesperado del servidor durante el inicio" -#: fe-connect.c:3956 +#: fe-connect.c:3952 #, c-format msgid "session is read-only" msgstr "la sesión es de solo lectura" -#: fe-connect.c:3958 +#: fe-connect.c:3954 #, c-format msgid "session is not read-only" msgstr "la sesión no es de solo lectura" -#: fe-connect.c:4011 +#: fe-connect.c:4007 #, c-format msgid "server is in hot standby mode" msgstr "el servidor está en modo hot standby" -#: fe-connect.c:4013 +#: fe-connect.c:4009 #, c-format msgid "server is not in hot standby mode" msgstr "el servidor no está en modo hot standby" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4125 fe-connect.c:4175 #, c-format msgid "\"%s\" failed" msgstr "«%s» falló" -#: fe-connect.c:4193 +#: fe-connect.c:4189 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "estado de conexión no válido %d, probablemente por corrupción de memoria" -#: fe-connect.c:5174 +#: fe-connect.c:5170 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "URL LDAP no válida «%s»: el esquema debe ser ldap://" -#: fe-connect.c:5189 +#: fe-connect.c:5185 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "URL LDAP no válida «%s»: distinguished name faltante" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5197 fe-connect.c:5255 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "URL LDAP no válida «%s»: debe tener exactamente un atributo" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5209 fe-connect.c:5271 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "URL LDAP no válida «%s»: debe tener ámbito de búsqueda (base/one/sub)" -#: fe-connect.c:5225 +#: fe-connect.c:5221 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "URL LDAP no válida «%s»: no tiene filtro" -#: fe-connect.c:5247 +#: fe-connect.c:5243 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "URL LDAP no válida «%s»: número de puerto no válido" -#: fe-connect.c:5284 +#: fe-connect.c:5280 #, c-format msgid "could not create LDAP structure" msgstr "no se pudo crear estructura LDAP" -#: fe-connect.c:5359 +#: fe-connect.c:5355 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "búsqueda en servidor LDAP falló: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5365 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "se encontro más de una entrada en búsqueda LDAP" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5367 fe-connect.c:5378 #, c-format msgid "no entry found on LDAP lookup" msgstr "no se encontró ninguna entrada en búsqueda LDAP" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5388 fe-connect.c:5400 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "la búsqueda LDAP entregó atributo sin valores" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5451 fe-connect.c:5470 fe-connect.c:5994 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "falta «=» después de «%s» en la cadena de información de la conexión" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5541 fe-connect.c:6177 fe-connect.c:6975 #, c-format msgid "invalid connection option \"%s\"" msgstr "opción de conexión no válida «%s»" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5556 fe-connect.c:6042 #, c-format msgid "unterminated quoted string in connection info string" msgstr "cadena de caracteres entre comillas sin terminar en la cadena de información de conexión" -#: fe-connect.c:5640 +#: fe-connect.c:5636 #, c-format msgid "definition of service \"%s\" not found" msgstr "la definición de servicio «%s» no fue encontrada" -#: fe-connect.c:5666 +#: fe-connect.c:5662 #, c-format msgid "service file \"%s\" not found" msgstr "el archivo de servicio «%s» no fue encontrado" -#: fe-connect.c:5679 +#: fe-connect.c:5675 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "la línea %d es demasiado larga en archivo de servicio «%s»" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5746 fe-connect.c:5789 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "error de sintaxis en archivo de servicio «%s», línea %d" -#: fe-connect.c:5761 +#: fe-connect.c:5757 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "especificaciones de servicio anidadas no soportadas en archivo de servicio «%s», línea %d" -#: fe-connect.c:6500 +#: fe-connect.c:6496 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "URI no válida propagada a rutina interna de procesamiento: «%s»" -#: fe-connect.c:6577 +#: fe-connect.c:6573 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "se encontró el fin de la cadena mientras se buscaba el «]» correspondiente en dirección IPv6 en URI: «%s»" -#: fe-connect.c:6584 +#: fe-connect.c:6580 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "la dirección IPv6 no puede ser vacía en la URI: «%s»" -#: fe-connect.c:6599 +#: fe-connect.c:6595 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "carácter «%c» inesperado en la posición %d en URI (se esperaba «:» o «/»): «%s»" -#: fe-connect.c:6728 +#: fe-connect.c:6724 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "separador llave/valor «=» extra en parámetro de la URI: «%s»" -#: fe-connect.c:6748 +#: fe-connect.c:6744 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "separador llave/valor «=» faltante en parámetro de la URI: «%s»" -#: fe-connect.c:6800 +#: fe-connect.c:6796 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "parámetro de URI no válido: «%s»" -#: fe-connect.c:6874 +#: fe-connect.c:6870 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "elemento escapado con %% no válido: «%s»" -#: fe-connect.c:6884 +#: fe-connect.c:6880 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "valor no permitido %%00 en valor escapado con %%: «%s»" -#: fe-connect.c:7248 +#: fe-connect.c:7244 msgid "connection pointer is NULL\n" msgstr "el puntero de conexión es NULL\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:972 fe-exec.c:3321 +#: fe-connect.c:7252 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 "memoria agotada\n" -#: fe-connect.c:7547 +#: fe-connect.c:7543 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ADVERTENCIA: El archivo de claves «%s» no es un archivo plano\n" -#: fe-connect.c:7556 +#: fe-connect.c:7552 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ADVERTENCIA: El archivo de claves «%s» tiene permiso de lectura para el grupo u otros; los permisos deberían ser u=rw (0600) o menos\n" -#: fe-connect.c:7663 +#: fe-connect.c:7659 #, c-format msgid "password retrieved from file \"%s\"" msgstr "contraseña obtenida desde el archivo «%s»" @@ -1470,7 +1475,3 @@ msgstr "no se pudo enviar datos al servidor: %s" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "código de error de socket no reconocido: 0x%08X/%d" - -#, c-format -#~ msgid "keepalives parameter must be an integer" -#~ msgstr "el parámetro de keepalives debe ser un entero" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index c5f40cc5a1b..2298a9d619d 100644 --- a/src/interfaces/libpq/po/ru.po +++ b/src/interfaces/libpq/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-02 08:21+0300\n" -"PO-Revision-Date: 2023-08-30 15:09+0300\n" +"POT-Creation-Date: 2024-11-14 04:45+0300\n" +"PO-Revision-Date: 2024-11-14 05:02+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -77,11 +77,11 @@ msgstr "не удалось сгенерировать разовый код" #: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 #: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 #: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1323 +#: fe-connect.c:3291 fe-connect.c:4492 fe-connect.c:5157 fe-connect.c:5412 +#: fe-connect.c:5530 fe-connect.c:5777 fe-connect.c:5857 fe-connect.c:5955 +#: 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:4100 fe-exec.c:4264 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 @@ -573,179 +573,184 @@ msgstr "не удалось отправить стартовый пакет: %s msgid "server does not support SSL, but SSL was required" msgstr "затребовано подключение через SSL, но сервер не поддерживает SSL" -#: fe-connect.c:3404 +#: fe-connect.c:3395 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "сервер передал ошибочный ответ во время обмена сообщениями SSL" + +#: fe-connect.c:3400 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "получен неверный ответ при согласовании SSL: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3420 #, c-format msgid "received unencrypted data after SSL response" msgstr "после ответа SSL получены незашифрованные данные" -#: fe-connect.c:3504 +#: fe-connect.c:3500 #, c-format msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "затребовано шифрование GSSAPI, но сервер его не поддерживает" -#: fe-connect.c:3515 +#: fe-connect.c:3511 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "получен неверный ответ при согласовании GSSAPI: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3529 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "" "после ответа на запрос шифрования GSSAPI получены незашифрованные данные" -#: fe-connect.c:3598 +#: fe-connect.c:3594 #, c-format msgid "expected authentication request from server, but received %c" msgstr "ожидался запрос аутентификации от сервера, но получено: %c" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3621 fe-connect.c:3790 #, c-format msgid "received invalid authentication request" msgstr "получен некорректный запрос аутентификации" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3626 fe-connect.c:3775 #, c-format msgid "received invalid protocol negotiation message" msgstr "получено некорректное сообщение согласования протокола" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3644 fe-connect.c:3698 #, c-format msgid "received invalid error message" msgstr "получено некорректное сообщение об ошибке" -#: fe-connect.c:3865 +#: fe-connect.c:3861 #, c-format msgid "unexpected message from server during startup" msgstr "неожиданное сообщение от сервера в начале работы" -#: fe-connect.c:3956 +#: fe-connect.c:3952 #, c-format msgid "session is read-only" msgstr "сеанс не допускает запись" -#: fe-connect.c:3958 +#: fe-connect.c:3954 #, c-format msgid "session is not read-only" msgstr "сеанс допускает запись" -#: fe-connect.c:4011 +#: fe-connect.c:4007 #, c-format msgid "server is in hot standby mode" msgstr "сервер работает в режиме горячего резерва" -#: fe-connect.c:4013 +#: fe-connect.c:4009 #, c-format msgid "server is not in hot standby mode" msgstr "сервер работает не в режиме горячего резерва" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4125 fe-connect.c:4175 #, c-format msgid "\"%s\" failed" msgstr "выполнить \"%s\" не удалось" -#: fe-connect.c:4193 +#: fe-connect.c:4189 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "неверное состояние соединения %d - возможно разрушение памяти" -#: fe-connect.c:5174 +#: fe-connect.c:5170 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "некорректный адрес LDAP \"%s\": схема должна быть ldap://" -#: fe-connect.c:5189 +#: fe-connect.c:5185 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "некорректный адрес LDAP \"%s\": отсутствует уникальное имя" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5197 fe-connect.c:5255 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "некорректный адрес LDAP \"%s\": должен быть только один атрибут" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5209 fe-connect.c:5271 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "" "некорректный адрес LDAP \"%s\": не указана область поиска (base/one/sub)" -#: fe-connect.c:5225 +#: fe-connect.c:5221 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "некорректный адрес LDAP \"%s\": нет фильтра" -#: fe-connect.c:5247 +#: fe-connect.c:5243 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "некорректный адрес LDAP \"%s\": неверный номер порта" -#: fe-connect.c:5284 +#: fe-connect.c:5280 #, c-format msgid "could not create LDAP structure" msgstr "не удалось создать структуру LDAP" -#: fe-connect.c:5359 +#: fe-connect.c:5355 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "ошибка поиска на сервере LDAP: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5365 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "при поиске LDAP найдено более одного вхождения" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5367 fe-connect.c:5378 #, c-format msgid "no entry found on LDAP lookup" msgstr "при поиске LDAP ничего не найдено" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5388 fe-connect.c:5400 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "атрибут не содержит значений при поиске LDAP" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5451 fe-connect.c:5470 fe-connect.c:5994 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "в строке соединения нет \"=\" после \"%s\"" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5541 fe-connect.c:6177 fe-connect.c:6975 #, c-format msgid "invalid connection option \"%s\"" msgstr "неверный параметр соединения \"%s\"" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5556 fe-connect.c:6042 #, c-format msgid "unterminated quoted string in connection info string" msgstr "в строке соединения не хватает закрывающей кавычки" -#: fe-connect.c:5640 +#: fe-connect.c:5636 #, c-format msgid "definition of service \"%s\" not found" msgstr "определение службы \"%s\" не найдено" -#: fe-connect.c:5666 +#: fe-connect.c:5662 #, c-format msgid "service file \"%s\" not found" msgstr "файл определений служб \"%s\" не найден" -#: fe-connect.c:5679 +#: fe-connect.c:5675 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "слишком длинная строка (%d) в файле определений служб \"%s\"" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5746 fe-connect.c:5789 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "синтаксическая ошибка в файле определения служб \"%s\" (строка %d)" -#: fe-connect.c:5761 +#: fe-connect.c:5757 #, c-format msgid "" "nested service specifications not supported in service file \"%s\", line %d" @@ -753,24 +758,24 @@ msgstr "" "рекурсивные определения служб не поддерживаются (файл определения служб " "\"%s\", строка %d)" -#: fe-connect.c:6500 +#: fe-connect.c:6496 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "во внутреннюю процедуру разбора строки передан ошибочный URI: \"%s\"" -#: fe-connect.c:6577 +#: fe-connect.c:6573 #, c-format msgid "" "end of string reached when looking for matching \"]\" in IPv6 host address " "in URI: \"%s\"" msgstr "URI не содержит символ \"]\" после адреса IPv6: \"%s\"" -#: fe-connect.c:6584 +#: fe-connect.c:6580 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "IPv6, содержащийся в URI, не может быть пустым: \"%s\"" -#: fe-connect.c:6599 +#: fe-connect.c:6595 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " @@ -779,46 +784,46 @@ msgstr "" "неожиданный символ \"%c\" в позиции %d в URI (ожидалось \":\" или \"/\"): " "\"%s\"" -#: fe-connect.c:6728 +#: fe-connect.c:6724 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "лишний разделитель ключа/значения \"=\" в параметрах URI: \"%s\"" -#: fe-connect.c:6748 +#: fe-connect.c:6744 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "в параметрах URI не хватает разделителя ключа/значения \"=\": \"%s\"" -#: fe-connect.c:6800 +#: fe-connect.c:6796 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "неверный параметр в URI: \"%s\"" -#: fe-connect.c:6874 +#: fe-connect.c:6870 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "неверный символ, закодированный с %%: \"%s\"" -#: fe-connect.c:6884 +#: fe-connect.c:6880 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "недопустимое значение %%00 для символа, закодированного с %%: \"%s\"" -#: fe-connect.c:7248 +#: fe-connect.c:7244 msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:972 fe-exec.c:3321 +#: fe-connect.c:7252 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:7547 +#: fe-connect.c:7543 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:7556 +#: fe-connect.c:7552 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -827,7 +832,7 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: к файлу паролей \"%s\" имеют доступ все или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7663 +#: fe-connect.c:7659 #, c-format msgid "password retrieved from file \"%s\"" msgstr "пароль получен из файла \"%s\"" diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 76eb09abf78..8088333cd4f 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: 2024-08-01 12:51+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -22,17 +22,17 @@ msgstr "" msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor ожидает запрос или план" -#: plpy_cursorobject.c:155 +#: plpy_cursorobject.c:154 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor принимает в качестве второго аргумента последовательность" -#: plpy_cursorobject.c:171 plpy_spi.c:205 +#: plpy_cursorobject.c:170 plpy_spi.c:204 #, c-format msgid "could not execute plan" msgstr "нельзя выполнить план" -#: plpy_cursorobject.c:174 plpy_spi.c:208 +#: plpy_cursorobject.c:173 plpy_spi.c:207 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -40,28 +40,28 @@ msgstr[0] "Ожидалась последовательность из %d ар msgstr[1] "Ожидалась последовательность из %d аргументов, получено %d: %s" msgstr[2] "Ожидалась последовательность из %d аргументов, получено %d: %s" -#: plpy_cursorobject.c:321 +#: plpy_cursorobject.c:317 #, c-format msgid "iterating a closed cursor" msgstr "перемещение закрытого курсора" -#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#: plpy_cursorobject.c:325 plpy_cursorobject.c:391 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "перемещение курсора в прерванной подтранзакции" -#: plpy_cursorobject.c:387 +#: plpy_cursorobject.c:383 #, c-format msgid "fetch from a closed cursor" msgstr "выборка из закрытого курсора" -#: plpy_cursorobject.c:430 plpy_spi.c:401 +#: plpy_cursorobject.c:426 plpy_spi.c:393 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "" "результат запроса содержит слишком много строк для передачи в списке Python" -#: plpy_cursorobject.c:482 +#: plpy_cursorobject.c:478 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" @@ -329,17 +329,17 @@ msgstr "plpy.prepare: имя типа с порядковым номером %d msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ожидает запрос или план" -#: plpy_spi.c:189 +#: plpy_spi.c:188 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute принимает в качестве второго аргумента последовательность" -#: plpy_spi.c:297 +#: plpy_spi.c:289 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "ошибка в SPI_execute_plan: %s" -#: plpy_spi.c:339 +#: plpy_spi.c:331 #, c-format msgid "SPI_execute failed: %s" msgstr "ошибка в SPI_execute: %s" diff --git a/src/pl/tcl/po/ru.po b/src/pl/tcl/po/ru.po index 4c9c2f5ce7a..d5394691e79 100644 --- a/src/pl/tcl/po/ru.po +++ b/src/pl/tcl/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-01 12:51+0300\n" +"POT-Creation-Date: 2025-02-08 07:45+0200\n" "PO-Revision-Date: 2024-08-01 13:03+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,64 +17,64 @@ 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" -#: pltcl.c:462 +#: pltcl.c:466 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Функция на PL/Tcl, вызываемая при первом использовании pltcl." -#: pltcl.c:469 +#: pltcl.c:473 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Функция на PL/TclU, вызываемая при первом использовании pltclu." -#: pltcl.c:636 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Функция \"%s\" объявлена на другом языке" -#: pltcl.c:647 +#: pltcl.c:651 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "функция \"%s\" не должна иметь характеристику SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "обработка параметра %s" -#: pltcl.c:834 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: pltcl.c:839 +#: pltcl.c:843 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуется режим материализации, но он недопустим в этом контексте" -#: pltcl.c:1012 +#: pltcl.c:1016 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: pltcl.c:1031 +#: pltcl.c:1035 #, c-format msgid "could not parse function return value: %s" msgstr "разобрать возвращаемое функцией значение не удалось: %s" -#: pltcl.c:1298 +#: pltcl.c:1302 #, c-format msgid "could not parse trigger return value: %s" msgstr "разобрать возвращаемое триггером значение не удалось: %s" -#: pltcl.c:1383 pltcl.c:1810 +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1384 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" @@ -83,43 +83,43 @@ msgstr "" "%s\n" "в функции PL/Tcl \"%s\"" -#: pltcl.c:1547 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: pltcl.c:1551 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "функции PL/Tcl не могут возвращать тип %s" -#: pltcl.c:1590 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "функции PL/Tcl не могут принимать тип %s" -#: pltcl.c:1702 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не удалось создать внутреннюю процедуру \"%s\": %s" -#: pltcl.c:3206 +#: pltcl.c:3210 #, c-format msgid "column name/value list must have even number of elements" msgstr "в списке имён/значений столбцов должно быть чётное число элементов" -#: pltcl.c:3224 +#: pltcl.c:3228 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "" "список имён/значений столбцов содержит имя несуществующего столбца \"%s\"" -#: pltcl.c:3231 +#: pltcl.c:3235 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "присвоить значение системному атрибуту \"%s\" нельзя" -#: pltcl.c:3237 +#: pltcl.c:3241 #, c-format msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" From 6e05b195d0e192e143db8c4c7ef2526860341a2c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 10:03:39 -0500 Subject: [PATCH 111/119] Add pg_encoding_set_invalid() There are cases where we cannot / do not want to error out for invalidly encoded input. In such cases it can be useful to replace e.g. an incomplete multi-byte characters with bytes that will trigger an error when getting validated as part of a larger string. Unfortunately, until now, for some encoding no such sequence existed. For those encodings this commit removes one previously accepted input combination - we consider that to be ok, as the chosen bytes are outside of the valid ranges for the encodings, we just previously failed to detect that. As we cannot add a new field to pg_wchar_table without breaking ABI, this is implemented "in-line" in the newly added function. Author: Noah Misch Reviewed-by: Andres Freund Backpatch-through: 13 Security: CVE-2025-1094 --- src/common/wchar.c | 55 +++++++++++++++++++++++- src/include/mb/pg_wchar.h | 1 + src/test/regress/expected/conversion.out | 7 +++ src/test/regress/regress.c | 50 +++++++++++++++++++++ src/test/regress/sql/conversion.sql | 5 +++ 5 files changed, 117 insertions(+), 1 deletion(-) diff --git a/src/common/wchar.c b/src/common/wchar.c index fbac11deb4d..dcb03d0b65a 100644 --- a/src/common/wchar.c +++ b/src/common/wchar.c @@ -16,6 +16,25 @@ #include "utils/ascii.h" +/* + * In today's multibyte encodings other than UTF8, this two-byte sequence + * ensures pg_encoding_mblen() == 2 && pg_encoding_verifymbstr() == 0. + * + * For historical reasons, several verifychar implementations opt to reject + * this pair specifically. Byte pair range constraints, in encoding + * originator documentation, always excluded this pair. No core conversion + * could translate it. However, longstanding verifychar implementations + * accepted any non-NUL byte. big5_to_euc_tw and big5_to_mic even translate + * pairs not valid per encoding originator documentation. To avoid tightening + * core or non-core conversions in a security patch, we sought this one pair. + * + * PQescapeString() historically used spaces for BYTE1; many other values + * could suffice for BYTE1. + */ +#define NONUTF8_INVALID_BYTE0 (0x8d) +#define NONUTF8_INVALID_BYTE1 (' ') + + /* * Operations on multi-byte encodings are driven by a table of helper * functions. @@ -1526,6 +1545,11 @@ pg_big5_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -1575,6 +1599,11 @@ pg_gbk_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -1624,6 +1653,11 @@ pg_uhc_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -2068,6 +2102,19 @@ pg_utf8_islegal(const unsigned char *source, int length) } +/* + * Fills the provided buffer with two bytes such that: + * pg_encoding_mblen(dst) == 2 && pg_encoding_verifymbstr(dst) == 0 + */ +void +pg_encoding_set_invalid(int encoding, char *dst) +{ + Assert(pg_encoding_max_length(encoding) > 1); + + dst[0] = (encoding == PG_UTF8 ? 0xc0 : NONUTF8_INVALID_BYTE0); + dst[1] = NONUTF8_INVALID_BYTE1; +} + /* *------------------------------------------------------------------- * encoding info table @@ -2190,5 +2237,11 @@ pg_encoding_max_length(int encoding) { Assert(PG_VALID_ENCODING(encoding)); - return pg_wchar_table[encoding].maxmblen; + /* + * Check for the encoding despite the assert, due to some mingw versions + * otherwise issuing bogus warnings. + */ + return PG_VALID_ENCODING(encoding) ? + pg_wchar_table[encoding].maxmblen : + pg_wchar_table[PG_SQL_ASCII].maxmblen; } diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index 06a56a41bb8..396bbdef49b 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -573,6 +573,7 @@ extern int pg_valid_server_encoding_id(int encoding); * (in addition to the ones just above). The constant tables declared * earlier in this file are also available from libpgcommon. */ +extern void pg_encoding_set_invalid(int encoding, char *dst); extern int pg_encoding_mblen(int encoding, const char *mbstr); extern int pg_encoding_mblen_bounded(int encoding, const char *mbstr); extern int pg_encoding_dsplen(int encoding, const char *mbstr); diff --git a/src/test/regress/expected/conversion.out b/src/test/regress/expected/conversion.out index 442e7aff2b2..d785f92561e 100644 --- a/src/test/regress/expected/conversion.out +++ b/src/test/regress/expected/conversion.out @@ -5,6 +5,13 @@ \getenv libdir PG_LIBDIR \getenv dlsuffix PG_DLSUFFIX \set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_enc_setup() RETURNS void + AS :'regresslib', 'test_enc_setup' + LANGUAGE C STRICT; +SELECT FROM test_enc_setup(); +-- +(1 row) + CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) AS :'regresslib', 'test_enc_conversion' LANGUAGE C STRICT; diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index fe95efdbe40..0fc787c1aaf 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1105,6 +1105,56 @@ test_opclass_options_func(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } +/* one-time tests for encoding infrastructure */ +PG_FUNCTION_INFO_V1(test_enc_setup); +Datum +test_enc_setup(PG_FUNCTION_ARGS) +{ + /* Test pg_encoding_set_invalid() */ + for (int i = 0; i < _PG_LAST_ENCODING_; i++) + { + char buf[2], + bigbuf[16]; + int len, + mblen, + valid; + + if (pg_encoding_max_length(i) == 1) + continue; + pg_encoding_set_invalid(i, buf); + len = strnlen(buf, 2); + if (len != 2) + elog(WARNING, + "official invalid string for encoding \"%s\" has length %d", + pg_enc2name_tbl[i].name, len); + mblen = pg_encoding_mblen(i, buf); + if (mblen != 2) + elog(WARNING, + "official invalid string for encoding \"%s\" has mblen %d", + pg_enc2name_tbl[i].name, mblen); + valid = pg_encoding_verifymbstr(i, buf, len); + if (valid != 0) + elog(WARNING, + "official invalid string for encoding \"%s\" has valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + valid = pg_encoding_verifymbstr(i, buf, 1); + if (valid != 0) + elog(WARNING, + "first byte of official invalid string for encoding \"%s\" has valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + memset(bigbuf, ' ', sizeof(bigbuf)); + bigbuf[0] = buf[0]; + bigbuf[1] = buf[1]; + valid = pg_encoding_verifymbstr(i, bigbuf, sizeof(bigbuf)); + if (valid != 0) + elog(WARNING, + "trailing data changed official invalid string for encoding \"%s\" to have valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + } + + PG_RETURN_VOID(); +} + /* * Call an encoding conversion or verification function. * diff --git a/src/test/regress/sql/conversion.sql b/src/test/regress/sql/conversion.sql index 9a65fca91fb..b567a1a5721 100644 --- a/src/test/regress/sql/conversion.sql +++ b/src/test/regress/sql/conversion.sql @@ -8,6 +8,11 @@ \set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_enc_setup() RETURNS void + AS :'regresslib', 'test_enc_setup' + LANGUAGE C STRICT; +SELECT FROM test_enc_setup(); + CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) AS :'regresslib', 'test_enc_conversion' LANGUAGE C STRICT; From 56aa2dcddeb299f62dad98ba50ad8db47cddaf97 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 10:03:39 -0500 Subject: [PATCH 112/119] Specify the encoding of input to fmtId() This commit adds fmtIdEnc() and fmtQualifiedIdEnc(), which allow to specify the encoding as an explicit argument. Additionally setFmtEncoding() is provided, which defines the encoding when no explicit encoding is provided, to avoid breaking all code using fmtId(). All users of fmtId()/fmtQualifiedId() are either converted to the explicit version or a call to setFmtEncoding() has been added. This commit does not yet utilize the now well-defined encoding, that will happen in a subsequent commit. Reviewed-by: Noah Misch Reviewed-by: Tom Lane Backpatch-through: 13 Security: CVE-2025-1094 --- src/bin/pg_dump/pg_backup_archiver.c | 1 + src/bin/pg_dump/pg_dump.c | 1 + src/bin/pg_dump/pg_dumpall.c | 1 + src/bin/psql/command.c | 3 + src/bin/scripts/common.c | 5 +- src/bin/scripts/createdb.c | 2 + src/bin/scripts/createuser.c | 2 + src/bin/scripts/dropdb.c | 13 ++--- src/bin/scripts/dropuser.c | 3 +- src/bin/scripts/reindexdb.c | 11 ++-- src/bin/scripts/vacuumdb.c | 5 +- src/fe_utils/string_utils.c | 84 ++++++++++++++++++++++++++-- src/include/fe_utils/string_utils.h | 3 + 13 files changed, 112 insertions(+), 22 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 958f88d4201..3448aba12f4 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -2713,6 +2713,7 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te) pg_fatal("unrecognized encoding \"%s\"", ptr1); AH->public.encoding = encoding; + setFmtEncoding(encoding); } else pg_fatal("invalid ENCODING item: %s", diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index c0d22b87af4..ba71c0b0f32 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1172,6 +1172,7 @@ setup_connection(Archive *AH, const char *dumpencoding, * we know how to escape strings. */ AH->encoding = PQclientEncoding(conn); + setFmtEncoding(AH->encoding); std_strings = PQparameterStatus(conn, "standard_conforming_strings"); AH->std_strings = (std_strings && strcmp(std_strings, "on") == 0); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 591fcb07c5b..9d8732ac736 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -519,6 +519,7 @@ main(int argc, char *argv[]) * we know how to escape strings. */ encoding = PQclientEncoding(conn); + setFmtEncoding(encoding); std_strings = PQparameterStatus(conn, "standard_conforming_strings"); if (!std_strings) std_strings = "off"; diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index e2e639ce76d..0cf32d156a8 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1318,6 +1318,7 @@ exec_command_encoding(PsqlScanState scan_state, bool active_branch) /* save encoding info into psql internal data */ pset.encoding = PQclientEncoding(pset.db); pset.popt.topt.encoding = pset.encoding; + setFmtEncoding(pset.encoding); SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding)); } @@ -3867,6 +3868,8 @@ SyncVariables(void) pset.popt.topt.encoding = pset.encoding; pset.sversion = PQserverVersion(pset.db); + setFmtEncoding(pset.encoding); + SetVariable(pset.vars, "DBNAME", PQdb(pset.db)); SetVariable(pset.vars, "USER", PQuser(pset.db)); SetVariable(pset.vars, "HOST", PQhost(pset.db)); diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c index 4c52fb6a3e4..c7a607f7afd 100644 --- a/src/bin/scripts/common.c +++ b/src/bin/scripts/common.c @@ -112,8 +112,9 @@ appendQualifiedRelation(PQExpBuffer buf, const char *spec, exit(1); } appendPQExpBufferStr(buf, - fmtQualifiedId(PQgetvalue(res, 0, 1), - PQgetvalue(res, 0, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, 0, 1), + PQgetvalue(res, 0, 0), + PQclientEncoding(conn))); appendPQExpBufferStr(buf, columns); PQclear(res); termPQExpBuffer(&sql); diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index ef34b24890c..05636883256 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -193,6 +193,8 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + setFmtEncoding(PQclientEncoding(conn)); + initPQExpBuffer(&sql); appendPQExpBuffer(&sql, "CREATE DATABASE %s", diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c index 0709491185c..e69301501fe 100644 --- a/src/bin/scripts/createuser.c +++ b/src/bin/scripts/createuser.c @@ -292,6 +292,8 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + setFmtEncoding(PQclientEncoding(conn)); + initPQExpBuffer(&sql); printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser)); diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c index 8d0f432f3d7..483f11cefff 100644 --- a/src/bin/scripts/dropdb.c +++ b/src/bin/scripts/dropdb.c @@ -129,13 +129,6 @@ main(int argc, char *argv[]) exit(0); } - initPQExpBuffer(&sql); - - appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", - (if_exists ? "IF EXISTS " : ""), - fmtId(dbname), - force ? " WITH (FORCE)" : ""); - /* Avoid trying to drop postgres db while we are connected to it. */ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) maintenance_db = "template1"; @@ -149,6 +142,12 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + initPQExpBuffer(&sql); + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", + (if_exists ? "IF EXISTS " : ""), + fmtIdEnc(dbname, PQclientEncoding(conn)), + force ? " WITH (FORCE)" : ""); + if (echo) printf("%s\n", sql.data); result = PQexec(conn, sql.data); diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c index 8aad932e6a5..30fcdec912a 100644 --- a/src/bin/scripts/dropuser.c +++ b/src/bin/scripts/dropuser.c @@ -143,7 +143,8 @@ main(int argc, char *argv[]) initPQExpBuffer(&sql); appendPQExpBuffer(&sql, "DROP ROLE %s%s;", - (if_exists ? "IF EXISTS " : ""), fmtId(dropuser)); + (if_exists ? "IF EXISTS " : ""), + fmtIdEnc(dropuser, PQclientEncoding(conn))); if (echo) printf("%s\n", sql.data); diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index b3becff8eca..93fb479d977 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -489,7 +489,8 @@ run_reindex_command(PGconn *conn, ReindexType type, const char *name, if (tablespace) { - appendPQExpBuffer(&sql, "%sTABLESPACE %s", sep, fmtId(tablespace)); + appendPQExpBuffer(&sql, "%sTABLESPACE %s", sep, + fmtIdEnc(tablespace, PQclientEncoding(conn))); sep = comma; } @@ -529,7 +530,8 @@ run_reindex_command(PGconn *conn, ReindexType type, const char *name, { case REINDEX_DATABASE: case REINDEX_SYSTEM: - appendPQExpBufferStr(&sql, fmtId(name)); + appendPQExpBufferStr(&sql, + fmtIdEnc(name, PQclientEncoding(conn))); break; case REINDEX_INDEX: case REINDEX_TABLE: @@ -699,8 +701,9 @@ get_parallel_object_list(PGconn *conn, ReindexType type, for (i = 0; i < ntups; i++) { appendPQExpBufferStr(&buf, - fmtQualifiedId(PQgetvalue(res, i, 1), - PQgetvalue(res, i, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, i, 1), + PQgetvalue(res, i, 0), + PQclientEncoding(conn))); simple_string_list_append(tables, buf.data); resetPQExpBuffer(&buf); diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index c475c0f2861..a1ebabc0735 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -795,8 +795,9 @@ vacuum_one_database(ConnParams *cparams, for (i = 0; i < ntups; i++) { appendPQExpBufferStr(&buf, - fmtQualifiedId(PQgetvalue(res, i, 1), - PQgetvalue(res, i, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, i, 1), + PQgetvalue(res, i, 0), + PQclientEncoding(conn))); if (objects_listed && !PQgetisnull(res, i, 2)) appendPQExpBufferStr(&buf, PQgetvalue(res, i, 2)); diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 0429a72bfe2..2e2b0d18af4 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -19,6 +19,7 @@ #include "common/keywords.h" #include "fe_utils/string_utils.h" +#include "mb/pg_wchar.h" static PQExpBuffer defaultGetLocalPQExpBuffer(void); @@ -26,6 +27,8 @@ static PQExpBuffer defaultGetLocalPQExpBuffer(void); int quote_all_identifiers = 0; PQExpBuffer (*getLocalPQExpBuffer) (void) = defaultGetLocalPQExpBuffer; +static int fmtIdEncoding = -1; + /* * Returns a temporary PQExpBuffer, valid until the next call to the function. @@ -54,14 +57,48 @@ defaultGetLocalPQExpBuffer(void) return id_return; } +/* + * Set the encoding that fmtId() and fmtQualifiedId() use. + * + * This is not safe against multiple connections having different encodings, + * but there is no real other way to address the need to know the encoding for + * fmtId()/fmtQualifiedId() input for safe escaping. Eventually we should get + * rid of fmtId(). + */ +void +setFmtEncoding(int encoding) +{ + fmtIdEncoding = encoding; +} + +/* + * Return the currently configured encoding for fmtId() and fmtQualifiedId(). + */ +static int +getFmtEncoding(void) +{ + if (fmtIdEncoding != -1) + return fmtIdEncoding; + + /* + * In assertion builds it seems best to fail hard if the encoding was not + * set, to make it easier to find places with missing calls. But in + * production builds that seems like a bad idea, thus we instead just + * default to UTF-8. + */ + Assert(fmtIdEncoding != -1); + + return PG_UTF8; +} + /* * Quotes input string if it's not a legitimate SQL identifier as-is. * - * Note that the returned string must be used before calling fmtId again, + * Note that the returned string must be used before calling fmtIdEnc again, * since we re-use the same return buffer each time. */ const char * -fmtId(const char *rawid) +fmtIdEnc(const char *rawid, int encoding) { PQExpBuffer id_return = getLocalPQExpBuffer(); @@ -134,7 +171,24 @@ fmtId(const char *rawid) } /* - * fmtQualifiedId - construct a schema-qualified name, with quoting as needed. + * Quotes input string if it's not a legitimate SQL identifier as-is. + * + * Note that the returned string must be used before calling fmtId again, + * since we re-use the same return buffer each time. + * + * NB: This assumes setFmtEncoding() previously has been called to configure + * the encoding of rawid. It is preferable to use fmtIdEnc() with an + * explicit encoding. + */ +const char * +fmtId(const char *rawid) +{ + return fmtIdEnc(rawid, getFmtEncoding()); +} + +/* + * fmtQualifiedIdEnc - construct a schema-qualified name, with quoting as + * needed. * * Like fmtId, use the result before calling again. * @@ -142,7 +196,7 @@ fmtId(const char *rawid) * use that buffer until we're finished with calling fmtId(). */ const char * -fmtQualifiedId(const char *schema, const char *id) +fmtQualifiedIdEnc(const char *schema, const char *id, int encoding) { PQExpBuffer id_return; PQExpBuffer lcl_pqexp = createPQExpBuffer(); @@ -150,9 +204,9 @@ fmtQualifiedId(const char *schema, const char *id) /* Some callers might fail to provide a schema name */ if (schema && *schema) { - appendPQExpBuffer(lcl_pqexp, "%s.", fmtId(schema)); + appendPQExpBuffer(lcl_pqexp, "%s.", fmtIdEnc(schema, encoding)); } - appendPQExpBufferStr(lcl_pqexp, fmtId(id)); + appendPQExpBufferStr(lcl_pqexp, fmtIdEnc(id, encoding)); id_return = getLocalPQExpBuffer(); @@ -162,6 +216,24 @@ fmtQualifiedId(const char *schema, const char *id) return id_return->data; } +/* + * fmtQualifiedId - construct a schema-qualified name, with quoting as needed. + * + * Like fmtId, use the result before calling again. + * + * Since we call fmtId and it also uses getLocalPQExpBuffer() we cannot + * use that buffer until we're finished with calling fmtId(). + * + * NB: This assumes setFmtEncoding() previously has been called to configure + * the encoding of schema/id. It is preferable to use fmtQualifiedIdEnc() + * with an explicit encoding. + */ +const char * +fmtQualifiedId(const char *schema, const char *id) +{ + return fmtQualifiedIdEnc(schema, id, getFmtEncoding()); +} + /* * Format a Postgres version number (in the PG_VERSION_NUM integer format diff --git a/src/include/fe_utils/string_utils.h b/src/include/fe_utils/string_utils.h index e10c9090754..9980f193161 100644 --- a/src/include/fe_utils/string_utils.h +++ b/src/include/fe_utils/string_utils.h @@ -25,7 +25,10 @@ extern PQExpBuffer (*getLocalPQExpBuffer) (void); /* Functions */ extern const char *fmtId(const char *rawid); +extern const char *fmtIdEnc(const char *rawid, int encoding); extern const char *fmtQualifiedId(const char *schema, const char *id); +extern const char *fmtQualifiedIdEnc(const char *schema, const char *id, int encoding); +extern void setFmtEncoding(int encoding); extern char *formatPGVersionNumber(int version_number, bool include_minor, char *buf, size_t buflen); From 92e4170f421832208a75645f4a4ea94494bdad4d Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 10:03:39 -0500 Subject: [PATCH 113/119] Fix handling of invalidly encoded data in escaping functions Previously invalidly encoded input to various escaping functions could lead to the escaped string getting incorrectly parsed by psql. To be safe, escaping functions need to ensure that neither invalid nor incomplete multi-byte characters can be used to "escape" from being quoted. Functions which can report errors now return an error in more cases than before. Functions that cannot report errors now replace invalid input bytes with a byte sequence that cannot be used to escape the quotes and that is guaranteed to error out when a query is sent to the server. The following functions are fixed by this commit: - PQescapeLiteral() - PQescapeIdentifier() - PQescapeString() - PQescapeStringConn() - fmtId() - appendStringLiteral() Reported-by: Stephen Fewer Reviewed-by: Noah Misch Reviewed-by: Tom Lane Backpatch-through: 13 Security: CVE-2025-1094 --- src/fe_utils/string_utils.c | 170 ++++++++++++++++++++++++++------- src/interfaces/libpq/fe-exec.c | 134 +++++++++++++++++++------- 2 files changed, 236 insertions(+), 68 deletions(-) diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 2e2b0d18af4..75b4f777db5 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -104,6 +104,7 @@ fmtIdEnc(const char *rawid, int encoding) const char *cp; bool need_quotes = false; + size_t remaining = strlen(rawid); /* * These checks need to match the identifier production in scan.l. Don't @@ -117,7 +118,8 @@ fmtIdEnc(const char *rawid, int encoding) else { /* otherwise check the entire string */ - for (cp = rawid; *cp; cp++) + cp = rawid; + for (size_t i = 0; i < remaining; i++, cp++) { if (!((*cp >= 'a' && *cp <= 'z') || (*cp >= '0' && *cp <= '9') @@ -153,17 +155,90 @@ fmtIdEnc(const char *rawid, int encoding) else { appendPQExpBufferChar(id_return, '"'); - for (cp = rawid; *cp; cp++) + + cp = &rawid[0]; + while (remaining > 0) { - /* - * Did we find a double-quote in the string? Then make this a - * double double-quote per SQL99. Before, we put in a - * backslash/double-quote pair. - thomas 2000-08-05 - */ - if (*cp == '"') - appendPQExpBufferChar(id_return, '"'); - appendPQExpBufferChar(id_return, *cp); + int charlen; + + /* Fast path for plain ASCII */ + if (!IS_HIGHBIT_SET(*cp)) + { + /* + * Did we find a double-quote in the string? Then make this a + * double double-quote per SQL99. Before, we put in a + * backslash/double-quote pair. - thomas 2000-08-05 + */ + if (*cp == '"') + appendPQExpBufferChar(id_return, '"'); + appendPQExpBufferChar(id_return, *cp); + remaining--; + cp++; + continue; + } + + /* Slow path for possible multibyte characters */ + charlen = pg_encoding_mblen(encoding, cp); + + if (remaining < charlen) + { + /* + * If the character is longer than the available input, + * replace the string with an invalid sequence. The invalid + * sequence ensures that the escaped string will trigger an + * error on the server-side, even if we can't directly report + * an error here. + */ + enlargePQExpBuffer(id_return, 2); + pg_encoding_set_invalid(encoding, + id_return->data + id_return->len); + id_return->len += 2; + id_return->data[id_return->len] = '\0'; + + /* there's no more input data, so we can stop */ + break; + } + else if (pg_encoding_verifymbchar(encoding, cp, charlen) == -1) + { + /* + * Multibyte character is invalid. It's important to verify + * that as invalid multi-byte characters could e.g. be used to + * "skip" over quote characters, e.g. when parsing + * character-by-character. + * + * Replace the bytes corresponding to the invalid character + * with an invalid sequence, for the same reason as above. + * + * It would be a bit faster to verify the whole string the + * first time we encounter a set highbit, but this way we can + * replace just the invalid characters, which probably makes + * it easier for users to find the invalidly encoded portion + * of a larger string. + */ + enlargePQExpBuffer(id_return, 2); + pg_encoding_set_invalid(encoding, + id_return->data + id_return->len); + id_return->len += 2; + id_return->data[id_return->len] = '\0'; + + /* + * Copy the rest of the string after the invalid multi-byte + * character. + */ + remaining -= charlen; + cp += charlen; + } + else + { + for (int i = 0; i < charlen; i++) + { + appendPQExpBufferChar(id_return, *cp); + remaining--; + cp++; + } + } } + appendPQExpBufferChar(id_return, '"'); } @@ -290,6 +365,7 @@ appendStringLiteral(PQExpBuffer buf, const char *str, size_t length = strlen(str); const char *source = str; char *target; + size_t remaining = length; if (!enlargePQExpBuffer(buf, 2 * length + 2)) return; @@ -297,10 +373,10 @@ appendStringLiteral(PQExpBuffer buf, const char *str, target = buf->data + buf->len; *target++ = '\''; - while (*source != '\0') + while (remaining > 0) { char c = *source; - int len; + int charlen; int i; /* Fast path for plain ASCII */ @@ -312,39 +388,65 @@ appendStringLiteral(PQExpBuffer buf, const char *str, /* Copy the character */ *target++ = c; source++; + remaining--; continue; } /* Slow path for possible multibyte characters */ - len = PQmblen(source, encoding); + charlen = PQmblen(source, encoding); - /* Copy the character */ - for (i = 0; i < len; i++) + if (remaining < charlen) { - if (*source == '\0') - break; - *target++ = *source++; - } + /* + * If the character is longer than the available input, replace + * the string with an invalid sequence. The invalid sequence + * ensures that the escaped string will trigger an error on the + * server-side, even if we can't directly report an error here. + * + * We know there's enough space for the invalid sequence because + * the "target" buffer is 2 * length + 2 long, and at worst we're + * replacing a single input byte with two invalid bytes. + */ + pg_encoding_set_invalid(encoding, target); + target += 2; - /* - * If we hit premature end of string (ie, incomplete multibyte - * character), try to pad out to the correct length with spaces. We - * may not be able to pad completely, but we will always be able to - * insert at least one pad space (since we'd not have quoted a - * multibyte character). This should be enough to make a string that - * the server will error out on. - */ - if (i < len) + /* there's no more valid input data, so we can stop */ + break; + } + else if (pg_encoding_verifymbchar(encoding, source, charlen) == -1) { - char *stop = buf->data + buf->maxlen - 2; + /* + * Multibyte character is invalid. It's important to verify that + * as invalid multi-byte characters could e.g. be used to "skip" + * over quote characters, e.g. when parsing + * character-by-character. + * + * Replace the bytes corresponding to the invalid character with + * an invalid sequence, for the same reason as above. + * + * It would be a bit faster to verify the whole string the first + * time we encounter a set highbit, but this way we can replace + * just the invalid characters, which probably makes it easier for + * users to find the invalidly encoded portion of a larger string. + */ + pg_encoding_set_invalid(encoding, target); + target += 2; + remaining -= charlen; - for (; i < len; i++) + /* + * Copy the rest of the string after the invalid multi-byte + * character. + */ + source += charlen; + } + else + { + /* Copy the character */ + for (i = 0; i < charlen; i++) { - if (target >= stop) - break; - *target++ = ' '; + *target++ = *source++; + remaining--; } - break; } } diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index fa9d6aaddf5..ed249fb9689 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -3941,15 +3941,15 @@ PQescapeStringInternal(PGconn *conn, { const char *source = from; char *target = to; - size_t remaining = length; + size_t remaining = strnlen(from, length); if (error) *error = 0; - while (remaining > 0 && *source != '\0') + while (remaining > 0) { char c = *source; - int len; + int charlen; int i; /* Fast path for plain ASCII */ @@ -3966,38 +3966,76 @@ PQescapeStringInternal(PGconn *conn, } /* Slow path for possible multibyte characters */ - len = pg_encoding_mblen(encoding, source); + charlen = pg_encoding_mblen(encoding, source); - /* Copy the character */ - for (i = 0; i < len; i++) + if (remaining < charlen) { - if (remaining == 0 || *source == '\0') - break; - *target++ = *source++; - remaining--; - } + /* + * If the character is longer than the available input, report an + * error if possible, and replace the string with an invalid + * sequence. The invalid sequence ensures that the escaped string + * will trigger an error on the server-side, even if we can't + * directly report an error here. + * + * This isn't *that* crucial when we can report an error to the + * caller, but if we can't, the caller will use this string + * unmodified and it needs to be safe for parsing. + * + * We know there's enough space for the invalid sequence because + * the "to" buffer needs to be at least 2 * length + 1 long, and + * at worst we're replacing a single input byte with two invalid + * bytes. + */ + if (error) + *error = 1; + if (conn) + libpq_append_conn_error(conn, "incomplete multibyte character"); - /* - * If we hit premature end of string (ie, incomplete multibyte - * character), try to pad out to the correct length with spaces. We - * may not be able to pad completely, but we will always be able to - * insert at least one pad space (since we'd not have quoted a - * multibyte character). This should be enough to make a string that - * the server will error out on. - */ - if (i < len) + pg_encoding_set_invalid(encoding, target); + target += 2; + + /* there's no more input data, so we can stop */ + break; + } + else if (pg_encoding_verifymbchar(encoding, source, charlen) == -1) { + /* + * Multibyte character is invalid. It's important to verify that + * as invalid multi-byte characters could e.g. be used to "skip" + * over quote characters, e.g. when parsing + * character-by-character. + * + * Replace the bytes corresponding to the invalid character with + * an invalid sequence, for the same reason as above. + * + * It would be a bit faster to verify the whole string the first + * time we encounter a set highbit, but this way we can replace + * just the invalid characters, which probably makes it easier for + * users to find the invalidly encoded portion of a larger string. + */ if (error) *error = 1; if (conn) - libpq_append_conn_error(conn, "incomplete multibyte character"); - for (; i < len; i++) + libpq_append_conn_error(conn, "invalid multibyte character"); + + pg_encoding_set_invalid(encoding, target); + target += 2; + remaining -= charlen; + + /* + * Copy the rest of the string after the invalid multi-byte + * character. + */ + source += charlen; + } + else + { + /* Copy the character */ + for (i = 0; i < charlen; i++) { - if (((size_t) (target - to)) / 2 >= length) - break; - *target++ = ' '; + *target++ = *source++; + remaining--; } - break; } } @@ -4052,9 +4090,10 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) char *rp; int num_quotes = 0; /* single or double, depending on as_ident */ int num_backslashes = 0; - int input_len; - int result_size; + size_t input_len = strlen(str); + size_t result_size; char quote_char = as_ident ? '"' : '\''; + bool validated_mb = false; /* We must have a connection, else fail immediately. */ if (!conn) @@ -4063,8 +4102,12 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) if (conn->cmd_queue_head == NULL) pqClearConnErrorState(conn); - /* Scan the string for characters that must be escaped. */ - for (s = str; (s - str) < len && *s != '\0'; ++s) + /* + * Scan the string for characters that must be escaped and for invalidly + * encoded data. + */ + s = str; + for (size_t remaining = input_len; remaining > 0; remaining--, s++) { if (*s == quote_char) ++num_quotes; @@ -4077,20 +4120,41 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) /* Slow path for possible multibyte characters */ charlen = pg_encoding_mblen(conn->client_encoding, s); - /* Multibyte character overruns allowable length. */ - if ((s - str) + charlen > len || memchr(s, 0, charlen) != NULL) + if (charlen > remaining) { + /* Multibyte character overruns allowable length. */ libpq_append_conn_error(conn, "incomplete multibyte character"); return NULL; } + /* + * If we haven't already, check that multibyte characters are + * valid. It's important to verify that as invalid multi-byte + * characters could e.g. be used to "skip" over quote characters, + * e.g. when parsing character-by-character. + * + * We check validity once, for the whole remainder of the string, + * when we first encounter any multi-byte character. Some + * encodings have optimized implementations for longer strings. + */ + if (!validated_mb) + { + if (pg_encoding_verifymbstr(conn->client_encoding, s, remaining) + != strlen(s)) + { + libpq_append_conn_error(conn, "invalid multibyte character"); + return NULL; + } + validated_mb = true; + } + /* Adjust s, bearing in mind that for loop will increment it. */ s += charlen - 1; + remaining -= charlen - 1; } } /* Allocate output buffer. */ - input_len = s - str; result_size = input_len + num_quotes + 3; /* two quotes, plus a NUL */ if (!as_ident && num_backslashes > 0) result_size += num_backslashes + 2; @@ -4135,7 +4199,8 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) } else { - for (s = str; s - str < input_len; ++s) + s = str; + for (size_t remaining = input_len; remaining > 0; remaining--, s++) { if (*s == quote_char || (!as_ident && *s == '\\')) { @@ -4153,6 +4218,7 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) *rp++ = *s; if (--i == 0) break; + remaining--; ++s; /* for loop will provide the final increment */ } } From 01784793fca3d998dd36ea21f120a78f0b3d5e85 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 10:03:39 -0500 Subject: [PATCH 114/119] Add test of various escape functions As highlighted by the prior commit, writing correct escape functions is less trivial than one might hope. This test module tries to verify that different escaping functions behave reasonably. It e.g. tests: - Invalidly encoded input to an escape function leads to invalidly encoded output - Trailing incomplete multi-byte characters are handled sensibly - Escaped strings are parsed as single statement by psql's parser (which derives from the backend parser) There are further tests that would be good to add. But even in the current state it was rather useful for writing the fix in the prior commit. Reviewed-by: Noah Misch Backpatch-through: 13 Security: CVE-2025-1094 --- src/test/modules/Makefile | 1 + src/test/modules/meson.build | 1 + src/test/modules/test_escape/.gitignore | 2 + src/test/modules/test_escape/Makefile | 27 + src/test/modules/test_escape/meson.build | 31 + .../modules/test_escape/t/001_test_escape.pl | 53 ++ src/test/modules/test_escape/test_escape.c | 803 ++++++++++++++++++ src/tools/msvc/Mkvcbuild.pm | 2 +- src/tools/pgindent/typedefs.list | 3 + 9 files changed, 922 insertions(+), 1 deletion(-) create mode 100644 src/test/modules/test_escape/.gitignore create mode 100644 src/test/modules/test_escape/Makefile create mode 100644 src/test/modules/test_escape/meson.build create mode 100644 src/test/modules/test_escape/t/001_test_escape.pl create mode 100644 src/test/modules/test_escape/test_escape.c diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index 6331c976dcb..f9a3bdcaf82 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -18,6 +18,7 @@ SUBDIRS = \ test_copy_callbacks \ test_custom_rmgrs \ test_ddl_deparse \ + test_escape \ test_extensions \ test_ginpostinglist \ test_integerset \ diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build index 17d369e3789..9556bac4ad4 100644 --- a/src/test/modules/meson.build +++ b/src/test/modules/meson.build @@ -15,6 +15,7 @@ subdir('test_bloomfilter') subdir('test_copy_callbacks') subdir('test_custom_rmgrs') subdir('test_ddl_deparse') +subdir('test_escape') subdir('test_extensions') subdir('test_ginpostinglist') subdir('test_integerset') diff --git a/src/test/modules/test_escape/.gitignore b/src/test/modules/test_escape/.gitignore new file mode 100644 index 00000000000..e498d6b7efa --- /dev/null +++ b/src/test/modules/test_escape/.gitignore @@ -0,0 +1,2 @@ +/tmp_check/ +/test_escape diff --git a/src/test/modules/test_escape/Makefile b/src/test/modules/test_escape/Makefile new file mode 100644 index 00000000000..786db4cbae4 --- /dev/null +++ b/src/test/modules/test_escape/Makefile @@ -0,0 +1,27 @@ +# src/test/modules/test_escape/Makefile + +PGFILEDESC = "test escape program" +PGAPPICON = win32 + +PROGRAM = test_escape +OBJS = $(WIN32RES) test_escape.o + +PG_CPPFLAGS = -I$(libpq_srcdir) +PG_LIBS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) + +NO_INSTALL = 1 +TAP_TESTS = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_escape +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif + +test_escape$(X): | submake-libpgfeutils +check: test_escape$(X) diff --git a/src/test/modules/test_escape/meson.build b/src/test/modules/test_escape/meson.build new file mode 100644 index 00000000000..a21341d5067 --- /dev/null +++ b/src/test/modules/test_escape/meson.build @@ -0,0 +1,31 @@ +test_escape_sources = files( + 'test_escape.c', +) + +if host_system == 'windows' + test_escape_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_escape', + '--FILEDESC', 'test escape program',]) +endif + +test_escape = executable('test_escape', + test_escape_sources, + dependencies: [frontend_code, libpq], + kwargs: default_bin_args + { + 'install': false, + } +) +testprep_targets += test_escape + + +tests += { + 'name': 'test_escape', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_test_escape.pl', + ], + 'deps': [test_escape], + }, +} diff --git a/src/test/modules/test_escape/t/001_test_escape.pl b/src/test/modules/test_escape/t/001_test_escape.pl new file mode 100644 index 00000000000..0d5aec3ed74 --- /dev/null +++ b/src/test/modules/test_escape/t/001_test_escape.pl @@ -0,0 +1,53 @@ +# Copyright (c) 2023-2025, PostgreSQL Global Development Group +use strict; +use warnings FATAL => 'all'; +use Config; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('node'); + +$node->init(); +$node->start(); + +$node->safe_psql('postgres', + q(CREATE DATABASE db_sql_ascii ENCODING "sql_ascii" TEMPLATE template0;)); + +my $cmd = + [ 'test_escape', '--conninfo', $node->connstr . " dbname=db_sql_ascii" ]; + +# There currently is no good other way to transport test results from a C +# program that requires just the node being set-up... +my ($stderr, $stdout); +my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + +is($result, 1, "test_escape returns 0"); +is($stderr, '', "test_escape stderr is empty"); + +foreach my $line (split('\n', $stdout)) +{ + if ($line =~ m/^ok \d+ ?(.*)/) + { + ok(1, $1); + } + + elsif ($line =~ m/^not ok \d+ ?(.*)/) + { + ok(0, $1); + } + + elsif ($line =~ m/^# ?(.*)/) + { + note $1; + } + elsif ($line =~ m/^\d+..\d+$/) + { + } + else + { + BAIL_OUT("no unmapped lines, got $line"); + } +} + +done_testing(); diff --git a/src/test/modules/test_escape/test_escape.c b/src/test/modules/test_escape/test_escape.c new file mode 100644 index 00000000000..6654ab1dbe7 --- /dev/null +++ b/src/test/modules/test_escape/test_escape.c @@ -0,0 +1,803 @@ +/* + * test_escape.c Test escape functions + * + * Copyright (c) 2022-2025, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_escape/test_escape.c + */ + +#include "postgres_fe.h" + +#include +#include + +#include "fe_utils/psqlscan.h" +#include "fe_utils/string_utils.h" +#include "getopt_long.h" +#include "libpq-fe.h" +#include "mb/pg_wchar.h" + + +typedef struct pe_test_config +{ + int verbosity; + bool force_unsupported; + const char *conninfo; + PGconn *conn; + + int test_count; + int failure_count; +} pe_test_config; + + +/* + * An escape function to be tested by this test. + */ +typedef struct pe_test_escape_func +{ + const char *name; + + /* + * Can the escape method report errors? If so, we validate that it does in + * case of various invalid inputs. + */ + bool reports_errors; + + /* + * Is the escape method known to not handle invalidly encoded input? If + * so, we don't run the test unless --force-unsupported is used. + */ + bool supports_only_valid; + + /* + * Is the escape method known to only handle encodings where no byte in a + * multi-byte characters are valid ascii. + */ + bool supports_only_ascii_overlap; + + bool (*escape) (PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err); +} pe_test_escape_func; + +/* + * A single test input for this test. + */ +typedef struct pe_test_vector +{ + const char *client_encoding; + size_t escape_len; + const char *escape; +} pe_test_vector; + + +/* + * Callback functions from flex lexer. Not currently used by the test. + */ +static const PsqlScanCallbacks test_scan_callbacks = { + NULL +}; + + +static bool +escape_literal(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + char *escaped; + + escaped = PQescapeLiteral(conn, unescaped, unescaped_len); + if (!escaped) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + appendPQExpBufferStr(target, escaped); + PQfreemem(escaped); + return true; + } +} + +static bool +escape_identifier(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + char *escaped; + + escaped = PQescapeIdentifier(conn, unescaped, unescaped_len); + if (!escaped) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + appendPQExpBufferStr(target, escaped); + PQfreemem(escaped); + return true; + } +} + +static bool +escape_string_conn(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + int error; + size_t sz; + + appendPQExpBufferChar(target, '\''); + enlargePQExpBuffer(target, unescaped_len * 2 + 1); + sz = PQescapeStringConn(conn, target->data + target->len, + unescaped, unescaped_len, + &error); + + target->len += sz; + appendPQExpBufferChar(target, '\''); + + if (error) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + return true; + } +} + +static bool +escape_string(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + size_t sz; + + appendPQExpBufferChar(target, '\''); + enlargePQExpBuffer(target, unescaped_len * 2 + 1); + sz = PQescapeString(target->data + target->len, + unescaped, unescaped_len); + target->len += sz; + appendPQExpBufferChar(target, '\''); + + + return true; +} + +/* + * Escape via s/'/''/. Non-core drivers invariably wrap libpq or use this + * method. It suffices iff the input passes encoding validation, so it's + * marked as supports_only_valid. + */ +static bool +escape_replace(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + const char *s = unescaped; + + appendPQExpBufferChar(target, '\''); + + for (int i = 0; i < unescaped_len; i++) + { + char c = *s; + + if (c == '\'') + { + appendPQExpBufferStr(target, "''"); + } + else + appendPQExpBufferChar(target, c); + s++; + } + appendPQExpBufferChar(target, '\''); + + return true; +} + +static bool +escape_append_literal(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + appendStringLiteral(target, unescaped, PQclientEncoding(conn), 1); + + return true; +} + +static bool +escape_fmt_id(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + setFmtEncoding(PQclientEncoding(conn)); + appendPQExpBufferStr(target, fmtId(unescaped)); + + return true; +} + +static pe_test_escape_func pe_test_escape_funcs[] = +{ + { + .name = "PQescapeLiteral", + .reports_errors = true, + .escape = escape_literal, + }, + { + .name = "PQescapeIdentifier", + .reports_errors = true, + .escape = escape_identifier + }, + { + .name = "PQescapeStringConn", + .reports_errors = true, + .escape = escape_string_conn + }, + { + .name = "PQescapeString", + .reports_errors = false, + .escape = escape_string + }, + { + .name = "replace", + .reports_errors = false, + .supports_only_valid = true, + .supports_only_ascii_overlap = true, + .escape = escape_replace + }, + { + .name = "appendStringLiteral", + .reports_errors = false, + .escape = escape_append_literal + }, + { + .name = "fmtId", + .reports_errors = false, + .escape = escape_fmt_id + }, +}; + + +#define TV(enc, string) {.client_encoding = (enc), .escape=string, .escape_len=sizeof(string) - 1, } +static pe_test_vector pe_test_vectors[] = +{ + /* expected to work sanity checks */ + TV("UTF-8", "1"), + TV("UTF-8", "'"), + TV("UTF-8", "\""), + + TV("UTF-8", "\'"), + TV("UTF-8", "\""), + + TV("UTF-8", "\\"), + + TV("UTF-8", "\\'"), + TV("UTF-8", "\\\""), + + /* trailing multi-byte character, paddable in available space */ + TV("UTF-8", "1\xC0"), + TV("UTF-8", "1\xE0 "), + TV("UTF-8", "1\xF0 "), + TV("UTF-8", "1\xF0 "), + TV("UTF-8", "1\xF0 "), + + /* trailing multi-byte character, not enough space to pad */ + TV("UTF-8", "1\xE0"), + TV("UTF-8", "1\xF0"), + TV("UTF-8", "\xF0"), + + /* try to smuggle in something in invalid characters */ + TV("UTF-8", "1\xE0'"), + TV("UTF-8", "1\xE0\""), + TV("UTF-8", "1\xF0'"), + TV("UTF-8", "1\xF0\""), + TV("UTF-8", "1\xF0'; "), + TV("UTF-8", "1\xF0\"; "), + TV("UTF-8", "1\xF0';;;;"), + TV("UTF-8", "1\xF0 ';;;;"), + TV("UTF-8", "1\xF0 \";;;;"), + TV("UTF-8", "1\xE0'; \\l ; "), + TV("UTF-8", "1\xE0\"; \\l ; "), + + /* null byte handling */ + TV("UTF-8", "some\0thing"), + TV("UTF-8", "some\0"), + TV("UTF-8", "some\xF0'\0"), + TV("UTF-8", "some\xF0'\0'"), + TV("UTF-8", "some\xF0" "ab\0'"), + + /* GB18030's 4 byte encoding requires a 2nd byte limited values */ + TV("GB18030", "\x90\x31"), + TV("GB18030", "\\\x81\x5c'"), + TV("GB18030", "\\\x81\x5c\""), + TV("GB18030", "\\\x81\x5c\0'"), + + /* + * \x81 indicates a 2 byte char. ' and " are not a valid second byte, but + * that requires encoding verification to know. E.g. replace_string() + * doesn't cope. + */ + TV("GB18030", "\\\x81';"), + TV("GB18030", "\\\x81\";"), + + /* + * \x81 indicates a 2 byte char. \ is a valid second character. + */ + TV("GB18030", "\\\x81\\';"), + TV("GB18030", "\\\x81\\\";"), + TV("GB18030", "\\\x81\0;"), + TV("GB18030", "\\\x81\0'"), + TV("GB18030", "\\\x81'\0"), + + TV("SJIS", "\xF0\x40;"), + + TV("SJIS", "\xF0';"), + TV("SJIS", "\xF0\";"), + TV("SJIS", "\xF0\0'"), + TV("SJIS", "\\\xF0\\';"), + TV("SJIS", "\\\xF0\\\";"), + + TV("gbk", "\x80';"), + TV("gbk", "\x80"), + TV("gbk", "\x80'"), + TV("gbk", "\x80\""), + TV("gbk", "\x80\\"), + + TV("mule_internal", "\\\x9c';\0;"), + + TV("sql_ascii", "1\xC0'"), +}; + + +/* + * Print the string into buf, making characters outside of plain ascii + * somewhat easier to recognize. + * + * The output format could stand to be improved significantly, it's not at all + * unambiguous. + */ +static void +escapify(PQExpBuffer buf, const char *str, size_t len) +{ + for (size_t i = 0; i < len; i++) + { + char c = *str; + + if (c == '\n') + appendPQExpBufferStr(buf, "\\n"); + else if (c == '\0') + appendPQExpBufferStr(buf, "\\0"); + else if (c < ' ' || c > '~') + appendPQExpBuffer(buf, "\\x%2x", (uint8_t) c); + else + appendPQExpBufferChar(buf, c); + str++; + } +} + +static void +report_result(pe_test_config *tc, + bool success, + PQExpBuffer testname, + PQExpBuffer details, + const char *subname, + const char *resultdesc) +{ + int test_id = ++tc->test_count; + bool print_details = true; + bool print_result = true; + + if (success) + { + if (tc->verbosity <= 0) + print_details = false; + if (tc->verbosity < 0) + print_result = false; + } + else + tc->failure_count++; + + if (print_details) + printf("%s", details->data); + + if (print_result) + printf("%s %d - %s: %s: %s\n", + success ? "ok" : "not ok", + test_id, testname->data, + subname, + resultdesc); +} + +/* + * Return true for encodings in which bytes in a multi-byte character look + * like valid ascii characters. + */ +static bool +encoding_conflicts_ascii(int encoding) +{ + /* + * We don't store this property directly anywhere, but whether an encoding + * is a client-only encoding is a good proxy. + */ + if (encoding > PG_ENCODING_BE_LAST) + return true; + return false; +} + +static const char * +scan_res_s(PsqlScanResult res) +{ +#define TOSTR_CASE(sym) case sym: return #sym + + switch (res) + { + TOSTR_CASE(PSCAN_SEMICOLON); + TOSTR_CASE(PSCAN_BACKSLASH); + TOSTR_CASE(PSCAN_INCOMPLETE); + TOSTR_CASE(PSCAN_EOL); + } + + pg_unreachable(); + return ""; /* silence compiler */ +} + +/* + * Verify that psql parses the input as a single statement. If this property + * is violated, the escape function does not effectively protect against + * smuggling in a second statement. + */ +static void +test_psql_parse(pe_test_config *tc, PQExpBuffer testname, + PQExpBuffer input_buf, PQExpBuffer details) +{ + PsqlScanState scan_state; + PsqlScanResult scan_result; + PQExpBuffer query_buf; + promptStatus_t prompt_status = PROMPT_READY; + int matches = 0; + bool test_fails; + const char *resdesc; + + query_buf = createPQExpBuffer(); + + scan_state = psql_scan_create(&test_scan_callbacks); + + /* + * TODO: This hardcodes standard conforming strings, it would be useful to + * test without as well. + */ + psql_scan_setup(scan_state, input_buf->data, input_buf->len, + PQclientEncoding(tc->conn), 1); + + do + { + resetPQExpBuffer(query_buf); + + scan_result = psql_scan(scan_state, query_buf, + &prompt_status); + + appendPQExpBuffer(details, + "#\t\t %d: scan_result: %s prompt: %u, query_buf: ", + matches, scan_res_s(scan_result), prompt_status); + escapify(details, query_buf->data, query_buf->len); + appendPQExpBuffer(details, "\n"); + + matches++; + } + while (scan_result != PSCAN_INCOMPLETE && scan_result != PSCAN_EOL); + + psql_scan_destroy(scan_state); + destroyPQExpBuffer(query_buf); + + test_fails = matches > 1 || scan_result != PSCAN_EOL; + + if (matches > 1) + resdesc = "more than one match"; + else if (scan_result != PSCAN_EOL) + resdesc = "unexpected end state"; + else + resdesc = "ok"; + + report_result(tc, !test_fails, testname, details, + "psql parse", + resdesc); +} + +static void +test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_test_escape_func *ef) +{ + PQExpBuffer testname; + PQExpBuffer details; + PQExpBuffer escape_buf; + PQExpBuffer escape_err; + size_t input_encoding_validlen; + bool input_encoding_valid; + size_t input_encoding0_validlen; + bool input_encoding0_valid; + bool escape_success; + size_t escape_encoding_length; + bool escape_encoding_valid; + + escape_err = createPQExpBuffer(); + testname = createPQExpBuffer(); + details = createPQExpBuffer(); + escape_buf = createPQExpBuffer(); + + if (ef->supports_only_ascii_overlap && + encoding_conflicts_ascii(PQclientEncoding(tc->conn))) + { + goto out; + } + + /* name to describe the test */ + appendPQExpBuffer(testname, ">"); + escapify(testname, tv->escape, tv->escape_len); + appendPQExpBuffer(testname, "< - %s - %s", + tv->client_encoding, ef->name); + + /* details to describe the test, to allow for debugging */ + appendPQExpBuffer(details, "#\t input: %zd bytes: ", + tv->escape_len); + escapify(details, tv->escape, tv->escape_len); + appendPQExpBufferStr(details, "\n"); + appendPQExpBuffer(details, "#\t encoding: %s\n", + tv->client_encoding); + + + /* check encoding of input, to compare with after the test */ + input_encoding_validlen = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + tv->escape, + tv->escape_len); + input_encoding_valid = input_encoding_validlen == tv->escape_len; + appendPQExpBuffer(details, "#\t input encoding valid: %d\n", + input_encoding_valid); + + input_encoding0_validlen = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + tv->escape, + strlen(tv->escape)); + input_encoding0_valid = input_encoding0_validlen == strlen(tv->escape); + appendPQExpBuffer(details, "#\t input encoding valid till 0: %d\n", + input_encoding0_valid); + + appendPQExpBuffer(details, "#\t escape func: %s\n", + ef->name); + + if (!input_encoding_valid && ef->supports_only_valid + && !tc->force_unsupported) + goto out; + + + /* call the to-be-tested escape function */ + escape_success = ef->escape(tc->conn, escape_buf, + tv->escape, tv->escape_len, + escape_err); + if (!escape_success) + { + appendPQExpBuffer(details, "#\t escape error: %s\n", + escape_err->data); + } + + if (escape_buf->len > 0) + { + appendPQExpBuffer(details, "#\t escaped string: %zd bytes: ", escape_buf->len); + escapify(details, escape_buf->data, escape_buf->len); + appendPQExpBufferChar(details, '\n'); + + escape_encoding_length = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + escape_buf->data, + escape_buf->len); + escape_encoding_valid = escape_encoding_length == escape_buf->len; + + appendPQExpBuffer(details, "#\t escape encoding valid: %d\n", + escape_encoding_valid); + } + else + { + escape_encoding_length = 0; + escape_encoding_valid = 1; + } + + /* + * If the test reports errors, and the input was invalidly encoded, + * escaping should fail. One edge-case that we accept for now is that the + * input could have an embedded null byte, which the escape functions will + * just treat as a shorter string. If the encoding error is after the zero + * byte, the output thus won't contain it. + */ + if (ef->reports_errors) + { + bool ok = true; + const char *resdesc = "ok"; + + if (escape_success) + { + if (!input_encoding0_valid) + { + ok = false; + resdesc = "invalid input escaped successfully"; + } + else if (!input_encoding_valid) + resdesc = "invalid input escaped successfully, due to zero byte"; + } + else + { + if (input_encoding0_valid) + { + ok = false; + resdesc = "valid input failed to escape"; + } + else if (input_encoding_valid) + resdesc = "valid input failed to escape, due to zero byte"; + } + + report_result(tc, ok, testname, details, + "input validity vs escape success", + resdesc); + } + + /* + * If the input is invalidly encoded, the output should also be invalidly + * encoded. We accept the same zero-byte edge case as above. + */ + { + bool ok = true; + const char *resdesc = "ok"; + + if (input_encoding0_valid && !input_encoding_valid && escape_encoding_valid) + { + resdesc = "invalid input produced valid output, due to zero byte"; + } + else if (input_encoding0_valid && !escape_encoding_valid) + { + ok = false; + resdesc = "valid input produced invalid output"; + } + else if (!input_encoding0_valid && + (!ef->reports_errors || escape_success) && + escape_encoding_valid) + { + ok = false; + resdesc = "invalid input produced valid output"; + } + + report_result(tc, ok, testname, details, + "input and escaped encoding validity", + resdesc); + } + + /* + * Test psql parsing whenever we get any string back, even if the escape + * function returned a failure. + */ + if (escape_buf->len > 0) + { + test_psql_parse(tc, testname, + escape_buf, details); + } + +out: + destroyPQExpBuffer(escape_err); + destroyPQExpBuffer(details); + destroyPQExpBuffer(testname); + destroyPQExpBuffer(escape_buf); +} + +static void +test_one_vector(pe_test_config *tc, const pe_test_vector *tv) +{ + if (PQsetClientEncoding(tc->conn, tv->client_encoding)) + { + fprintf(stderr, "failed to set encoding to %s:\n%s\n", + tv->client_encoding, PQerrorMessage(tc->conn)); + exit(1); + } + + for (int escoff = 0; escoff < lengthof(pe_test_escape_funcs); escoff++) + { + const pe_test_escape_func *ef = &pe_test_escape_funcs[escoff]; + + test_one_vector_escape(tc, tv, ef); + } +} + +static void +usage(const char *hint) +{ + if (hint) + fprintf(stderr, "Error: %s\n\n", hint); + + printf("PostgreSQL escape function test\n" + "\n" + "Usage:\n" + " test_escape --conninfo=CONNINFO [OPTIONS]\n" + "\n" + "Options:\n" + " -h, --help show this help\n" + " -c, --conninfo=CONNINFO connection information to use\n" + " -v, --verbose show test details even for successes\n" + " -q, --quiet only show failures\n" + " --force-unsupported test invalid input even if unsupported\n" + ); + + if (hint) + exit(1); +} + +int +main(int argc, char *argv[]) +{ + pe_test_config tc = {0}; + char c; + int option_index; + + static const struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {"conninfo", required_argument, NULL, 'c'}, + {"verbose", no_argument, NULL, 'v'}, + {"quiet", no_argument, NULL, 'q'}, + {"force-unsupported", no_argument, NULL, 'f'}, + {NULL, 0, NULL, 0}, + }; + + while ((c = getopt_long(argc, argv, "vqh", long_options, &option_index)) != -1) + { + switch (c) + { + case 'h': + usage(NULL); + exit(0); + break; + case 'c': + tc.conninfo = optarg; + break; + case 'v': + tc.verbosity++; + break; + case 'q': + tc.verbosity--; + break; + case 'f': + tc.force_unsupported = true; + break; + } + } + + if (argc - optind >= 1) + usage("unused option(s) specified"); + + if (tc.conninfo == NULL) + usage("--conninfo needs to be specified"); + + tc.conn = PQconnectdb(tc.conninfo); + + if (!tc.conn || PQstatus(tc.conn) != CONNECTION_OK) + { + fprintf(stderr, "could not connect: %s\n", + PQerrorMessage(tc.conn)); + exit(1); + } + + for (int i = 0; i < lengthof(pe_test_vectors); i++) + { + test_one_vector(&tc, &pe_test_vectors[i]); + } + + PQfinish(tc.conn); + + printf("# %d failures\n", tc.failure_count); + printf("1..%d\n", tc.test_count); + return tc.failure_count > 0; +} diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index bb725ad8d2c..e224f8d7480 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -50,7 +50,7 @@ my @contrib_excludes = ( 'sepgsql', 'brin', 'test_extensions', 'test_misc', 'test_pg_dump', 'snapshot_too_old', - 'unsafe_tests'); + 'unsafe_tests', 'test_escape'); # Set of variables for frontend modules my $frontend_defines = { 'pgbench' => 'FD_SETSIZE=1024' }; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 98f678b7607..a51888802ae 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3516,6 +3516,9 @@ parallel_worker_main_type parse_error_callback_arg parser_context partition_method_t +pe_test_config +pe_test_escape_func +pe_test_vector pendingPosition pgParameterStatus pg_atomic_flag From 16ce519533bd03db726953db2364877a8944da4c Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 10:03:39 -0500 Subject: [PATCH 115/119] docs: EUC_TW can be up to four bytes wide, not three Backpatch-through: 13 Security: CVE-2025-1094 --- doc/src/sgml/charset.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index 9242ba64c36..3629cd12b68 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -1745,7 +1745,7 @@ ORDER BY c COLLATE ebcdic; Traditional Chinese, Taiwanese Yes Yes - 1–3 + 1–4 From 41343f84052eb53a900ea464a8ce16a548cab901 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 10 Feb 2025 12:09:23 -0500 Subject: [PATCH 116/119] Fix type in test_escape test On machines where char is unsigned this could lead to option parsing looping endlessly. It's also too narrow a type on other hardware. Found via Tom Lane's monitoring of the buildfarm. Reported-by: Tom Lane Security: CVE-2025-1094 Backpatch-through: 13 --- src/test/modules/test_escape/test_escape.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/modules/test_escape/test_escape.c b/src/test/modules/test_escape/test_escape.c index 6654ab1dbe7..3ed70436155 100644 --- a/src/test/modules/test_escape/test_escape.c +++ b/src/test/modules/test_escape/test_escape.c @@ -740,7 +740,7 @@ int main(int argc, char *argv[]) { pe_test_config tc = {0}; - char c; + int c; int option_index; static const struct option long_options[] = { From 0075a5c6ce5bb6f3ee005a54cd5b518f16659655 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 10 Feb 2025 16:30:03 -0500 Subject: [PATCH 117/119] Adapt appendPsqlMetaConnect() to the new fmtId() encoding expectations. We need to tell fmtId() what encoding to assume, but this function doesn't know that. Fortunately we can fix that without changing the function's API, because we can just use SQL_ASCII. That's because database names in connection requests are effectively binary not text: no encoding-aware processing will happen on them. This fixes XversionUpgrade failures seen in the buildfarm. The alternative of having pg_upgrade use setFmtEncoding() is unappetizing, given that it's connecting to multiple databases that may have different encodings. Andres Freund, Noah Misch, Tom Lane Security: CVE-2025-1094 --- src/fe_utils/string_utils.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 75b4f777db5..c6e2770e917 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -790,29 +790,38 @@ appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname) } } - appendPQExpBufferStr(buf, "\\connect "); if (complex) { PQExpBufferData connstr; initPQExpBuffer(&connstr); + + /* + * Force the target psql's encoding to SQL_ASCII. We don't really + * know the encoding of the database name, and it doesn't matter as + * long as psql will forward it to the server unchanged. + */ + appendPQExpBufferStr(buf, "\\encoding SQL_ASCII\n"); + appendPQExpBufferStr(buf, "\\connect -reuse-previous=on "); + appendPQExpBufferStr(&connstr, "dbname="); appendConnStrVal(&connstr, dbname); - appendPQExpBufferStr(buf, "-reuse-previous=on "); - /* * As long as the name does not contain a newline, SQL identifier * quoting satisfies the psql meta-command parser. Prefer not to * involve psql-interpreted single quotes, which behaved differently * before PostgreSQL 9.2. */ - appendPQExpBufferStr(buf, fmtId(connstr.data)); + appendPQExpBufferStr(buf, fmtIdEnc(connstr.data, PG_SQL_ASCII)); termPQExpBuffer(&connstr); } else - appendPQExpBufferStr(buf, fmtId(dbname)); + { + appendPQExpBufferStr(buf, "\\connect "); + appendPQExpBufferStr(buf, fmtIdEnc(dbname, PG_SQL_ASCII)); + } appendPQExpBufferChar(buf, '\n'); } From 7e06ffbc6230a6f3e4cdc7599a5617d081d611f7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 10 Feb 2025 18:16:25 -0500 Subject: [PATCH 118/119] Last-minute updates for release notes. Security: CVE-2025-1094 --- doc/src/sgml/release-16.sgml | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml index 470761bd411..c729f3d313c 100644 --- a/doc/src/sgml/release-16.sgml +++ b/doc/src/sgml/release-16.sgml @@ -35,6 +35,102 @@ + + Harden PQescapeString and allied functions + against invalidly-encoded input strings (Andres Freund, Noah Misch) + § + § + § + § + § + § + + + + Data-quoting functions supplied by libpq + now fully check the encoding validity of their input. If invalid + characters are detected, they report an error if possible. For the + ones that lack an error return convention, the output string is + adjusted to ensure that the server will report invalid encoding and + no intervening processing will be fooled by bytes that might happen + to match single quote, backslash, etc. + + + + The purpose of this change is to guard against SQL-injection attacks + that are possible if one of these functions is used to quote crafted + input. There is no hazard when the resulting string is sent + directly to a PostgreSQL server (which + would check its encoding anyway), but there is a risk when it is + passed through psql or other client-side + code. Historically such code has not carefully vetted encoding, and + in many cases it's not clear what it should do if it did detect such + a problem. + + + + This fix is effective only if the data-quoting function, the server, + and any intermediate processing agree on the character encoding + that's being used. Applications that insert untrusted input into + SQL commands should take special care to ensure that that's true. + + + + Applications and drivers that quote untrusted input without using + these libpq functions may be at risk of + similar problems. They should first confirm the data is valid in + the encoding expected by the server. + + + + The PostgreSQL Project thanks + Stephen Fewer for reporting this problem. + (CVE-2025-1094) + + + + +